springCloud入門學習(六):使用Ribbon實現負載均衡

在以前,我使用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

image.png

註冊中心這裏引入了兩個user實例

此時訪問 http://localhost:8020/movie/findById?userId=1,而且屢次訪問

image.png

獲取到結果,說明訪問成功。

再來看user的控制檯:

image.png

另外一臺端口號爲8011的服務也出現了一樣的打印信息,說明Ribbon均勻的將請求分配到兩個實例中,實現了負載均衡

相關文章
相關標籤/搜索