1. 程式人生 > 實用技巧 >Spring Cloud微服務的客戶端負載均衡元件Ribbon

Spring Cloud微服務的客戶端負載均衡元件Ribbon

目錄

  1. 背景

  2. ribbon客戶端負載均衡

  3. 負載均衡驗證

一、背景

  上一篇提到eureka服務消費者請求服務使用spring的restTemplate進行分散式系統中的介面訪問,實際生產中,提供介面服務的往往是一個eureka服務叢集;如何在服務叢集選擇合適的服務節點訪問,這裡就涉及到了負載均衡的概念。

負載均衡的作用:

  • 提高對系統的高可用,
  • 緩解網路壓力
  • 處理能力擴容

負載均衡演算法有

  • 輪詢(預設)
  • 權重分配
  • 流量負載等

  負載均衡包括服務端負載均衡和客戶端負載均衡,服務端負載均衡又包括硬體負載均衡和軟體負載均衡。硬體負載均衡主要是通過在伺服器節點之間安裝專門用於負載均衡的裝置,如F5等;而軟體負載均衡則通過在伺服器上安裝均有負載均衡功能的軟體來來完成請求分發工作,如Nginx等。

  客戶端負載均衡和服務端負載均衡不同在服務清單所儲存的位置,客戶端負載均衡中客戶端維護者自己要訪問的服務清單,這些清單來源於註冊中心,需要心跳取維護服務端清單的健康性。通過Spring Ribbon的封裝,在為微服務中使用客戶端負載均衡非常簡單

二、eureka服務消費者搭建

  開發工具:idea

  1、File---> New ---> Project---->spring Initialzr  

2、填寫專案包名、專案名,繼續NEXT

3、選中Discovery Client和web模組,還有ribbon模組、Next-->(選擇專案目錄)Finish

4、專案生成後目錄結構如下,其中controller、service、api為新建的包,其他檔案及目錄是預設生成的

5、我們來看看pom.xml

 1  <dependency>
 2             <groupId>org.springframework.boot</groupId>
 3             <artifactId>spring-boot-starter-web</artifactId>
 4  </dependency>
 5  <dependency>
 6             <groupId>org.springframework.cloud</groupId>
 7
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> 8 </dependency> 9 <dependency> 10 <groupId>org.springframework.cloud</groupId> 11 <artifactId>spring-cloud-starter-netflix-ribbon</artifactId> 12 </dependency>

6、啟動類加上EnableDiscoveryClient註解,自動化配置為服務治理的客戶端

  通過loadBalanced註解來自動化配置restTemple的請求負載均衡,預設輪詢。

@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClientApplication {

    public static void main(String[] args) {
        SpringApplication.run(EurekaClientApplication.class, args);
    }

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

7、application.properities配置

server.port=8089
spring.application.name=eureka-ribbon
eureka.instance.hostname=localhost
eureka.client.serviceUrl.defaultZone=http://admin:123456@localhost:1111/eureka/
#IP進行註冊
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
eureka.instance.preferIpAddress=true
ribbon.eureka.enabled=true
# 請求連線的超時時間
ribbon.ConnectTimeout=2000
# 請求處理的超時時間
ribbon.ReadTimeout=5000
# 最大連線數
ribbon.MaxTotalConnections=500
# 每個host最大連線數
ribbon.MaxConnectionsPerHost=500

8、Controller提供服務請求入口,處理引數。

 1 @RestController
 2 public class SysController {
 3 
 4     @Autowired
 5     SysService sysService;
 6 
 7     @ResponseBody
 8     @RequestMapping("/hi")
 9     public String greetService(@RequestParam("service_name")String service_name){
10         return sysService.hiService(service_name);
11     }
12 }

service用於編寫業務程式碼:

eureka-client為服務例項,
@Service
public class SysService {

    @Autowired
    RestTemplate restTemplate;

    public String hiService(String service_name){
        return restTemplate.getForObject("http://eureka-client/demo?name="+service_name,String.class);
    }

}

9、點選以下圖示啟動服務

出現以下日誌程式碼啟動成功

10、訪問註冊中心localhost:1111,如圖就是我們的例項

三、負載均衡驗證

  1. 啟動註冊中心叢集、
  2. 啟動eureka服務提供者叢集(eureka-client和eureka-client2)
    1. eureka-client節點提供服務如下:
      1. @RestController
        public class DemoController {
        
            private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
        
        
                @RequestMapping(value = "/demo")
            public String index(@RequestParam("name") String demo_name){
                return "Hello world|| I'm "+demo_name;
            }
        
        }

      2. eureka-client2節點提供服務如下:
        1. @RestController
          public class DemoController {
          
              private static final Logger logger = LoggerFactory.getLogger(DemoController.class);
          
          
              @RequestMapping(value = "/demo")
              public String index(@RequestParam("name") String demo_name){
                  return "Hello world cleint2|I'm "+demo_name;
              }
          
          }

  3. 啟動eureka服務消費者
  4. 訪問http://localhost:8089/hi?service_name=%27sdas%27為消費者的入口訪問eureka服務方的介面;
    1. 第一次訪問,返回結果

      第二次訪問返回結果如下:

      

    多嘗試幾次可以發現使用的是負載均衡的輪詢策略。

    毛主席告訴我們,實踐是檢驗真理的唯一標準。動動小手試試吧。

<< 返回頁首 >>


我是 嘖嘖嘖花兒不謝呀! ,一隻有理想,有故事的程式設計師,歡迎說出你的故事