天天看點

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

文章目錄

  • 前言
  • 【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用
    • 1.負載均衡介紹
      • 1)什麼是負載均衡?
      • 2)負載均衡業務使用情況
      • 3)伺服器端負載均衡和用戶端負載均衡
    • 2.Ribbon是什麼?
    • 4.建立項目
    • 5.引包(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)
      • 1)父pom.xml依賴
      • 2)pom.xml的基礎web封包件
      • 3)核心包
    • 6.建立配置檔案(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)
    • 7.建立入口RibbonAApplication.java(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)
    • 8.建立配置類RibbonConfig.java(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)
    • 9.建立接口方法controller
    • 10.建立調用服務類RibbonClient.java
    • 11.啟動服務,開始通路接口實作調用
    • 12.完成配置使用

前言

【idea版】springcloud微服務系列搭建教程,包括整合nacos、mybatisplus、redis、gateway、ribbion、Rocketmq等

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

1.負載均衡介紹

1)什麼是負載均衡?

負載均衡(Load Balance),其含義就是指将負載(工作任務)進行平衡、分攤到多個操作單元上進行運作,進而達到一個高可用網絡。

用微服務來舉例就是:把http請求,分攤到多個伺服器上。

2)負載均衡業務使用情況

沒有負載均衡的web請求情況:

使用者是直接通過http連到 web 伺服器來擷取結果,如果這個伺服器當機了,那麼使用者自然也就沒辦法通路了。另外,如果同時有很多使用者試圖通路伺服器,超過了其能處理的極限,就會出現加載速度緩慢或根本無法連接配接的情況。

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

有負載均衡的web請求情況(必須有兩個web server以上):

使用者通路負載均衡器,再由負載均衡器将請求轉發給後端伺服器,緩沖單機的壓力,同時有一個web server伺服器當機了,也不影響使用者請求。

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

3)伺服器端負載均衡和用戶端負載均衡

伺服器端負載均衡:

負載均衡是我們處理高并發、緩解網絡壓力和進行伺服器擴容的重要手段之一,但是一般情況下我們所說的負載均衡通常都是指伺服器端負載均衡,伺服器端負載均衡又分為兩種,一種是硬體負載均衡,還有一種是軟體負載均衡。

  • 硬體負載均衡主要通過在伺服器節點之前安裝專門用于負載均衡的裝置,常見的如:F5。
  • 軟體負載均衡則主要是在伺服器上安裝一些具有負載均衡功能的軟體來完成請求分發進而實作負載均衡,常見的如:LVS 、 Nginx 、Haproxy。
  • 無論是硬體負載均衡還是軟體負載均衡,它的工作原理都不外乎下面這張圖:
    【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

用戶端負載均衡:

是從微服務的出現,則為負載均衡的實作提供了另外一種思路:把負載均衡的功能以庫的方式內建到服務的消費方,而不再是由一台指定的負載均衡裝置集中提供。這種方案稱為軟負載均衡(Soft Load Balancing)或者用戶端負載均衡。

兩者特點

伺服器端負載均衡 VS 用戶端負載均衡的特點如下:

伺服器端負載均衡

用戶端先發送請求到負載均衡伺服器,然後由負載均衡伺服器通過負載均衡算法,在衆多可用的伺服器之中選擇一個來處理請求。

如圖:

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

用戶端負載均衡

用戶端自己維護一個可用伺服器位址清單,在發送請求前先通過負載均衡算法選擇一個将用來處理本次請求的伺服器,然後再直接将請求發送至該伺服器。

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

2.Ribbon是什麼?

Srping Cloud Ribbon 是基于 Netflix Ribbon實作,是一個基于HTTP和TCP的一套用戶端 負載均衡的工具。

Ribbon是從nacos/eureka注冊中心伺服器端上擷取服務注冊資訊清單,緩存到本地,讓後在本地實作輪訓負載均衡政策。

Ribbon自帶的負載均衡政策,首先Ribbon預設的負載政策為輪詢算法,那麼除了輪詢算法Ribbon還包括以下幾種負載政策。

政策類 命名 說明
RandomRule 随機政策 随機選擇一個服務
RoundRobinRule 輪詢政策 按順序循環選擇一個服務
RetryRule 重試政策 在一個配置時間段内選擇服務不成功會一直嘗試選擇一個可用的服務
BestAvailabelRule 最低并發政策 忽略熔斷器打開的服務,選擇并發連接配接最低的服務
AvailibilityFilterRule 可用過濾政策 過濾掉一直連結失敗和高并發連接配接的服務
ResponseTimeWeightedRule 響應時間權重政策 服務響應時間越短,權重越大,被選中提供服務的機率越高
ZoneAviodanceRule 區域權衡政策 綜合服務所在區域性能和服務的可用性來輪詢選擇服務,會剔除不可用的服務

4.建立項目

根據教程:【idea版】springcloud微服務(1)之多子產品版本建立一個springcloud項目

建立兩個子子產品:springcloud-ribbonA-example和springcloud-ribbonB-example

【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用前言【idea版】springcloud微服務(5)之整合Ribbon負載均衡使用

5.引包(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)

1)父pom.xml依賴

