【Dubbo】dubbo學習

一、分佈式和微服務

1.1 什麼是分佈式

分佈式是一種系統部署方式,即根據實際情況將項目拆分成多個不同的服務,並分散部署在不同的機器是。在分佈式中,生產環境的服務器或虛擬機必定超過一臺。

分佈式服務顧名思義服務是分散部署在不同的機器上的,一個服務可能負責幾個功能,是一種面向SOA架構的,服務之間也是通過rpc來交互或者是webservice來交互的。邏輯架構設計完後就該做物理架構設計,系統應用部署在超過一臺服務器或虛擬機上,且各分開部署的部分彼此通過各種通訊協議交互信息,就可算作分佈式部署。

 

1.2 什麼是微服務

微服務是一種架構設計方式,即將項目根據實際情況拆分成多個微小的服務,小到一個服務只負責一個單一的功能。這個服務可以單獨部署運行,服務間可以通過rpc來互相調用。

微服務架構:

在做架構設計的時候,先做邏輯架構,再做物理架構,當你拿到需求後,估算過最大用戶量和併發量後,計算單個應用服務器能否滿足需求,如果用戶量只有幾百人的小應用,單體應用就能搞定,即所有應用部署在一個應用服務器裏,如果是很大用戶量,且某些功能會被頻繁訪問,或者某些功能計算量很大,建議將應用拆解爲多個子系統,各自負責各自功能,這就是微服務架構。

 

1.3 兩者對比

生產環境下的微服務肯定是分佈式部署的,分佈式部署的應用不一定是微服務架構的,比如集羣部署,它是把相同應用複製到不同服務器上,但是邏輯功能上還是單體應用。

 

二、什麼是 Java RPC

2.1 RPC 概念

RPC 全程爲  remote procedure call,即遠程過程調用。例如兩臺服務器A、B上分別部署了不同的應用,A服務器上的應用想調用B服務器上的應用提供的方法,就需要通過網絡來表達調用的語義和傳達調用的數據。

RPC 是一個泛化的概念,嚴格來說一切遠程調用手段都屬於 RPC 範疇,Java 中的 RPC 框架 有 RMI、Hessian、Dubbo 等

 

2.2 基本原理圖

  

 

2.3 RPC 框架性能

RPC 框架的優劣主要取決於:

  • 通信效率:是否能快速的在不同服務之間建立起連接
  • 序列化與反序列化效率:序列化和反序列化機制是否快速

 

三、Dubbo 學習

3.1 Dubbo 簡介

Apache Dubbo 是一款高性能的 Java RPC 框架,可以和 Spring 框架無縫集成。

Dubbo 提供了三大核心能力:

  • 面向接口的遠程方法調用
  • 智能容錯和負載均衡
  • 服務自動註冊和發現

 

3.2 Dubbo 架構圖

虛線爲異步調用,實線爲同步調用

藍色虛線:在啓動時未完成的功能

紅色線條:在程序運行過程中執行的功能

節點角色說明:

節點 角色名稱
Provider 暴露服務的服務提供方
Consumer 調用遠程服務的消費提供方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的調用次數和調用時間的監控中心
Container 服務運行容器

 

 

 

 

 

 

 

3.3 服務註冊中心 Zookeeper

3.3.1 什麼是註冊中心

消費者通過註冊中心來調用服務提供方,消費者和服務提供者均要在註冊中心進行註冊,註冊中心能夠監控到服務提供方是否在線,以及實現負載均衡。

 

3.3.2 Zookeeper 簡介

Zookeeper 是 Apache Hadoop 的子項目,是一個樹形的目錄服務,支持變更推送,適合作爲 Dubbo 服務的註冊中心,工業強度較高,可用於生成環境。

 

3.3.3 Zookeeper 結構說明

流程說明:

  • 服務提供者(Provicer)啓動時,向 /dubbo/com.foo.BarService/providers 目錄下寫入自己的 URL 地址
  • 服務消費者(Consumer)啓動時,訂閱 /dubbo/com.foo.BarService/providers 目錄下的提供者 URL 地址。並向 /dubbo/com.foo.BarService/consumers 目錄下寫入自己的 URL 地址
  • 監控中心(Monitor)啓動時,訂閱 /dubbo/com.foo.BarService 目錄下所有的提供者和消費者 URL 地址

 

