Ribbon 是一個客戶端負載均衡器(Nginx 爲服務端負載均衡),它賦予了應用一些支配 HTTP 與 TCP 行爲的能力,能夠得知,這裏的客戶端負載均衡也是進程內負載均衡的一種。它在 Spring Cloud 生態內是一個不可缺乏的組件,少了它,服務便不能橫向擴展,這顯然是有違雲原生12要素的。此外 Feign 與 Zuul 中已經默認集成了 Ribbon,在咱們的服務之間凡是涉及調用的,均可以集成它並應用,從而使咱們的調用鏈具有良好的伸縮性。
附帶拓展福利,雲原生12要素:https://12factor.net/zh_cn/git
Ribbon是Netflix公司開源的一個負載均衡的項目,它屬於上述的第二種,是一個客戶端負載均衡器,運行在客戶端上。它是一個通過了雲端測試的IPC庫,能夠很好地控制HTTP和TCP客戶端的一些行爲。 Feign已經默認使用了Ribbon。github
ribbon:https://github.com/Netflix/ribbonspring
@RestController @RequestMapping(value = "/Promotion",method = RequestMethod.GET) public class PromotionController implements PromotionFacade { @Value("${server.port}") String port; @Value("${spring.profiles.active}") String environment; @Override @RequestMapping(value = "/delete") public String releasePromotion(@RequestParam int orderID){ try { if ("local".equals(environment)) { Thread.sleep(200L); } return port; } catch (Exception ex) { return port+"---"+ex.getMessage(); } } }
註冊服務以下 緩存
上述trade-promotion服務,有2個站點部署,feign調用他們以下。網絡
@FeignClient(name = "trade-promotion") public interface PromotionClient { @RequestMapping(value = "/Promotion/delete", method = RequestMethod.GET) String releasePromotion(@RequestParam int orderID); }
默認狀況下,調用結果是:8085,8082,8085,8082,8085,8082,8085,8082... 這樣輪詢調用執行。併發
緣由就是默認集成啦Ribbon,能夠經過spring-cloud-starter-openfeign這個依賴看下他的父依賴中,就有spring-cloud-starter-netflix-ribbon這個包的依賴。app
默認爲輪詢策略負載均衡
@Configuration public class RibbonConfig { /** * 隨機規則 */ @Bean public IRule ribbonRule() { return new RetryRule(); } }
#trade-promotion:這個是eureka中的被調用的服務名稱
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
note:第一個new的對象與上面的輪詢規則匹配,第二個配置文件最後的詞語也是與輪詢規則匹配dom
針對單個服務的重試與超時配置:異步
#負載均衡策略
trade-promotion.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
#http創建socket超時時間,毫秒
trade-promotion.ribbon.ConnectTimeout=2000
#http讀取響應socket超時時間
trade-promotion.ribbon.ReadTimeout=5000
#同一臺實例最大重試次數,不包括首次調用
trade-promotion.ribbon.MaxAutoRetries=0
#重試負載均衡其餘的實例最大重試次數,不包括首次server
trade-promotion.ribbon.MaxAutoRetriesNextServer=2
# 是否全部操做都重試,POST請求注意屢次提交錯誤。
# 默認false,設定爲false的話,只有get請求會重試
trade-promotion.ribbon.OkToRetryOnAllOperations=true
全局服務的重試與超時配置
#http創建socket超時時間,毫秒
ribbon.ConnectTimeout=2000
#http讀取響應socket超時時間
ribbon.ReadTimeout=5000
#同一臺實例最大重試次數,不包括首次調用
ribbon.MaxAutoRetries=0
#重試負載均衡其餘的實例最大重試次數,不包括首次server
ribbon.MaxAutoRetriesNextServer=2
# 是否全部操做都重試,POST請求注意屢次提交錯誤。
# 默認false,設定爲false的話,只有get請求會重試
ribbon.OkToRetryOnAllOperations=true
ribbon.eureka.enabled=false
trade-promotion.ribbon.listOfServers:http://localhost:8085,http://localhost:8082
ribbon.eager-load.enabled=true
ribbon.eager-load.clients=trade-promotion,trade-order
多看文檔,多翻資料