spring-cloud-alibaba2.2.x 遠程調用負載均衡ribbon搭建使用

spring-cloud-alibaba2.2.x 遠程調用負載均衡ribbon搭建使用


本地項目的基礎環境

環境 版本
jdk 1.8.0_201
maven 3.6.0
Spring-boot 2.2.4.RELEASE
Spring-cloud-alibaba 2.2.1.RELEASE

構建本項目之前,請詳細參看如下步驟,如果已經搭建好,略過即可;

項目地址的碼雲的git地址https://gitee.com/liqi01/badger-spring-cloud-alibaba.git

《spring-cloud-alibaba.2.2.x 服務註冊與發現nacos簡介以及環境搭建》

1、badger-spring-cloud-alibaba-provider,普通的服務提供者項目搭建

1.1、maven的pom文件如下,就是一個普通的web的springboot項目,加入了nacos的nacos-discovery的包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
    </parent>
    <groupId>com.badger</groupId>
    <artifactId>badger-spring-cloud-alibaba-provider</artifactId>
    <name>badger-spring-cloud-alibaba-provider</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!-- 打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>badger-spring-cloud-alibaba-provider</finalName>
    </build>
    <description>服務提供者</description>
</project>

1.2、yaml的配置文件

server:
  port: 7000
spring:
  application:
    name: badger-spring-cloud-alibaba-provider
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'

1.3、springboot的主啓動類以及業務演示代碼

/**
 * @EnableDiscoveryClient 開啓服務註冊和發現
 */
@SpringBootApplication
@EnableDiscoveryClient
public class ProviderApplication {

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

    @RestController
    public class DemoController {

        @Value("${server.port}")
        String port;

        @Value("${spring.cloud.client.ip-address}")
        String address;

        @GetMapping("/demo")
        public String demo() {
            return "我的地址是-->" + address + ":" + port;
        }
    }
}

1.4、演示的代碼詳細參考github上的官方文檔,或者spring的英文文檔

github文檔 https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-alibaba-docs/src/main/asciidoc-zh/nacos-discovery.adoc

spring官網的文檔 https://spring-cloud-alibaba-group.github.io/github-pages/greenwich/spring-cloud-alibaba.html#_service_registrationdiscovery_nacos_discovery

2、badger-spring-cloud-alibaba-consumer-ribbon。服務的消費者ribbon的項目搭建

2.1、maven的pom文件如下,就是一個普通的web的springboot項目,加入了nacos的nacos-discovery的包

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
    </parent>
    <groupId>com.badger</groupId>
    <artifactId>badger-spring-cloud-alibaba-consumer-ribbon</artifactId>
    <name>badger-spring-cloud-alibaba-consumer-ribbon</name>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
        <maven-jar-plugin.version>3.1.1</maven-jar-plugin.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>2.2.1.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <build>
        <plugins>
            <!-- 打包插件 -->
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
        <finalName>badger-spring-cloud-alibaba-consumer-ribbon</finalName>
    </build>
    <description>服務消費者</description>
</project>

2.2、yaml配置文件如下,基礎配置

server:
  port: 8000
spring:
  application:
    name: badger-spring-cloud-alibaba-consumer-ribbon
  cloud:
    nacos:
      discovery:
        server-addr: 127.0.0.1:8848
management:
  endpoints:
    web:
      exposure:
        include: '*'

2.3、主啓動類、配置類、以及業務類

這個寫法,是取自官網的演示,使用LoadBalancerClient(負載均衡的客戶端)獲取服務的列表,然後調用,是編程式的調用形式;

/**
 * @EnableDiscoveryClient 開啓服務註冊和發現
 */
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication {

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

    // 實例化 RestTemplate 實例
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class DemoController {

        @Autowired
        private LoadBalancerClient loadBalancerClient;
        @Autowired
        private RestTemplate restTemplate;

        private static final String SERVER_NAME = "badger-spring-cloud-alibaba-provider";

        @GetMapping("/ribbon/demo")
        public String demo() {
            // 使用 LoadBalanceClient 和 RestTemplate 結合的方式來訪問
            ServiceInstance serviceInstance = loadBalancerClient.choose(SERVER_NAME);
            String url = String.format("http://%s:%s/%s", serviceInstance.getHost(), serviceInstance.getPort(), "demo");
            System.out.println("request url:" + url);
            return restTemplate.getForObject(url, String.class);
        }
    }
}

對RestTemplate聲明式的調用,代碼如下,大家二選一,就可以了

/**
 * @EnableDiscoveryClient 開啓服務註冊和發現
 */
@SpringBootApplication
@EnableDiscoveryClient
public class RibbonConsumerApplication2 {

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

    @Bean
    @LoadBalanced // Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端 負載均衡的工具。
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

    @RestController
    public class DemoController {
        @Autowired
        private RestTemplate restTemplate;

        private static final String REST_URL_PREFIX = "http://badger-spring-cloud-alibaba-provider";

        @GetMapping("/ribbon/demo")
        public String getAddress() {
            return restTemplate.getForObject(REST_URL_PREFIX + "/demo", String.class);
        }
    }
}

