一、什麼是Ribbon: Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟體負載均衡演算法。 將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)後面所有的機器, ...
一、什麼是Ribbon:
Ribbon是Netflix發佈的開源項目,主要功能是提供客戶端的軟體負載均衡演算法。
將Netflix的中間層服務連接在一起。Ribbon客戶端組件提供一系列完善的配置項如連接超時,重試等。簡單的說,就是在配置文件中列出Load Balancer(簡稱LB)後面所有的機器,Ribbon會自動的幫助你基於某種規則(如簡單輪詢,隨即連接等)去連接這些機器。我們也很容易使用Ribbon實現自定義的負載均衡演算法。
- 負載均衡
- 容錯
- 多協議(HTTP,TCP,UDP)支持非同步和反應模型
- 緩存和批處理
二、Eureka服務提供者集群
先啟動上篇文章中的註冊中心eureka-server:8001, 以及hello-service:8011,接著修改hello-service項目配置文件中的埠,改成8012,再次運行用戶服務項目。
執行成功,查看Eureka註冊中心,可以看到有用戶服務應用有兩個埠對應。
(如果是IDEA用戶,需要修改Application.java的執行方式,預設是單實例運行,所以你在運行8011的項目,修改埠無法再次運行。)
三、RestTemplate+Ribbon消費者: 新建一個maven服務
pom.xml:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-ribbon</artifactId>
</dependency>
application.properties:
spring.application.name=hello-consumer-ribbon server.port=8021 eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/spring.application.name=hello-consumer-ribbon server.port=8021 eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
啟動類:
package cn.demo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.context.annotation.Bean; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient @RestController public class HelloConsumerRibbonApplication { public static void main(String[] args) { SpringApplication.run(HelloConsumerRibbonApplication.class, args); } @Bean @LoadBalanced public RestTemplate restTemplate () { return new RestTemplate(); } @Autowired private RestTemplate restTemplate; //獲取服務實例,作用為之後console顯示效果;"http://USER-SERVICE/hello?name= 標識註冊的服務。USER-SERVICE在eureka註冊的服務名 @RequestMapping("hello") public ResponseEntity<String> hello (String name) { return restTemplate.getForEntity("http://USER-SERVICE/hello?name=" + name, String.class); } }
四、測試
測試服務消費
http://localhost:8021/hello?name=ribbon
測試負載均衡:
我們在hello-service hello方法中加上日誌列印,然後再分別啟動 hello-service:8012,8002,然後多次訪問 http://localhost:8021/hello?name=ribbon,可以看到兩個hello-service項目的控制台都有日誌輸出,表示實現了負載均衡。
使用RestTemplate+Ribbon必須指定調用服務名稱,如上面的HELLO-SERVICE,為了方便使用,SpringCloud還集成了Feign消費方式。
————————————————