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服務的,如果想配置所有的默認配置,那麼單獨配置就好了, 看看官網或者別的博客...我就不記筆記了。。。)