3.3.4 安裝 Zookeeper

百度網盤:

鏈接:https://pan.baidu.com/s/1CL1CYr2-Eb4ZOX-fe4WFRg   提取碼:13y3

官網下載地址:

http://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/

# 解壓壓縮包
tar -zxvf zookeeper-3.4.6.tar.gz
mv zookeeper-3.4.6 zookeeper


# 創建data目錄
cd zookeeper
mkdir data

# 修改配置文件
cd conf
mv zoo_sample.cfg zoo.cfg

# 修改 zoo.cfg 文件
dataDir=/usr/local/lincya/zookeeper/data

 

3.3.4 Zookeeper 使用

# 啓動 Zookeeper
./zkServer.sh start

# 停止服務命令
./zkServer.sh stop

# 查看服務狀態
./zkServer.sh status

 

3.3.5 Zookeeper 客戶端使用

# 進入客戶端
sh zkCli.sh

# 查看節點
ls /

# 獲取某個節點數據
get /dubbo

# 創建節點
create dubbo 123456

 

3.3.6 Zookeeper 可視化界面

GitHub 項目地址:

https://github.com/apache/dubbo-admin

使用教程:

訪問結果:

 

四、Dubbo 搭建基於 xml 的實例

4.1 提供方搭建

4.1.1 引入 maven 依賴

<dependencies>
        <dependency>
            <groupId>com.tom</groupId>
            <artifactId>dubbo-interface</artifactId>
            <version>1.0-SNAPSHOT</version>
        </dependency>

        <!--    引入dubbo    -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.2</version>
        </dependency>
        <!--    引入操作zookeeper的客戶端    -->
        <!--     dubbo 2.6 以前使用 zkclient   -->
        <!--        <dependency>-->
        <!--            <groupId>org.101tec</groupId>-->
        <!--            <artifactId>zkclient</artifactId>-->
        <!--            <version>0.10</version>-->
        <!--        </dependency>-->
        <!--   dubbo 2.6 及以後使用 curator     -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
    </dependencies>

4.1.2 增加註解

provider.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans        http://www.springframework.org/schema/beans/spring-beans-4.3.xsd        http://dubbo.apache.org/schema/dubbo        http://dubbo.apache.org/schema/dubbo/dubbo.xsd">

    <!-- 提供方應用信息,用於計算依賴關係 -->
    <dubbo:application name="user-service-provider"/>

    <!--  指定註冊中心地址  -->
    <dubbo:registry address="zookeeper://www.greattom.xyz:2181"/>

    <!-- 用dubbo協議在20880端口暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880"/>

    <!-- 聲明需要暴露的服務接口 ref指向服務真正的實現對象 -->
    <dubbo:service interface="com.tom.service.UserService" ref="userServiceImpl"/>

    <!-- 和本地bean一樣實現服務 -->
    <bean id="userServiceImpl" class="com.tom.service.impl.UserServiceImpl"/>

    <!-- 設置請求超時時間 -->
    <dubbo:provider timeout="5000"></dubbo:provider>

    <!--  自動發現監控中心  -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
</beans>

4.1.3 修改啓動類

使用 ClassPathXmlApplicationContext 加載配置文件

public class ProviderApplication {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
        ioc.start();

        System.in.read();
    }
}

4.1.4 編寫服務代碼

import com.tom.bean.UserAddress;
import com.tom.service.UserService;

import java.util.Arrays;
import java.util.List;

public class UserServiceImpl implements UserService {
    public List<UserAddress> getUserAddressList(String userId) {
        UserAddress address1 = new UserAddress(1, "北京市", "1", "小王", "18030145000", "1");
        UserAddress address2 = new UserAddress(2, "杭州市", "2", "小北", "18030145999", "2");
        return Arrays.asList(address1, address2);
    }
}

 

4.2 服務方搭建

4.2.1 引入 maven 依賴

與提供方相同

4.2.2 增加註解

