SpringCloud系列——Ribbon 負載均衡


  前言

  Ribbon是一個客戶端負載均衡器,它提供了對HTTP和TCP客戶端的行為的大量控制。我們在上篇(猛戳:SpringCloud系列——Feign 服務調用)已經實現了多個服務之間的Feign調用,服務消費者調用服務提供者,本文記錄Feign調用Ribbon負載均衡的服務提供者

  GitHub地址:https://github.com/Netflix/ribbon

  官方文檔:https://cloud.spring.io/spring-cloud-static/spring-cloud-netflix/2.1.0.RC2/single/spring-cloud-netflix.html#spring-cloud-ribbon

 

  服務提供者

  服務提供者有兩個,實際上可以看做只有一個,因為這兩個只有端口不同

  maven引入Ribbon

        <!-- Ribbon -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-netflix-ribbon</artifactId>
        </dependency>

  創建RibbonConfig文件,主類添加@RibbonClient(name = "RibbonConfig", configuration = RibbonConfig.class),我這里偷懶,直接在主類中創建內部類

@EnableEurekaClient
@RibbonClient(name = "RibbonConfig", configuration = RibbonConfig.class)
@SpringBootApplication
public class SpringbootSpringdataJpaApplication{

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

@Configuration
class RibbonConfig {

    @Bean
    public IRule ribbonRule(){
        return new RandomRule(); //分配策略:隨機選擇一個server
//        return new BestAvailableRule(); //分配策略:選擇一個最小的並發請求的server,逐個考察Server,如果Server被tripped了,則忽略
//        return new RoundRobinRule(); //分配策略:輪詢選擇,輪詢index,選擇index對應位置的server
//        return new WeightedResponseTimeRule(); //分配策略:根據響應時間分配一個weight(權重),響應時間越長,weight越小,被選中的可能性越低
//        return new ZoneAvoidanceRule(); //分配策略:復合判斷server所在區域的性能和server的可用性選擇server
//        return new RetryRule(); //分配策略:對選定的負載均衡策略機上重試機制,在一個配置時間段內當選擇server不成功,則一直嘗試使用subRule的方式選擇一個可用的server
    }

    @Bean
    public IPing ribbonPing() {
        return new PingUrl();
    }

    @Bean
    public ServerListSubsetFilter serverListFilter() {
        ServerListSubsetFilter filter = new ServerListSubsetFilter();
        return filter;
    }

}

  下表顯示了Spring Cloud Netflix默認為Ribbon提供的bean:

  官網例子:

  PS:我們啟動的時候有可能會碰到這個問題或類似的問題,說我們注入的某個bean對象有重名,叫我們改名或啟用覆蓋

  這個是ribbonRule跟txlcn框架的重名了,我們這里進行改名就能解決問題

 

 

 

  我們添加一個測試接口

@RestController
@RequestMapping("/user")
public class UserController {

    @RequestMapping("/ribbon")
    public String ribbon() {
        return  "springdatejpa -- 我的端口是:10088";
    }

}

  第二個服務提供者也是這樣配置,注意:應用名要相同(spring.application.name=springdatejpa);端口不同;

 

  服務消費者

   服務消費者使用Feign調用,無需做任何修改,Feign已經使用Ribbon。具體配置請戳:SpringCloud系列——Feign 服務調用

@FeignClient(name = "springdatejpa", path = "/user/")
public interface MyspringbootFeign {

    @RequestMapping("/ribbon")
    String ribbon();
}
    /**
     * feign調用
     */
    @GetMapping("feign/ribbon")
    String ribbon(){
        return myspringbootFeign.ribbon();
    }

 

  效果

  啟動所有項目,我們注冊了三個服務,其中:

  有兩個服務名稱相同、處理的業務相同、端口不同,這兩台作為服務提供者(可看做是一個“小集群”);

  另一個是服務消費者(Feign調用);

 

  消費者不斷調用,Ribbon會從注冊中心的服務列表拉取實例集合進行負載均衡調用背后的服務提供者

 

  后記

  Ribbon負載均衡已經可以實現,更多配置請看官方文檔

 

  代碼開源

  代碼已經開源、托管到我的GitHub、碼雲:

  GitHub:https://github.com/huanzi-qch/springCloud

  碼雲:https://gitee.com/huanzi-qch/springCloud


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM