Spring Cloud Eureka Ribbon

             Spring Cloud基礎教程[Eureka集羣,Ribbon負載均衡]

Spring Cloud Ribbon

Spring Cloud Ribbon是一個基於HTTP和TCP的客戶端負載均衡工具,它基於Netflix Ribbon實現。通過Spring Cloud的封裝,可以讓我們輕鬆地將面向服務的REST模板請求自動轉換成客戶端負載均衡的服務調用。Spring Cloud Ribbon雖然只是一個工具類框架, 它不像服務註冊中心、配置中心、API網關那樣需要獨立部署,但是它幾乎存在於每一個 SpringCloud構建的微服務和基礎設施中。因爲微服務間的調用,API網關的請求轉發等內容,實際上都是通過Ribbon來實現的,包括後續我們將要介紹的Feign,它也是基於Ribbon 實現的工具。所以,對Spring Cloud Ribbon的理解和使用,對於我們使用Spring Cloud來構建微服務非常重要。

在這一章中,我們將具體介紹如何使用Ribbon來實現客戶端的負錢均衡,並且通過源碼分析來了解Ribbon實現客戶端負載均衡的基本原理.

客戶端負載均衡

負載均衡在系統架構中是一個非常重要,並且是不得不去實施的內容因爲負載均衡是對系統的高可用、M絡壓力的緩解和處理能力擴容的重要手段之一。我們通常所說的負載均衡都指的是服務端負載均衡,其中分爲硬件負載均衡和軟件負載均衡。硬件負載均衡主要通過在服務器節點之間安裝專門用於負載均衡的設備,比如F5等:而軟件負載均衡則是通過在服務器上安裝一些具有均衡負載功能或模塊的軟件來完成請求分發工作,比如Nginx等。不論採用硬件負載均衡還是軟件負載均衡,只要是服務端負載均衡都能以類似下圖的架構力+忒構建起來:

硬件負載均衡的設備或是軟件負載均衡的軟件模塊都會維護一個下掛可用的服務端清單,通過心跳檢測來剔除故障的服務端節點以保證清單中都是可以正常訪問的服務端節點,當客戶端發送請求到負載均衡設備的時候,該設備按某種算法(比如線性輪詢、按權審負我、按流最負載等)從維護的可用服務端清單中取出一臺服務端的地址,然後進行轉發。而客戶端負載均衡和眼務端負或均衡M大的不同點在於上面所提到的服務清單所存儲的位置。在客屍端負載均衡中,所有客戶端節點都維護着自己要訪問的服務端清單,而這服務端的清單來自於服務註冊中心,比如上一章我們介紹的Eureka服務端.同服務端負載均 衡的架構類似,在客戶端負載均衡中也需要心跳去維護服務端清單的健康性,只是這〜步騍需要與服務註冊中心配合完成。在Spring Cloudd實現服務治理框架中,默認會創建針對各 個服務'冶理框架的Ribbon自動化整合配置,比如Eureka中 的org.springframework. cloud.netflix. ribbon.eureka.RibbonEurekaAutoConfiguration,Consul中的org.springframework.cloud.consul.discovery.RibbonConsulAuto-Configuration。在實際使用的時候,我們可以通過查看這兩個類的實現,以找到它們 的配置詳情來幫助我們更好地使用它。通過Spring Cloud Ribbon的封裝,我們在微服務架構中使用客戶端負找均衡調用非常 簡單,只需要如下兩步:

     •    服務提供者R潘要啓動多個服務實例並註冊到一個註冊中心或是多a相關聯的服務註冊中心。
     •    服務消費者直接通過調用註解修飾過的 RcstTemplate來實現面 向服務的接口調用。
這樣,我們就可以將服務提供者的高可用以及服務消費者的負載均衡調用一起實現.

動手試一試

下面我們通過具體的例子來看看如何使用Spring Cloud Ribbon來實現服務的調用以及客戶端均衡負載。

下面的例子,我們將利用之前構建的eureka-server作爲服務註冊中心(3個節點)、springcloud-provider作爲服務提供者作爲基礎。而基於Spring Cloud Ribbon實現的消費者,我們可以根據springcloud-consumer實現的內容進行簡單改在就能完成,具體步驟如下:

根據上一篇文章的基礎上進行直接負載均衡:https://blog.csdn.net/weixin_40470497/article/details/83588369 ,上一篇文章只是創建了一個提供者端口爲:8080,在創建相同的服務提供者springcloud-provider2,在application.yml配置文件中修改一下端口:8081

項目已上傳github:[email protected]:13849141963/spring-cloud.git

 直接搭建客戶端進行負載均衡,客戶端爲:springcloud-consumer,pom.xml文件內容如下:

 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.13.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--eureka服務註冊中心-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka-server</artifactId>
        </dependency>
        <!--ribbon基於客戶端的負載均衡器-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-ribbon</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.44</version>
        </dependency>

    </dependencies>


    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.RC1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
  • 添加配置類:在RestTemplate增加@LoadBalanced註解:

@Configuration
public class ConfigBean {
    @Bean
    @LoadBalanced//基於客戶端的負載均衡器
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
    //將jackson轉化成fastjson
    @Bean
    public HttpMessageConverters fastJsonConfigure(){
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig fastJsonConfig = new FastJsonConfig();
        fastJsonConfig.setSerializerFeatures(SerializerFeature.PrettyFormat);
        //日期格式化
        fastJsonConfig.setDateFormat("yyyy-MM-dd HH:mm:ss");
        converter.setFastJsonConfig(fastJsonConfig);
        return new HttpMessageConverters(converter);
    }
}
  • 修改Controller。去掉原來通過LoadBalancerClient選取實例和拼接URL的步驟,直接通過RestTemplate發起請求。
@RestController
public class UserController {
    //服務的應用名稱
    private final String url = "http://springcloud-provider";
    //使用restTemplate對rest接口進行調用 封裝的對象
    //RestTemplate對象提供了多種便捷訪問遠程http服務的方法 是一種簡單便捷的restful服務模板類,是spring提供的用於訪問rest服務的客戶端模板類
    @Autowired
    private RestTemplate restTemplate;

    //調用服務端的查詢所有的服務
    @RequestMapping(value = "/queryAll")
    public Object queryAll(){
        System.out.println("==========進入訪問方法============");
        List forObject = restTemplate.getForObject(url+"/queryAll", List.class);
        return  forObject;
    }
}

通過地址欄交替訪問服務的消費者:10.0.45.103:8989,就可以在分別兩個服務的提供者控制上看到打印的信息,說明Eureka Ribbon基於客戶端的負載均衡完成.

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