spring-cloud-alibaba2.2.x 遠程調用負載均衡ribbon搭建使用
文章目錄
- spring-cloud-alibaba2.2.x 遠程調用負載均衡ribbon搭建使用
- 1、badger-spring-cloud-alibaba-provider,普通的服務提供者項目搭建
- 1.1、maven的pom文件如下,就是一個普通的web的springboot項目,加入了nacos的`nacos-discovery`的包
- 1.2、yaml的配置文件
- 1.3、springboot的主啓動類以及業務演示代碼
- 1.4、演示的代碼詳細參考github上的官方文檔,或者spring的英文文檔
- 2、badger-spring-cloud-alibaba-consumer-ribbon。服務的消費者ribbon的項目搭建
- 2.1、maven的pom文件如下,就是一個普通的web的springboot項目,加入了nacos的`nacos-discovery`的包
- 2.2、yaml配置文件如下,基礎配置
- 2.3、主啓動類、配置類、以及業務類
- 3、項目啓動,測試使用
- 4、更多關於 Nacos Discovery Starter 的配置項信息
- 5、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的英文文檔
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、項目啓動,測試使用
啓動步驟如下:
- 啓動nacos的服務,端口8848;
- 修改yaml的配置文件,啓動端口爲7000,啓動服務的提供者badger-spring-cloud-alibaba-provider;
- 修改yaml的配置文件,啓動端口爲7001,啓動服務的提供者badger-spring-cloud-alibaba-provider;
- 啓動服務的消費者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的實例就可以了;