(十七) 跟我學習SpringCloud-Ribbon(負載均衡器)介紹及使用

目前主流的負載方案分爲以下兩種:

  • 集中式負載均衡,在消費者和服務提供方中間使用獨立的代理方式進行負載,有硬件的(比如 F5),也有軟件的(比如 Nginx)。
  • 客戶端自己做負載均衡,根據自己的請求情況做負載,Ribbon 就屬於客戶端自己做負載。

Spring Cloud Ribbon 是一個基於 HTTP 和 TCP 的客戶端負載均衡工具,它基於 Netflix Ribbon 實現。通過 Spring Cloud 的封裝,可以讓我們輕鬆地將面向服務的 REST 模版請求自動轉換成客戶端負載均衡的服務調用。

Spring Cloud Ribbon 雖然只是一個工具類框架,它不像服務註冊中心、配置中心、API 網關那樣需要獨立部署,但是它幾乎存在於每一個 Spring Cloud 構建的微服務和基礎設施中。因爲微服務間的調用,API 網關的請求轉發等內容,實際上都是通過 Ribbon 來實現的(https://github.com/Netflix/ribbon)。

Ribbon 模塊

 Ribbon 模塊介紹如下表 1 所示。

表 1 Ribbon 模塊介紹
名  稱 說    明
ribbon-loadbalancer 負載均衡模塊,可獨立使用,也可以和別的模塊一起使用。
Ribbon 內置的負載均衡算法都實現在其中。
ribbon-eureka 基於 Eureka 封裝的模塊,能夠快速、方便地集成 Eureka。
ribbon-transport 基於 Netty 實現多協議的支持,比如 HTTP、Tcp、Udp 等。
ribbon-httpclient 基於 Apache HttpClient 封裝的 REST 客戶端,集成了負載均衡模塊,可以直接在項目中使用來調用接口。
ribbon-example Ribbon 使用代碼示例,通過這些示例能夠讓你的學習事半功倍。
ribbon-core 一些比較核心且具有通用性的代碼,客戶端 API 的一些配置和其他 API 的定義。

Ribbon 使用

我們使用 Ribbon 來實現一個最簡單的負載均衡調用功能,接口就用《使用Eureka編寫服務提供者》提供的 /user/hello 接口,需要啓動兩個服務,一個是 8081 的端口,一個是 8083 的端口。

然後創建一個新的 Maven 項目 ribbon-native-demo,在項目中集成 Ribbon,在 pom.xml 中添加如下代碼所示的依賴。

<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-core</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>com.netflix.ribbon</groupId>
    <artifactId>ribbon-loadbalancer</artifactId>
    <version>2.2.2</version>
</dependency>
<dependency>
    <groupId>io.reactivex</groupId>
    <artifactId>rxjava</artifactId>
    <version>1.0.10</version>
</dependency>

接下來我們編寫一個客戶端來調用接口,代碼如下所示。

// 服務列表
List<Server> serverList = Lists.newArrayList(new Server("localhost", 8081), new Server("localhost", 8083));
// 構建負載實例
ILoadBalancer loadBalancer = LoadBalancerBuilder.newBuilder().buildFixedServerListLoadBalancer(serverList);
// 調用 5 次來測試效果
for (int i = 0; i < 5; i++) {
    String result = LoadBalancerCommand.<String>builder().withLoadBalancer(loadBalancer).build()
            .submit(new ServerOperation<String>() {
                public Observable<String> call(Server server) {
                    try {
                        String addr = "http://" + server.getHost() + ":" + server.getPort() + "/user/hello";
                        System.out.println(" 調用地址:" + addr);
                        URL url = new URL(addr);
                        HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                        conn.setRequestMethod("GET");
                        conn.connect();
                        InputStream in = conn.getInputStream();
                        byte[] data = new byte[in.available()];
                        in.read(data);
                        return Observable.just(new String(data));
                    } catch (Exception e) {
                        return Observable.error(e);
                    }
                }
            }).toBlocking().first();
    System.out.println(" 調用結果:" + result);
}

上述這個例子主要演示了 Ribbon 如何去做負載操作,調用接口用的最底層的 HttpURLConnection。當然你也可以用別的客戶端,或者直接用 RibbonClient 執行程序,可以看到控制檯輸出的結果如下:

從輸出的結果中可以看到,負載起作用了,8083 調用了 3 次,8081 調用了 2 次。

推薦分佈式架構源碼

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