Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
Zuul + Ribbon 脱离Eureka完成负载均衡+重试机制
因为没有注册中心,所以需要网关对下游服务做负载均衡,然后果断集成Ribbon。中间遇到很多坑,最后终于解决了。
其实Ribbon里面默认开启了重试机制的。
Zuul配合Ribbon的代码展示:
如果希望最后的映射路由有前缀/test ,那么需要加上strip-prefix=false,因为默认是true。
zuul.routes.test.path=/test/** zuul.routes.test.strip-prefix=false zuul.routes.test.serviceId=test test.ribbon.listOfServers=http://192.168.10.161:9001,http://192.168.10.162:9001
关于重试的其他配置:
ribbon.MaxAutoRetries=1 # 对当前实例的重试次数 ribbon.MaxAutoRetriesNextServer=10 # 切换实例的重试次数 ribbon.ConnecTimeOut=3000 # 请求的连接时间 ribbon.OkToRetryOnAllOperations=true # 对所有操作都进行重试
备注: 上述是对所有进行配置,如果需要对某个服务,则可以在前面加上服务名称。例如上述的test服务,则是test.ribbon.MaxAutoRetries=xxx
RestTemplate配合Ribbon
第一步:
在RestTemplate的Bean上加注解@LoadBalance 就结束了。
@Configuration public class RestConfiguration { @Autowired RestTemplateBuilder builder; @LoadBalanced @Bean public RestTemplate restTemplate() { return builder.build(); } }
利用RestTemplate发送请求,达到负载均衡和重试效果。
public HttpResult verifyToken(String token, String ip) { JSONObject result = restTemplate.getForObject("http://test/" + "token/verify/{token}/{ip}", JSONObject.class, token, ip); HttpResult httpResult = JSON.parseObject(result.toJSONString(), HttpResult.class); return httpResult; }
url中间的host+port被替换成了额服务名称,(可以是注册中心注册的服务名,也可以是自定义的,比如咱们这个脱离Eureka的就是自定义的,开头有配置。),它会根据test这个服务名,找配置中的listServers根据负载均衡策略和配置好的重试配置,来进行负载均衡和失败重试。
关于负载均衡策略
1. 首先配置某个服务实例的负载均衡策略(注意,这个类不能被Componscan扫描到,否则会被所有的配置共享,比如我就是加了个自定义注解@IngoreComponentScan,然后配置了不扫描这个注解所在的类)
@Configuration @IgnoreComponentScan public class TestRibbonConfiguration { @Bean public IRule ribbonRule() { return new RoundRobinRule(); } }
2.然后配置一个Ribbon客户端,服务名写你想配置的服务名,配置类自然就是刚刚配置的配置类。
@Configuration @RibbonClient(name = "test", configuration = TestRibbonConfiguration.class) public class RibbonConfiguration { }
这样Ribbon的负载均衡策略就OK了(仅仅是针对test服务的,如果想配置所有的默认配置,那么单独配置就好了, 看看官网或者别的博客...我就不记笔记了。。。)