ribbon使用過程中,是獲取註冊中心,服務提供者的地址,然後使用RestTemplate類來遠程調用的;

@LoadBalanced註解,Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端 負載均衡的工具。也就說,加了這個註解的RestTemplate,可以使用ribbon默認的負載均衡算法,來調用服務器提供者的服務;關於ribbon的部分源碼解析,可以參考《spring boot 2.x spring cloud Greenwich.SR1 負載均衡ribbon自動裝配,負載均衡部分源碼解析》

3、項目啓動,測試使用

啓動步驟如下:

  1. 啓動nacos的服務,端口8848;
  2. 修改yaml的配置文件,啓動端口爲7000,啓動服務的提供者badger-spring-cloud-alibaba-provider;
  3. 修改yaml的配置文件,啓動端口爲7001,啓動服務的提供者badger-spring-cloud-alibaba-provider;
  4. 啓動服務的消費者badger-spring-cloud-alibaba-consumer-ribbon,端口爲7100;

這裏爲了測試負載均衡,我們使用不同的端口(7000,7001)啓動了兩份badger-spring-cloud-alibaba-provider應用;通過nacos的頁面,也可以看到具體的服務

調用ribbon的服務 http://localhost:7100/ribbon/demo

持續調用,會發現業務上的端口,有順序的改變;這個也是默認的負載均衡算法生效了;以及遠程調用badger-spring-cloud-alibaba-provider成功了。

我的地址是-->172.16.2.54:7000

我的地址是-->172.16.2.54:7001

4、更多關於 Nacos Discovery Starter 的配置項信息

更多關於 Nacos Discovery Starter 的配置項如下所示:

配置項 Key 說明
服務端地址 spring.cloud.nacos.discovery.server-addr Nacos Server 啓動監聽的ip地址和端口
服務名 spring.cloud.nacos.discovery.service 註冊的服務名,默認${spring.application.name}
權重 spring.cloud.nacos.discovery.weight 取值範圍 1 到 100,數值越大,權重越大;默認1
網卡名 spring.cloud.nacos.discovery.network-interface 當IP未配置時,註冊的IP爲此網卡所對應的IP地址,如果此項也未配置,則默認取第一塊網卡的地址
註冊的IP地址 spring.cloud.nacos.discovery.ip 優先級最高
註冊的端口 spring.cloud.nacos.discovery.port 默認情況下不用配置,會自動探測;默認-1
命名空間 spring.cloud.nacos.discovery.namespace 常用場景之一是不同環境的註冊的區分隔離,例如開發測試環境和生產環境的資源(如配置、服務)隔離等
AccessKey spring.cloud.nacos.discovery.access-key 當要上阿里雲時,阿里雲上面的一個雲賬號名
SecretKey spring.cloud.nacos.discovery.secret-key 當要上阿里雲時,阿里雲上面的一個雲賬號密碼
Metadata spring.cloud.nacos.discovery.metadata 使用Map格式配置,用戶可以根據自己的需要自定義一些和服務相關的元數據信息
日誌文件名 spring.cloud.nacos.discovery.log-name
集羣 spring.cloud.nacos.discovery.cluster-name Nacos集羣名稱;默認DEFAULT
接入點 spring.cloud.nacos.discovery.endpoint 地域的某個服務的入口域名,通過此域名可以動態地拿到服務端地址
是否集成Ribbon ribbon.nacos.enabled 一般都設置成true即可
是否開啓Nacos Watch spring.cloud.nacos.discovery.watch.enabled 可以設置成false來關閉 watch;默認true

5、ribbon其他負載均衡算法說明,和算法切換

5.1、ribbon負載均衡算法的種類

​ ribbon的負載均衡算法,主要是實現這個com.netflix.loadbalancer.IRule.class這個接口;具體算法如下:

BestAvailableRule:表示請求數最少策略;

PredicateBaseRule:表示過濾掉一些一直連接失敗的服務,或者併發高的服務;先過濾再輪詢的策略

RandomRule:表示隨機策略;

RetryRule:當前請求超時,那麼就再次輪詢調用下一個請求,直到成功;

RoundRobinRule:輪詢策略;輪詢策略下有個加權策略:WeightedResponseTimeRule;另外一個(ResponseTimeWeightedRule)不建議使用了,名字跟WeightedResponseTimeRule差不多,只是單次排列不一樣;

5.2、ribbon切換默認的負載均衡算法

@Configuration
public class RestConfig {
    @Bean
    @LoadBalanced // Spring Cloud Ribbon是基於Netflix Ribbon實現的一套客戶端 負載均衡的工具。
    public RestTemplate getRestTemplate() {
        return new RestTemplate();
    }

    @Bean
    public IRule myRule() {
        // return new RoundRobinRule();
        return new RandomRule();// 達到的目的,用我們重新選擇的隨機算法替代默認的輪詢。
        // return new RetryRule();
    }
}

向spring容器中,注入一個IRule的實例就可以了;

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