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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章