在以前,我使用ip+端口來訪問服務提供者。但通常來講,在生產環境中,一般一個服務會有多個實例。那麼服務消費者應該如何將請求分攤到多個服務提供者呢?
java
1、Ribbon算法
Ribbon是Netflix發佈的負載均衡其。當咱們爲Ribbon配置服務提供者的地址列表後,Ribbon就可基於某種負載均衡的算法,自動幫助服務消費者請求。
spring
2、Ribbon與Eureka配合使用網絡
Riboon會自動從Eureka獲取服務提供者的服務列表,而後經過負載均衡算法請求其中的一個實例。app
3、整合Riboon負載均衡
一、修改movie項目,因爲已經介入了spring-cloud-starter-eureka包,沒必要再次引入Ribbon的包,Ribbon單獨依賴:ide
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-ribbon</artifactId> </dependency>
二、修改啓動類,爲RestTemplate添加註解微服務
@Bean @LoadBalanced public RestTemplate restTemplate() { return new RestTemplate(); }
三、修改controller,以前咱們是使用ip+端口的方式進行訪問的,這裏將 ip+端口 改成咱們要調動的微服務的serviceId,即服務提供者的spring.application.name字段,這樣,Eureka會自動將虛擬主機名英社稱微服務的網絡地址。若是咱們依然經過 ip+端口號 的方式進行訪問,實際上咱們只能訪問其中的一個實例,並無作到真正的負載均衡。
this
@RequestMapping(value = "/movie/findById", method = RequestMethod.GET) public Map findById(Integer userId) { log.info("/movie/findById被訪問,參數:userId=" + userId); /*ResponseEntity<HashMap> forEntity = this.restTemplate.getForEntity(findByUserIdUrl + userId, HashMap.class);*/ return this.restTemplate.getForObject("http://user/user/getUserInfo?userId=" + userId, HashMap.class); }
此時啓動movie和eureka項目,同時啓動多個user項目rest
註冊中心這裏引入了兩個user實例
此時訪問 http://localhost:8020/movie/findById?userId=1,而且屢次訪問
獲取到結果,說明訪問成功。
再來看user的控制檯:
另外一臺端口號爲8011的服務也出現了一樣的打印信息,說明Ribbon均勻的將請求分配到兩個實例中,實現了負載均衡