1. 程式人生 > >SpringCloud定製Ribbon客戶端負載均衡策略

SpringCloud定製Ribbon客戶端負載均衡策略

目錄

前言

  • 在專案中,我們部署一個微服務的時候往往是叢集的形式部署的,這樣既能提高併發量,又能保證系統的健壯性。相對的對於這個叢集我們需要採取一定的策略保證負載均衡。再說一句,ribbon的工作原理是從註冊中心獲取叢集的地址列表,再按一定策略選取一個微服務的地址進行連結。這就是客戶端發現模式。

Ribbon在Eureka中的使用

新增依賴
* 在Eureka下使用不需要新增Ribbon的依賴,因為spring-cloud-starter-eureka中會自動引入Ribbon的依賴包。

ribbon的使用有兩種方式,使用註解方式與配置檔案方式,下面依次介紹。

註解方式

  1. 主入口程式
@SpringBootApplication
@EnableEurekaClient
@RibbonClient(name = "microservice-provider", configuration = TestConfiguration.class)
@ComponentScan(excludeFilters = { @ComponentScan.Filter(type = FilterType.ANNOTATION, value = ExcludeFromComponentScan.class) })
public class MicroserviceConsumerApplication
{
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); } public static void main(String[] args) { SpringApplication.run(MicroserviceConsumerApplication.class, args); } }
  1. TestConfiguration檔案
@Configuration
@ExcludeFromComponentScan
public class TestConfiguration { // @Autowired // IClientConfig config; @Bean public IRule ribbonRule() { return new RandomRule(); } }
  1. ExcludeFromComponentScan 檔案
public @interface ExcludeFromComponentScan {

}

說明:
1. @LoadBalanced 指定了restTemplate使用Ribbon進行負載均衡。
2. @RibbonClient 說明對名為microservice-provider的微服務叢集採用的負載均衡策略由TestConfiguration.class檔案設定。
3. TestConfiguration 中函式返回的即是負載均衡的策略,RandomRule代表隨機。
4. 如果TestConfiguration 放在主程式的檔案目錄及子目錄下時,spring掃描後會將該策略設定為所有的負載均衡策略而不是單單指對microservice-provider的負載均衡策略。所以要麼將該檔案放置在入口程式的檔案目錄之外或者禁止spring掃描該檔案。禁止掃描的做法如上,在主程式上新增@ComponentScan註解,則spring不會掃描帶@ExcludeFromComponentScan註解的檔案。
5. ribbon預設的負載均衡策略為輪詢。
6. 如果需要配置多個,則使用@RibbonClients註解,如下

基於配置檔案的方式

# 微服務名.ribbon.NFLoadBalancerRuleClassName:負載均衡策略
microservice-provider:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule
@RibbonClients(value = {
        @RibbonClient(name = "xxx",configuration = xxxConfiguration.class),
        @RibbonClient(name = "microservice-provider",configuration = TestConfiguration.class)
})

使用例項:

@RestController
public class MovieController {


    @Autowired
    private LoadBalancerClient loadBalancerClient;

    //用於訪問其他微服務的實體。
    @Autowired
    private RestTemplate restTemplate;


    @GetMapping("/movie/{id}")
    public User findById(@PathVariable Long id) {
        //通過ribbon負載均衡策略,傳送一個HTTP請求給一個微服務,並將返回的資料封裝到user.class實體中
        return this.restTemplate.getForObject("http://microservice-provider/simple/" + id, User.class);
    }


    @GetMapping("/test")
    public String test() {
       //根據負載均衡策略獲取到一個微服務的資訊。
        ServiceInstance serviceInstance = this.loadBalancerClient.choose("microservice-provider");
        System.out.println("111" + ":" + serviceInstance.getServiceId() + ":" + serviceInstance.getHost() + ":" + serviceInstance.getPort());
        return "1";
    }
}

獨立使用ribbon

1.有引入eureka的時候

  • 關閉eureka
  • 指定listOfServers
ribbon:
  eureka:
   enabled: false
microservice-provider:
  ribbon:
    listOfServers: localhost:7900

2.沒有引入eureka的時候

  • 新增ribbon依賴
 <dependency>
           <groupId>org.springframework.cloud</groupId>
           <artifactId>spring-cloud-starter-ribbon</artifactId>
     /dependency>   
  • 指定listOfServers
microservice-provider:
  ribbon:
    listOfServers: localhost:7900