Spring Cloud實戰04-- 負載均衡Ribbon

負載均衡Ribbon

實際環境中,我們往往會開啓很多個bubbletg-provider的集羣。此時我們獲取的服務列表中就會有多個,到底該訪問哪一個呢?

一般這種情況下我們就需要編寫負載均衡算法,在多個實例列表中進行選擇。

不過Eureka中已經幫我們集成了負載均衡組件:Ribbon,簡單修改代碼即可使用。

在這裏插入圖片描述

啓動兩個服務實例

在這裏插入圖片描述
Eureka監控面板:
在這裏插入圖片描述

開啓負載均衡

因爲Eureka中已經集成了Ribbon,所以我們無需引入新的依賴,直接修改代碼。

修改bubbletg-consumer的引導類,在RestTemplate的配置方法上添加@LoadBalanced註解:

@Bean
@LoadBalanced
public RestTemplate restTemplate() {
    return new RestTemplate();
}

在這裏插入圖片描述修改調用方式,不再手動獲取ip和端口,而是直接通過服務名稱調用:

@Controller
@RequestMapping("consumer/user")
public class UserController {

    @Autowired
    private RestTemplate restTemplate;

    //@Autowired
    //private DiscoveryClient discoveryClient; // 注入discoveryClient,通過該客戶端獲取服務列表

    @GetMapping
    @ResponseBody
    public User queryUserById(@RequestParam("id") Long id){
        // 通過client獲取服務提供方的服務列表,這裏我們只有一個
        // ServiceInstance instance = discoveryClient.getInstances("service-provider").get(0);
        String baseUrl = "http://service-provider/user/" + id;
        User user = this.restTemplate.getForObject(baseUrl, User.class);
        return user;
    }

}

訪問頁面,查看結果:

在這裏插入圖片描述

負載均衡策略

Ribbon默認的負載均衡策略是簡單的輪詢,我們可以測試一下:

package cn.bubbletg.service;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient;
import org.springframework.test.context.junit4.SpringRunner;

/**
 * @author www.bubbletg.cn * BubbleTg
 * @version 1.0
 * @date 2019/8/24 1:00
 */
@RunWith(SpringRunner.class)
@SpringBootTest(classes = ServiceConsumerApplication.class)
public class LoadBalanceTest {

    @Autowired
    private RibbonLoadBalancerClient client;

    @Test
    public void testLoadBalance(){
        for (int i = 0; i < 100; i++) {
            ServiceInstance instance = this.client.choose("service-provider");
            System.out.println(instance.getHost() + ":" +instance.getPort());
        }
    }
}

在這裏插入圖片描述
我們是否可以修改負載均衡的策略呢?
在這裏插入圖片描述
在這裏插入圖片描述在這裏插入圖片描述在這裏插入圖片描述SpringBoot也幫我們提供了修改負載均衡規則的配置入口,在bubbletg-consumer的application.yml中添加如下配置:

server:
  port: 80
spring:
  application:
    name: service-consumer
eureka:
  client:
    service-url:
      defaultZone: http://127.0.0.1:10086/eureka
service-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule

格式是:{服務名稱}.ribbon.NFLoadBalancerRuleClassName,值就是IRule的實現類。

再次測試:,發現結果變成了隨機:
在這裏插入圖片描述

以上即是負載均衡實戰了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章