consumer.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo
       http://dubbo.apache.org/schema/dubbo/dubbo.xsd
       http://www.springframework.org/schema/context
       http://www.springframework.org/schema/context/spring-context.xsd">

    <context:component-scan base-package="com.tom.service.impl"></context:component-scan>

    <!-- 消費方應用名,用於計算依賴關係,不是匹配條件,不要與提供方一樣 -->
    <dubbo:application name="order-service-consumer"/>

    <!-- 使用註冊中心 -->
    <dubbo:registry address="zookeeper://www.greattom.xyz:2181"/>

    <!-- 生成遠程服務代理 -->
    <dubbo:reference interface="com.tom.service.UserService" id="userService"/>

    <!--  自動發現監控中心  -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    <!--    <dubbo:monitor address="127.0.0.1:7070"></dubbo:monitor>-->
</beans>

4.2.3 修改啓動類

public class ConsumerApplication {

    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
        OrderService orderService = applicationContext.getBean(OrderService.class);
        orderService.initOrder("1");

        System.out.println("調用完成...");
        System.in.read();
    }
}

4.2.4 編寫服務代碼

import com.tom.bean.UserAddress;
import com.tom.service.OrderService;
import com.tom.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class OrderServiceImpl implements OrderService {

    @Autowired
    UserService userService;

    public void initOrder(String userId) {
        System.out.println("用戶ID: " + userId);
        List<UserAddress> addressList = userService.getUserAddressList(userId);
        for (UserAddress item : addressList) {
            System.out.println(item.getUserAddress());
        }
    }
}

 

五、Dubbo 搭建基於註解的實例

Github項目地址:https://github.com/IDLC1/dubboDemos

項目相關依賴版本:

  • jdk: 1.8
  • dubbo: 2.7.7
  • zookeeper: 3.6.1
  • curator: 5.0.0

 

5.1 提供者搭建

5.1.1 引入 maven 依賴

