springcloud學習(二)之Ribbon

Ribbon介紹

Ribbon是Netflix發佈的負載均衡器。 Eureka⼀般配合Ribbon進⾏使⽤, Ribbon利⽤從Eureka中讀取到服務信息,在調⽤服務提供者提供的服務時,會根據⼀定的算法進⾏負載。
Ribbon屬於客戶端負載均衡。java

負載均衡

負載均衡分爲客戶端負載均衡服務器端負載均衡git

所謂服務器端負載均衡,⽐如Nginx、 F5這些,請求到達服務器以後由這些負載均衡器根據⼀定的算法將請求路由到⽬標服務器處理。算法

所謂客戶端負載均衡,⽐如咱們要說的Ribbon,服務消費者客戶端會有⼀個服務器地址列表,調⽤⽅在請求前經過⼀定的負載均衡算法選擇⼀個服務器進⾏訪問,負載均衡算法的執⾏是在請求客戶端進⾏。服務器

Ribbon的使用

不須要引⼊額外的Jar座標,由於在服務消費者中咱們引⼊過eureka-client,它會引⼊Ribbon相關Jarapp

使用方式:在注入RestTemplate的配置類上加上@LoadBalanced註解便可。負載均衡

@SpringBootApplication
@EnableDiscoveryClient
public class AutoDeliverApplication {
    public static void main(String[] args) {
        SpringApplication.run(AutoDeliverApplication.class, args);
    }
    /**
     * 注⼊RestTemplate
     * @return
     */
    @Bean
    @LoadBalanced
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }
}

爲了區分調用不一樣的服務提供者,咱們將服務提供者的代碼稍做修改:dom

@RestController
@RequestMapping("/resume")
public class ResumeController {
    @Autowired
    private ResumeService resumeService;
    @Value("${server.port}")
    private Integer port;
    
    @GetMapping("/openstate/{userId}")
    public Integer findDefaultResumeState(@PathVariable Long userId) {
        return port;
    }
}

在服務提供者中獲取各自的端口號(在application.yml中配置的),經過服務消費者的調用咱們就可以看出調的哪一個服務提供者。
測試結果以下:微服務

修改負載均衡策略

在服務消費者的配置文件中添加負載均衡策略:測試

#針對的被調⽤⽅微服務名稱,不加就是全局⽣效
lagou-service-resume:
  ribbon:
    NFLoadBalancerRuleClassName: com.netflix.loadbalancer.RandomRule #負載策略調整
負載均衡策略 描述
RoundRobinRule:輪詢策略 默認超過10次獲取到的server都不可⽤,會返回⼀個空的server
RandomRule:隨機策略 若是隨機到的server爲null或者不可⽤的話,會while不停的循環選取
RetryRule:重試策略 ⼀定時限內循環重試。默認繼承RoundRobinRule,也⽀持⾃定義注⼊, RetryRule會在每次選取以後,對選舉的server進⾏判斷,是否爲null,是否alive,而且在500ms內會不停的選取判斷。⽽RoundRobinRule失效的策略是超過10次, RandomRule是沒有失效時間的概念,只要serverList沒都掛。
BestAvailableRule:最⼩鏈接數策略 遍歷serverList,選取出可⽤的且鏈接數最⼩的⼀個server。該算法⾥⾯有⼀個LoadBalancerStats的成員變量,會存儲全部server的運⾏情況和鏈接數。若是選取到的server爲null,那麼會調⽤RoundRobinRule從新選取。
AvailabilityFilteringRule:可⽤過濾策略 擴展了輪詢策略,會先經過默認的輪詢選取⼀個server,再去判斷該server是否超時可⽤,當前鏈接數是否超限,都成功再返回。
ZoneAvoidanceRule:區域權衡策略(默認策略 擴展了輪詢策略,繼承了2個過濾器: ZoneAvoidancePredicate和AvailabilityPredicate,除了過濾超時和連接數過多的server,還會過濾掉不符合要求的zone區域⾥⾯的全部節點, AWS --ZONE 在⼀個區域/機房內的服務實例中輪詢

源碼剖析

負載均衡策略的頂級接口是IRule,.net

每一個負載均衡策略調用的實現類都會實現其中的choose方法

ribbon使用demo地址:ribbon使用demo

歡迎訪問個人博客:https://www.liuyj.top

相關文章
相關標籤/搜索