<properties>
    <spring-boot.version>2.4.3</spring-boot.version>
    <spring-cloud.version>2020.0.2</spring-cloud.version>
    <spring-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
    <java.version>11</java.version>
    <maven.compiler.source>11</maven.compiler.source>
    <maven.compiler.target>11</maven.compiler.target>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-dependencies</artifactId>
            <version>${spring-boot.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>${spring-cloud.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>
            <version>${spring-cloud-alibaba.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>
           

2)pom.xml的基礎web封包件

<?xml version="1.0" encoding="UTF-8"?>
<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">
    <parent>
        <artifactId>springcloud-example</artifactId>
        <groupId>org.example</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springcloud-ribbonA-example</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.5.RELEASE</version>
                <executions>
                    <execution>
                        <goals>
                            <goal>repackage</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
            <plugin>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>11</source>
                    <target>11</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

           

3)核心包

ribbon負載均衡調用都需要注冊中心,是以引入

spring-cloud-starter-alibaba-nacos-discovery

,因為

spring-cloud-starter-alibaba-nacos-discovery

已經把

spring-cloud-starter-netflix-ribbon

包含,是以使用ribbon就隻需要一個包就可以了

<!-- nacos服務注冊中心 begin-->
<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- nacos服務注冊中心 begin-->
           

6.建立配置檔案(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)

在resources裡建立檔案application.yml,兩個服務的端口需要不一樣

1)子子產品springcloud-ribbonA-example:

server:
  port: 9003
spring:
  application:
    name: ribbonA-server
  # 設定注冊中心
  cloud:
    nacos:
      discovery:
        #nacos服務位址
        server-addr: 192.168.56.121:8848
        #命名空間
        namespace: f99717b6-4b29-443a-afac-c949d634e648
           

2)子子產品springcloud-ribbonB-example:

server:
  port: 9004
spring:
  application:
    name: ribbonB-server
  # 設定注冊中心
  cloud:
    nacos:
      discovery:
        #nacos服務位址
        server-addr: 192.168.56.121:8848
        #命名空間
        namespace: f99717b6-4b29-443a-afac-c949d634e648
           

7.建立入口RibbonAApplication.java(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)

@SpringBootApplication
@EnableDiscoveryClient
public class RibbonAApplication {
    public static void main(String[] args) {
        SpringApplication.run(RibbonAApplication.class, args);
    }
}

           

8.建立配置類RibbonConfig.java(兩個子子產品springcloud-ribbonA-example和springcloud-ribbonB-example都是一樣)

開啟Ribbon的負載均衡加入注解: @LoadBalanced

@Configuration
public class RibbonConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
}
           

修改負載均衡的政策:(注冊類修改)

在配置類裡,加上IRule的注冊bean,然後傳回自己要用的負載均衡政策就行了

注:使用nacos的注冊中心,可以使用NacosRule

@Configuration
public class RestConfig {

    @Bean
    @LoadBalanced
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }

    /**
     * 更改 負載均衡政策算法
     * RandomRule #配置規則 随機
     * RoundRobinRule #配置規則 輪詢
     * RetryRule #配置規則 重試
     * WeightedResponseTimeRule #配置規則 響應時間權重
     * NacosRule #是用nacos注冊中心的一套負載均衡規則,可以通過權重來控制通路量
     * 也可以自定義負載均衡政策的類 MyCustomRule
     * @return
     */
    @Bean
    public IRule myRule(){
        return new NacosRule();
    }
}
           

9.建立接口方法controller

1)子子產品springcloud-ribbonA-example:

建立TestController.java

@RestController
public class TestController {

    @Autowired
    private RibbonClient ribbonClient;

    @RequestMapping(value = "/a",method = RequestMethod.POST)
    public String getA(){
        return "success-A";
    }

    @RequestMapping("/getServerByRibbon")
    public String getServerByRibbon(){
        return ribbonClient.getA();
    }
}
           

2)子子產品springcloud-ribbonB-example:

建立TestController.java

@RestController
public class TestController {

    @Autowired
    private RibbonClient ribbonClient;

    @RequestMapping(value = "/b",method = RequestMethod.POST)
    public String getA(){
        return "success-B";
    }

    @RequestMapping("/getServerByRibbon")
    public String getServerByRibbon(){
        return ribbonClient.getA();
    }
}
           

10.建立調用服務類RibbonClient.java

子子產品springcloud-ribbonA-example:

ribbonB-server是服務名,在注冊中心上的服務名字

@Component
public class RibbonClient {

	@Autowired
    private RestTemplate restTemplate;

    public String getA() {
        ResponseEntity<String> message =
                restTemplate.postForEntity("http://ribbonB-server/b",null, String.class);
        return message.getBody();
    }
}
           

子子產品springcloud-ribbonB-example:

ribbonA-server是服務名,在注冊中心上的服務名字

@Component
public class RibbonClient {

	@Autowired
    private RestTemplate restTemplate;

    public String getA() {
        ResponseEntity<String> message =
                restTemplate.postForEntity("http://ribbonA-server/a",null, String.class);
        return message.getBody();
    }
}
           

11.啟動服務,開始通路接口實作調用

通路:http://127.0.0.1:9003/getServerByRibbon

傳回值:success-B

通路:http://127.0.0.1:9004/getServerByRibbon

傳回值:success-A

12.完成配置使用