<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>
        <exclusions>
            <exclusion>
                <groupId>org.junit.vintage</groupId>
                <artifactId>junit-vintage-engine</artifactId>
            </exclusion>
        </exclusions>
    </dependency>

    <dependency>
        <groupId>com.tom</groupId>
        <artifactId>boot-dubbo-common-interface</artifactId>
        <version>1.0-SNAPSHOT</version>
    </dependency>

    <!--    引入dubbo    -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.zookeeper</groupId>
        <artifactId>zookeeper</artifactId>
        <version>${zookeeper.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-framework</artifactId>
        <version>${curator.version}</version>
    </dependency>
    <dependency>
        <groupId>org.apache.curator</groupId>
        <artifactId>curator-recipes</artifactId>
        <version>${curator.version}</version>
    </dependency>

    <!-- Dubbo Spring Boot Starter -->
    <dependency>
        <groupId>org.apache.dubbo</groupId>
        <artifactId>dubbo-spring-boot-starter</artifactId>
        <version>${dubbo.version}</version>
    </dependency>
</dependencies>

5.1.2 修改配置文件

dubbo.application.name=dubbo-order-provicder
# 指定 zookeeper 註冊,使用 curator 客戶端
dubbo.registry.address=zookeeper://www.greattom.xyz:2181
dubbo.registry.protocol=zookeeper
dubbo.registry.client=curator
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
# 指定要掃描的包
dubbo.scan.base-packages=com.tom.bootdubboorderprovider.service
# dubbo監控設置爲自動獲取
dubbo.monitor.protocol=registry

5.1.3 修改啓動類

@SpringBootApplication
@EnableDubbo
public class BootDubboOrderProviderApplication {

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

5.1.4 實現類中使用

@DubboService
public class UserServiceImpl implements UserService {
    @Override
    public List<UserAddress> getUserAddressList(String userId) {
        UserAddress address1 = new UserAddress(1, "北京市", "1", "小王", "18030145000", "1");
        UserAddress address2 = new UserAddress(2, "杭州市", "2", "小北", "18030145999", "2");
        return Arrays.asList(address1, address2);
    }
}

 

5.2 消費者搭建

5.2.1 引入 maven 依賴

依賴於提供者相同

5.2.2 修改配置文件

server.port=8084
dubbo.application.name=dubbo-user-consumer
# 指定 zookeeper 註冊,使用 curator 客戶端
dubbo.registry.address=zookeeper://www.greattom.xyz:2181
dubbo.registry.protocol=zookeeper
dubbo.registry.client=curator
# dubbo監控設置爲自動獲取
dubbo.monitor.protocol=registry

5.2.3 修改啓動類

@SpringBootApplication
@EnableDubbo
public class BootDubboUserConsumerApplication {

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

}

5.2.4 實現類中使用

使用 @Reference 來調用 dubbo 上註冊的提供者


@Service
public class OrderServiceImpl implements OrderService {

    @DubboReference
    UserService userService;

    @Override
    public List<UserAddress> initOrder(String userId) {
        System.out.println("用戶ID: " + userId);
        List<UserAddress> addressList = userService.getUserAddressList(userId);
        for (UserAddress item : addressList) {
            System.out.println(item.getUserAddress());
        }
        return addressList;
    }

    @Override
    public String orderTest(String id) {
        return "order test!";
    }
}

 

5.3 Dubbo 配置解析


# 指定 dubbo 在 zookeeper 上註冊的服務名
dubbo.application.name=dubbo-user-consumer

# 指定 zookeeper 註冊中心,使用 curator 客戶端
dubbo.registry.address=zookeeper://www.greattom.xyz:2181
dubbo.registry.protocol=zookeeper
dubbo.registry.client=curator

# 設置 dubbo 在啓動時不檢查 zookeeper 上是否已經註冊了依賴
# 用於不同服務間的互相調用
dubbo.consumer.check=false

# 協議方式和端口,用於其他服務調用。
# 不同的服務端口不能相同
dubbo.protocol.name=dubbo
dubbo.protocol.port=20881

# 要暴露的包路徑
dubbo.scan.base-packages=com.tom.bootdubbouserconsumer

# dubbo監控設置爲自動獲取
dubbo.monitor.protocol=registry

 

六、Dubbo 詳細配置

官網文檔:http://dubbo.apache.org/zh-cn/docs/user/demos/preflight-check.html

6.1 配置覆蓋關係

6.1.1 配置優先級

  • 精確優先:方法級優先,接口次之,全局配置再次之
  • 消費方優先:若級別一致,則消費方優先,提供方次之

  

6.1.2 在Provider上儘量多配置Consumer屬性

  • 服務的提供者,比服務使用方更清楚服務性能參數,如調用的超時時間,合理的重試次數,等等
  • 在 provider 配置後,consumer 不配置則會使用 provider 的配置值,即 provider 配置可以作爲 consumer 的缺省值。否則,consumer 會使用 consumer 端的全局設置,這對於 provider 不可控的,並且往往是不合理的

 

6.2 啓動時檢查

 

6.3 超時時間配置

根據實際情況,修改 dubbo 訪問其他提供者的接口超時時間。Dubbo 默認超時時間爲 1 秒,在實際情況中 1 秒對於服務的請求速度要求很高,故應該根據實際情況進行統一或針對性修改

統一修改和針對性修改可以同時存在,且優先級:針對性修改 > 統一修改

6.3.1 統一修改

在 springboot 配置文件中增加:

dubbo.provider.timeout=3000

6.3.2 針對性修改

@DubboService(timeout = 5000)
@Service
public class OrderServiceImpl implements OrderService {

    @DubboReference(timeout = 3000)
    UserService userService;

    @Override
    public List<UserAddress> initOrder(String userId) throws InterruptedException {
        System.out.println("用戶ID: " + userId);
        List<UserAddress> addressList = userService.getUserAddressList(userId);
        for (UserAddress item : addressList) {
            System.out.println(item.getUserAddress());
        }
        return addressList;
    }
}

6.3.3 xml 修改

<dubbo:provider timeout="5000"></dubbo:provider>

 

6.4 重試次數配置

可以根據實際情況設置請求的重試次數,默認爲 3 次。爲實際配置值 N + 1

方法分類:

  • 冪等方法:無論多少次,只要請求數據不變,則響應結果最終都是同一個效果,如查詢、刪除、修改
  • 非冪等方法:每次運行都會產生新的效果,如數據庫新增

設置區別:

  • 冪等方法:設置重試次數
  • 非冪等方法:不能設置重試次數,設置爲0

6.4.2 xml 配置

統一配置:

<dubbo:provider timeout="2000" retries="5"></dubbo:provider>

針對方法配置:

<!-- 聲明需要暴露的服務接口 ref指向服務真正的實現對象 -->
<dubbo:service interface="com.tom.service.UserService" ref="userServiceImpl">
    <dubbo:method name="getUserAddressList" timeout="2000" retries="8"></dubbo:method>
</dubbo:service>

 

6.5 灰度發佈

6.5.1 概念

概念:https://blog.csdn.net/qq_42234452/article/details/90906692

dubbo多版本控制: http://dubbo.apache.org/zh-cn/docs/user/demos/multi-versions.html

6.5.2 適應場景

  • 當接口存在不兼容的升級時,要讓一部分用戶用新版本,又要支持老版本接口的使用,可以使用dubbo多版本控制
  • 當服務要更新時,無法確保線上服務更新正常,需要先進行測試,之後逐步將用戶流量指引向新版本

6.5.3 示例代碼

提供方:

<!-- 聲明需要暴露的服務接口 ref指向服務真正的實現對象 -->
<dubbo:service interface="com.tom.service.UserService" ref="userServiceImpl01" version="1.0.0">
    <dubbo:method name="getUserAddressList" timeout="2000" retries="8"></dubbo:method>
</dubbo:service>
<dubbo:service interface="com.tom.service.UserService" ref="userServiceImpl02" version="2.0.0">
    <dubbo:method name="getUserAddressList" timeout="2000" retries="8"></dubbo:method>
</dubbo:service>

<!-- 和本地bean一樣實現服務 -->
<bean id="userServiceImpl01" class="com.tom.service.impl.UserServiceImpl"/>
<bean id="userServiceImpl02" class="com.tom.service.impl.UserServiceImpl2"/>

調用方:

<!-- 生成遠程服務代理,可以和本地bean一樣使用demoService -->
<dubbo:reference interface="com.tom.service.UserService" id="userService" version="2.0.0"/>

 

6.6 本地存根

6.6.1 概念

遠程服務後,客戶端通常只剩下接口,而實現全在服務器端,但提供方有些時候想在客戶端也執行部分邏輯,比如:做 ThreadLocal 緩存,提前驗證參數,調用失敗後僞造容錯數據等等,此時就需要在 API 中帶上 Stub,客戶端生成 Proxy 實例,會把 Proxy 通過構造函數傳給 Stub [1],然後把 Stub 暴露給用戶,Stub 可以決定要不要去調 Proxy。

 

七、Springboot 整合 Dubbo  的三種方式

7.1 描述

SpringBoot 整合 Dubbo 的方式有:

  • 註解配置方式(常用):在 springboot 配置文件中配置相關內容,使用 @Service 和 @Reference 註解實現功能
  • xml配置方式(常用):使用 xml 配置文件,使用 @ImportResource 導入生效
  • 註解Api方式(知道):創建dubbo配置文件,依次註冊 dubbo 組件到項目中

7.2 三種方式對比

  註解配置方式 xml配置方式 註解API方式
配置方式 導入 dubbo-starter,在配置文件中進行配置,使用@Service暴露服務,使用@Reference引用服務 首先導入dubbo-starter,然後使用 @ImportResource 加載 xml 配置文件 創建統一的dubbo配置文件,將dubbo的每一個組件手動注入到springboot項目中
優點 配置快速方便 支持精確配置 支持精確配置
缺點 不支持精確配置,如針對 method 進行配置   配置繁瑣,不常用

 

八、常見的高可用場景

高可用即通過設計,減少系統不能提供服務的時間

 Dubbo 與 Zookeeper 的高可用有:

  • 監控中心宕機後不影響使用,只是丟失部分採樣數據
  • 數據庫宕掉後,註冊中心仍能通過緩存提供服務列表查詢, 但無法註冊新服務
  • 註冊中心對等集羣,任意一臺宕機後,將自動切換到另一臺
  • 註冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊,即 dubbo 直連
  • 服務提供者無狀態,任意一臺宕掉後,不影響使用
  • 服務提供者全部宕掉後,服務消費者將無法使用, 並無限次重試等待服務提供者恢復

 

8.1 Zookeeper 宕機與 dubbo 直連

8.1.1 本地緩存

當消費者調用過提供者的方法後,消費者會在本地存儲提供者的地址以及方法信息,故當 Zookeeper 宕機後消費者依舊可以消費提供者提供的服務

 

8.1.2 dubbo 直連

需要保證 provider 服務正常運行中

修改 consumer 配置,關閉 zookeeper 連接配置

進入管理界面查看提供者的地址信息

修改 consumer 的引用

可以正常調用了

 

8.2 Dubbo 負載均衡

8.2.1 四種負載均衡策略

Dubbo內置了4種負載均衡策略:

  • RandomLoadBalance:隨機負載均衡。隨機的選擇一個。是Dubbo的默認負載均衡策略。
  • RoundRobinLoadBalance:輪詢負載均衡。輪詢選擇一個。
  • LeastActiveLoadBalance:最少活躍調用數,相同活躍數的隨機。活躍數指調用前後計數差。使慢的 Provider 收到更少請求,因爲越慢的 Provider 的調用前後計數差會越大。
  • ConsistentHashLoadBalance:一致性哈希負載均衡。相同參數的請求總是落在同一臺機器上。

 

8.2.2 隨機負載均衡(或基於權重)

隨機負載均衡即隨機選擇一個節點進行請求,接下來主要介紹基於權重的隨機負載均衡

例如 orderService 是一個消費者,userService 是提供者,根據權重的不同,大致會有1/6的請求來帶A服務,3/6的請求會來到B服務,2/6的請求會來到C服務,並不是嚴格遵守比例,不能保證順序調用,只能夠保證大概一致

   

 

8.2.3 輪詢負載均衡(或基於權重)

輪詢負載均衡即在所有節點中間循環發送請求,接下來主要介紹基於權重的輪詢負載均衡

例如 orderService 是一個消費者,userService 是提供者,根據權重的不同,在一次完整的輪詢((100+300+200)/100 = 6次)中,A服務一定只會被輪詢到一次,B服務被輪詢到3次,C服務輪詢到2次

8.2.4 最少活躍數負載均衡

最少活躍數通俗來說就是將請求指向處理速度更快的提供者節點,讓請求速度更慢的節點收到更少的請求

例如 orderService 是一個消費者,userService 是提供者,根據響應時間的不同,請求會更多地指向A節點,B節點次之,C節點最少

  

8.2.5 一致性Hash負載均衡

一致性Hash是指將調用方法相同、參數相同的請求發送到同一個提供者節點中

例如 orderService 是一個消費者,userService 是提供者,則無論請求數量多少,id爲1的請求永遠發送到A服務,id爲2的請求永遠發送到B服務,id爲3的請求永遠發送到C服務。

 

8.3 負載均衡配置

8.3.1 設置負載均衡方法

8.3.2 設置權重

 

8.4 服務降級

8.4.1 概念

服務降級即當服務器壓力劇增的情況下,根據實際業務情況及流量,對一些服務和頁面有策略的不處理或換種簡單的方式處理,從而釋放服務器資源以保證核心交易正常運作或高效運作。

我們可以通過服務降級功能臨時屏蔽某個出錯的非關鍵業務,並定義降級後的返回策略

 

8.5 集羣容錯

8.5.1 概念和模式

在集羣調用失敗時,Dubbo 提供了多種容錯方案,默認爲 failover 重試

Failfast Cluster(默認)

快速失敗,只發起一次調用,失敗立即報錯。通常用於非冪等性的寫操作,比如新增記錄。

Failsafe Cluster

失敗安全,出現異常時,直接忽略。通常用於寫入審計日誌等操作。

Failback Cluster

失敗自動恢復,後臺記錄失敗請求,定時重發。通常用於消息通知操作。

Forking Cluster

並行調用多個服務器,只要一個成功即返回。通常用於實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks="2" 來設置最大並行數。

Broadcast Cluster

廣播調用所有提供者,逐個調用,任意一臺報錯則報錯 [2]。通常用於通知所有提供者更新緩存或日誌等本地資源信息。

 

8.5.2 修改方式

<dubbo:reference cluster="failsafe" />

 

8.5 集羣容錯結合 Hyxtrix

8.5.1 概念

Hystrix 旨在通過控制那些訪問遠程系統、服務和第三方庫的節點,從而對延遲和故障提供更強大的容錯能力。Hystrix 具備擁有回退機制和斷路器功能的線程和信號隔離,請求緩存和請求打包,以及監控和配置等功能

8.5.2 使用

消費者和提供者均引入依賴:

使用 EditStarters 插件,在 setting -> plugin 中搜索並安裝

按住 Alt + Insert

使用默認地址

自動添加

修改消費者和提供者的啓動類:

提供者方法修改:

消費者方法修改:

 

 

 

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