SpringCloud系列七:使用Ribbon實現客戶端側負載均衡

1. 回顧web

  在前面,已經實現了微服務的註冊與發現。啓動各個微服務時,Eureka Client會把本身的網絡信息註冊到Eureka Server上。算法

  可是,在生成環境中,各個微服務都會部署多個實例,所以還行繼續進行優化。spring

2. Ribbon簡介網絡

  Ribbon是Netflix發佈的負載均衡器,它有助於控制HTTP和TCP客戶端的行爲。爲Ribbon配置服務提供者地址列表後,Ribbon就可基於某種負載均衡算法,架構

  自動地幫助服務消費者去請求。Ribbon默認爲咱們提供了不少的負載均衡算法,例如輪詢、隨機等。咱們也可爲Ribbon實現自定義的負載均衡算法。app

 

  在Spring Cloud中,當Ribbon與Eureka配合使用時,Ribbon可自動從Eureka Server獲取服務提供者地址列表,並基於負載均衡算法,請求其中一個服務提供者實例。負載均衡

3. 爲服務消費者整合Ribbonide

  > 複製項目 microservice-consumer-movice,修改ArtifactId爲 microservice-consumer-movie-ribbon微服務

  > 爲項目microservice-consumer-movie添加Ribbon的依賴。可是前文已經爲該服務添加spring-cloud-starter-netflix-eureka-client依賴,優化

    該依賴已經包含了 spring-cloud-starter-netflix-ribbon 依賴,因此無需再次引入。

  > 在啓動類中,爲RestTemplate添加@LoadBalanced註解。

package com.itmuch.cloud.microserviceconsumermovie; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.client.loadbalancer.LoadBalanced; import org.springframework.context.annotation.Bean; import org.springframework.web.client.RestTemplate; @SpringBootApplication @EnableDiscoveryClient public class MicroserviceConsumerMovieApplication { public static void main(String[] args) { SpringApplication.run(MicroserviceConsumerMovieApplication.class, args); } @Bean @LoadBalanced // 實現負載均衡
    public RestTemplate restTemplate() { return new RestTemplate(); } }

  > 修改MovieController類,便於發現是否實現負載均衡

package com.itmuch.cloud.microserviceconsumermovie.controller; import com.itmuch.cloud.microserviceconsumermovie.pojo.User; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.cloud.client.ServiceInstance; import org.springframework.cloud.client.loadbalancer.LoadBalancerClient; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class MovieController { private static final Logger LOGGER = LoggerFactory.getLogger(MovieController.class); @Autowired private RestTemplate restTemplate; @Autowired private LoadBalancerClient loadBalancerClient; @GetMapping("/user/{id}") public User findById(@PathVariable Long id) { return this.restTemplate.getForObject("http://microservice-provider-user/" + id, User.class); } @GetMapping("/log-instance") public void logUserInstance() { ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider-user"); // 打印當前選擇的是哪一個節點
        MovieController.LOGGER.info("{}:{}:{}", serviceInstance.getServiceId(), serviceInstance.getHost(), serviceInstance.getPort()); } }

  > 啓動 microservice-discovery-eureka

  > 啓動兩個以上的 microservice-provider-user 實例(啓動前檢查application.yml,spring.jpa.hibernate.ddl-auto值爲update,不然不能自動建立表結構;

    檢查eureka.client.service-url.defaultZone的值是否爲註冊中心的url

  > 啓動 microservice-consumer-movie-ribbon

  > 訪問 http://localhost:8761

 

  > 屢次訪問 http://localhost:8010/user/1

    而且,在多個 microservice-provider-user 實例中都會打印以下日誌:

    代表:Ribbon成功的將請求負載到不一樣的實例上了

  > 屢次訪問 http://localhost:8010/log-instance ,在 microservice-consumer-movie 項目的日誌中可發現以下日誌:

    代表:Ribbon成功的將請求負載到不一樣的實例上了

 4. 總結

  本文已經實現了用Ribbon實現客戶端的負載均衡。

  下次將講解自定義Ribbon配置,敬請期待~~~

5. 參考

  周立 --- 《Spring Cloud與Docker微服務架構與實戰》

相關文章
相關標籤/搜索