Ribbon 是一個客戶端的負載均衡解決方案實現。它提供了咱們不少已經實現好的負載方案,咱們能夠直接拿來用,或者自定義本身的負載均衡規則。Ribbon客戶端在啓動的時候會從Eureka Server端獲取它須要調用服務的列表,而且作緩存,因此在Ribbon客戶端啓動之後,即便Eureka服務出現問題或者停掉,只要調用的服務沒有問題,仍是能夠保證客戶端的正常調用,這樣作主要是爲了保證CAP中的Availability。spring
這裏咱們爲了演示輪詢的負載均衡方案,咱們須要啓動兩個服務的provider,設置不一樣的端口,下面咱們經過 Active profiles 來啓動服務,配置以下:緩存
application-7011.yml服務器
spring:
application:
name: provider-service
server:
port: 7011
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/
application-7012.yml併發
spring:
application:
name: provider-service
server:
port: 7012
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/
在啓動Application類中添加註解 @EnableDiscoveryClient,而後咱們添加一個測試的Controllers類,代碼以下:app
@RestController public class RibbonTest { @Autowired ApplicationContext applicationContext; @RequestMapping(value = "/provider/ribbon/printLog", method = RequestMethod.GET) public String printLog() throws UnknownHostException { String IPAddress = InetAddress.getLocalHost().getHostAddress(); String port = applicationContext.getEnvironment().getProperty("local.server.port"); return "Hello Provider ".concat(IPAddress).concat(":").concat(port); } }
至此,咱們的provider service配置好了,接下來咱們來配置 consumer service,首先咱們須要在 pom.xml 添加 ribbon 依賴:負載均衡
pom.xmldom
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> </dependency>
application.ymlide
spring:
application:
name: consumer-service
server:
port: 7021
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://eureka01:7001/eureka/,http://eureka02:7002/eureka/,http://eureka03:7003/eureka/
添加 Ribbon 的配置類:性能
@Configuration // 若是多個服務能夠選擇不一樣的策略 /*@RibbonClients({ @RibbonClient(name = "other",configuration = OtherConfig.class), @RibbonClient(name = "provider",configuration = ProviderConfig.class) })*/ @RibbonClient(name = "provider-service") public class RibbonConfig { //定義負載均衡規則 @Bean public IRule ribbonRule(){ return new RoundRobinRule(); } @Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } }
這裏咱們主要介紹一下 Irule:測試
RoundRobinRule:輪詢規則
RandomRule:隨機規則
WeightedResponseTimeRule:使用響應時間的平均或者百分比爲每一個服務分配權重的規則,若是無法收集響應時間信息,會默認使用輪詢規則
BestAvailableRule:會先根據斷路器過濾掉處於故障的服務,而後選擇併發量最小的服務
ZoneAvoidanceRule:根據server所在Zone和其性能,選擇服務器,默認規則
AvailabilityFilteringRule:先根據斷路器規則過濾掉有問題的服務,而後對剩餘的服務按照輪詢的策略進行訪問
RetryRule:先按照RoundRobinRule規則進行服務獲取,若是調用服務失敗會在指定時間內進行重試,直到獲取到可用的服務。
Consumer service的Controller演示類:
@RestController public class RibbonTest { @Autowired private RestTemplate restTemplate; @GetMapping(value = "/consumer/ribbon/printLog") public String printProviderLog(){ String result = restTemplate.getForObject("http://provider-service/provider/ribbon/printLog", String.class); return result; } }
此時咱們首先啓動的的Eureka服務,而後經過Active Profiles啓動兩個不一樣端口的provider service,最後啓動咱們的consumer service,而後訪問 http://localhost:7021/consumer/ribbon/printLog ,而後不斷刷新,咱們會看到端口7011和7012的不斷變化。