天天看點

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

文章目錄

  • 一、基礎知識
    • 1、分布式基礎理論
      • 1.1 什麼是分布式系統?
      • 1.2 發展演變
      • 1.3 RPC
    • 2、Dubbo核心概念
      • 2.1 簡介
      • 2.2 基本概念
    • 3、Dubbo環境搭建
      • 3.1 【Windows】- 安裝 zookeeper
      • 3.2 【Windows】- 安裝 dobbo-admin 管理控制台
      • 3.3 【Linux】- 安裝 zookeeper
        • 1、安裝jdk
        • 2、安裝 zookeeper
        • 3、開機啟動zookeeper
        • 4、配置zookeeper
      • 3.4 【Linux】- 安裝 dubbo-admin 管理控制台
        • 1、安裝Tomcat8(舊版dubbo-admin是war,新版是jar不需要安裝Tomcat)
        • 2、安裝 dubbo-admin
    • 4、dubbo-helloworld
      • 4.1 提出需求
      • 4.2 工程架構
        • 1、分包
        • 2、粒度
      • 4.3 建立子產品
        • 1、gmall-interface:公共接口層(model,server,exception...)
        • 2、gmall-user:使用者子產品(對使用者接口的實作)
        • 3、gmall-order-web:訂單子產品(調用使用者子產品)
      • 4.4 使用 dubbo 改造
        • 1、改造 gmall-user 作為服務提供者
        • 2、改造 gmall-order-web 作為服務消費者
        • 3、測試調用
        • 4、注解版
    • 5、監控中心
      • 5.1 dubbo-admin
      • 5.2 dubbo-monitor-simple
        • 1、安裝
        • 2、監控中心配置
    • 6、整合SpringBoot
  • 二、Dubbo配置
    • 1、配置原則
    • 2、重試次數
    • 3、逾時時間
      • 1、Dubbo 消費端
      • 2、Dubbo 服務端
      • 3、配置原則
      • 4、版本号
  • 三、高可用
    • 1、zookeeper 當機與 dubbo 直連
    • 2、叢集下dubbo負載均衡配置
    • 3、整合hystrix,服務熔斷與降級處理
      • 1、服務降級
      • 2、叢集容錯
      • 3、整合hystrix
        • 1、配置spring-cloud-starter-netflix-hystrix
        • 2、配置Provider端
        • 3、配置Consumer端
  • 四、dubbo原理
    • 1、RPC原理
    • 2、netty通信原理
    • 3、dubbo原理
      • 1、dubbo原理 -架構設計
      • 2、dubbo原理 -啟動解析、加載配置資訊
      • 3、dubbo原理 -服務暴露
      • 4、dubbo原理 -服務引用
      • 5、dubbo原理 -服務調用

一、基礎知識

1、分布式基礎理論

1.1 什麼是分布式系統?

《分布式系統原理與範型》定義:

“分布式系統是若幹獨立計算機的集合,這些計算機對于使用者來說就像單個相關系統”

分布式系統(distributed system)是建立在網絡之上的軟體系統。

        随着網際網路的發展,網站應用的規模不斷擴大,正常的垂直應用架構已無法應對,分布式服務架構以及流動計算架構勢在必行,亟需一個治理系統確定架構有條不紊的演進。

1.2 發展演變

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

單一應用架構

        當網站流量很小時,隻需一個應用,将所有功能都部署在一起,以減少部署節點和成本。此時,用于簡化增删改查工作量的資料通路架構(ORM)是關鍵。

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

适用于小型網站,小型管理系統,将所有功能都部署到一個功能裡,簡單易用。

缺點: 1、性能擴充比較難

            2、協同開發問題

            3、不利于更新維護

垂直應用架構

        當通路量逐漸增大,單一應用增加機器帶來的加速度越來越小,将應用拆成互不相幹的幾個應用,以提升效率。此時,用于加速前端頁面開發的Web架構(MVC)是關鍵。

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

        通過切分業務來實作各個子產品獨立部署,降低了維護和部署的難度,團隊各司其職更易管理,性能擴充也更友善,更有針對性。

缺點: 公用子產品無法重複利用,開發性的浪費

分布式服務架構

        當垂直應用越來越多,應用之間互動不可避免,将核心業務抽取出來,作為獨立的服務,逐漸形成穩定的服務中心,使前端應用能更快速的響應多變的市場需求。此時,用于提高業務複用及整合的 分布式服務架構(RPC) 是關鍵。

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

流動計算架構

        當服務越來越多,容量的評估,小服務資源的浪費等問題逐漸顯現,此時需增加一個排程中心基于通路壓力實時管理叢集容量,提高叢集使用率。此時,用于提高機器使用率的資源排程和治理中心(SOA)[ Service Oriented Architecture]是關鍵

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

1.3 RPC

什麼叫RPC

        RPC【Remote Procedure Call】是指遠端過程調用,是一種程序間通信方式,他是一種技術的思想,而不是規範。它允許程式調用另一個位址空間(通常是共享網絡的另一台機器上)的過程或函數,而不用程式員顯式編碼這個遠端調用的細節。即程式員無論是調用本地的還是遠端的函數,本質上編寫的調用代碼基本相同。

RPC基本原理

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

RPC兩個核心子產品:通訊,序列化

2、Dubbo核心概念

2.1 簡介

        Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC架構,它提供了三大核心能力:面向接口的遠端方法調用,智能容錯和負載均衡,以及服務自動注冊和發現。

官網:

http://dubbo.apache.org/

2.2 基本概念

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

        服務提供者(Provider):暴露服務的服務提供方,服務提供者在啟動時,向注冊中心注冊自己提供的服務。

        服務消費者(Consumer): 調用遠端服務的服務消費方,服務消費者在啟動時,向注冊中心訂閱自己所需的服務,服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

        注冊中心(Registry):注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者

        監控中心(Monitor):服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心

調用關系說明

        ✔服務容器負責啟動,加載,運作服務提供者。

        ✔服務提供者在啟動時,向注冊中心注冊自己提供的服務。

        ✔服務消費者在啟動時,向注冊中心訂閱自己所需的服務。

        ✔注冊中心傳回服務提供者位址清單給消費者,如果有變更,注冊中心将基于長連接配接推送變更資料給消費者。

        ✔服務消費者,從提供者位址清單中,基于軟負載均衡算法,選一台提供者進行調用,如果調用失敗,再選另一台調用。

        ✔服務消費者和提供者,在記憶體中累計調用次數和調用時間,定時每分鐘發送一次統計資料到監控中心。

3、Dubbo環境搭建

3.1 【Windows】- 安裝 zookeeper

1、下載下傳 zookeeper

網址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/

2、解壓 zookeeper

解壓運作zkServer.cmd ,初次運作會報錯,沒有zoo.cfg配置檔案

3、修改zoo.cfg配置檔案

将conf下的zoo_sample.cfg複制一份改名為zoo.cfg即可。

注意幾個重要位置:

dataDir=./ 臨時資料存儲的目錄(可寫相對路徑)

clientPort=2181 zookeeper的端口号

修改完成後再次啟動zookeeper

4、使用zkCli.cmd測試

ls /:列出zookeeper根下儲存的所有節點

create –e /atguigu 123:建立一個atguigu節點,值為123

get /atguigu:擷取/atguigu節點的值

3.2 【Windows】- 安裝 dobbo-admin 管理控制台

        dubbo本身并不是一個服務軟體。它其實就是一個jar包能夠幫你的java程式連接配接到zookeeper,并利用zookeeper消費、提供服務。是以你不用在Linux上啟動什麼dubbo服務。

        但是為了讓使用者更好的管理監控衆多的dubbo服務,官方提供了一個可視化的監控程式,不過這個監控即使不裝也不影響使用。

1、下載下傳dubbo-admin

https://github.com/apache/incubator-dubbo-ops

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、進入目錄,修改dubbo-admin配置

修改 src\main\resources\application.properties 指定zookeeper位址

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、打包dubbo-admin

mvn clean package -Dmaven.test.skip=true

4、運作dubbo-admin

java -jar dubbo-admin-0.0.1-SNAPSHOT.jar

注意:【有可能控制台看着啟動了,但是網頁打不開,需要在控制台按下ctrl+c即可】

預設使用root/root 登陸

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3.3 【Linux】- 安裝 zookeeper

1、安裝jdk

1、下載下傳jdk

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

不要使用wget指令擷取jdk連結,這是預設不同意,導緻下載下傳來的jdk壓縮内容錯誤

2、上傳到伺服器并解壓

3、設定環境變量

/usr/local/java/jdk1.8.0_171

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

檔案末尾加入下面配置

export JAVA_HOME=/usr/local/java/jdk1.8.0_171
export JRE_HOME=${JAVA_HOME}/jre
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${JAVA_HOME}/bin:$PATH
           
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

4、使環境變量生效&測試JDK

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、安裝 zookeeper

1、下載下傳zookeeper

網址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/

wget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.11/zookeeper-3.4.11.tar.gz

2、解壓

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、移動到指定位置并改名為zookeeper

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、開機啟動zookeeper

1)-複制如下腳本

#!/bin/bash
#chkconfig:2345 20 90
#description:zookeeper
#processname:zookeeper
ZK_PATH=/usr/local/zookeeper
export JAVA_HOME=/usr/local/java/jdk1.8.0_171
case $1 in
         start) sh  $ZK_PATH/bin/zkServer.sh start;;
         stop)  sh  $ZK_PATH/bin/zkServer.sh stop;;
         status) sh  $ZK_PATH/bin/zkServer.sh status;;
         restart) sh $ZK_PATH/bin/zkServer.sh restart;;
         *)  echo "require start|stop|status|restart"  ;;
esac
           
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2)-把腳本注冊為Service

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3)-增權重限

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

4、配置zookeeper

1、初始化zookeeper配置檔案

拷貝/usr/local/zookeeper/conf/zoo_sample.cfg

到同一個目錄下改個名字叫zoo.cfg

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、啟動zookeeper

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3.4 【Linux】- 安裝 dubbo-admin 管理控制台

1、安裝Tomcat8(舊版dubbo-admin是war,新版是jar不需要安裝Tomcat)

1、下載下傳Tomcat8并解壓

https://tomcat.apache.org/download-80.cgi

wget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz

2、解壓移動到指定位置

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、開機啟動tomcat8

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

複制如下腳本

#!/bin/bash
#chkconfig:2345 21 90
#description:apache-tomcat-8
#processname:apache-tomcat-8
CATALANA_HOME=/opt/apache-tomcat-8.5.32
export JAVA_HOME=/opt/java/jdk1.8.0_171
case $1 in
start)
    echo "Starting Tomcat..."  
    $CATALANA_HOME/bin/startup.sh
    ;;

stop)
    echo "Stopping Tomcat..."  
    $CATALANA_HOME/bin/shutdown.sh
    ;;

restart)
    echo "Stopping Tomcat..."  
    $CATALANA_HOME/bin/shutdown.sh
    sleep 2
    echo  
    echo "Starting Tomcat..."  
    $CATALANA_HOME/bin/startup.sh
    ;;
*)
    echo "Usage: tomcat {start|stop|restart}"  
    ;; esac
           

4、注冊服務&添權重限

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

5、啟動服務&通路tomcat測試

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、安裝 dubbo-admin

        見3.2 【Windows】- 安裝 dobbo-admin 管理控制台

4、dubbo-helloworld

4.1 提出需求

某個電商系統,訂單服務需要調用使用者服務擷取某個使用者的所有位址;

我們現在 需要建立兩個服務子產品進行測試

子產品 功能
訂單服務 Web 子產品 建立訂單等
使用者服務 service 子產品 查詢使用者位址

測試預期結果:

        訂單服務web子產品在A伺服器,使用者服務子產品在B伺服器,A可以遠端調用B的功能。

4.2 工程架構

根據 dubbo 《服務化最佳實踐》

1、分包

        建議将服務接口,服務模型,服務異常等均放在 API 包中,因為服務模型及異常也是 API 的一部分,同時,這樣做也符合分包原則:重用釋出等價原則(REP),共同重用原則(CRP)。

        如果需要,也可以考慮在 API 包中放置一份 spring 的引用配置,這樣使用方,隻需在 spring 加載過程中引用此配置即可,配置建議放在子產品的包目錄下,以免沖突,如:com/alibaba/china/xxx/dubbo-reference.xml。

2、粒度

        服務接口盡可能大粒度,每個服務方法應代表一個功能,而不是某功能的一個步驟,否則将面臨分布式事務問題,Dubbo 暫未提供分布式事務支援。

        服務接口建議以業務場景為機關劃分,并對相近業務做抽象,防止接口數量爆炸。

        不建議使用過于抽象的通用接口,如:Map query(Map),這樣的接口沒有明确語義,會給後期維護帶來不便。

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

4.3 建立子產品

1、gmall-interface:公共接口層(model,server,exception…)

作用:定義公共接口,也可以導入公共依賴

1、Bean模型

public class UserAddress implements Serializable{
    private Integer id;
    private String userAddress;
    private String userId;
    private String consignee;
    private String phoneNum;
    private String isDefault;
}
           

2、Service接口

UserService

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、gmall-user:使用者子產品(對使用者接口的實作)

1、pom.xml

<dependencies>
  	<dependency>
  		<groupId>com.atguigu.dubbo</groupId>
  		<artifactId>gmall-interface</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
  </dependencies>
           

2、Service

public class UserServiceImpl implements UserService {
		
	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		// TODO Auto-generated method stub
		return userAddressDao.getUserAddressById(userId);
	}

}
           

3、gmall-order-web:訂單子產品(調用使用者子產品)

1、pom.xml

<dependencies>
  	<dependency>
  		<groupId>com.atguigu.dubbo</groupId>
  		<artifactId>gmall-interface</artifactId>
  		<version>0.0.1-SNAPSHOT</version>
  	</dependency>
</dependencies>
           

2、測試

public class OrderService {
	
	UserService userService;
	
	/**
	 * 初始化訂單,查詢使用者的所有位址并傳回
	 * @param userId
	 * @return
	 */
	public List<UserAddress> initOrder(String userId){
		return userService.getUserAddressList(userId);
	}

}
           

        現在這樣是無法進行調用的。我們gmall-order-web引入了gmall-interface,但是interface的實作是gmall-user,我們并沒有引入,而且實際他可能還在别的伺服器中。

4.4 使用 dubbo 改造

1、改造 gmall-user 作為服務提供者

1、引導 dubbo

<!-- 引入dubbo -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
	<!-- 由于我們使用zookeeper作為注冊中心,是以需要操作zookeeper
		dubbo 2.6以前的版本引入zkclient操作zookeeper 
		dubbo 2.6及以後的版本引入curator操作zookeeper
		下面兩個zk用戶端根據dubbo版本2選1即可
	-->
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
		</dependency>
		<!-- curator-framework -->
		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-framework</artifactId>
			<version>2.12.0</version>
		</dependency>
           

2、配置提供者

<!--目前應用的名字  -->
	<dubbo:application name="gmall-user"></dubbo:application>
	<!--指定注冊中心的位址  -->
    <dubbo:registry address="zookeeper://118.24.44.169:2181" />
    <!--使用dubbo協定,将服務暴露在20880端口  -->
    <dubbo:protocol name="dubbo" port="20880" />
    <!-- 指定需要暴露的服務 -->
    <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl" />
           

3、啟動服務

public static void main(String[] args) throws IOException {
		ClassPathXmlApplicationContext context = 
				new ClassPathXmlApplicationContext("classpath:spring-beans.xml");
		
		System.in.read(); 
	}
           

2、改造 gmall-order-web 作為服務消費者

1、引入dubbo

<!-- 引入dubbo -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>dubbo</artifactId>
			<version>2.6.2</version>
		</dependency>
	<!-- 由于我們使用zookeeper作為注冊中心,是以需要引入zkclient和curator操作zookeeper -->
		<dependency>
			<groupId>com.101tec</groupId>
			<artifactId>zkclient</artifactId>
			<version>0.10</version>
		</dependency>
		<!-- curator-framework -->
		<dependency>
			<groupId>org.apache.curator</groupId>
			<artifactId>curator-framework</artifactId>
			<version>2.12.0</version>
		</dependency>
           

2、配置消費者資訊

<!-- 應用名 -->
	<dubbo:application name="gmall-order-web"></dubbo:application>
	<!-- 指定注冊中心位址 -->
	<dubbo:registry address="zookeeper://118.24.44.169:2181" />
	<!-- 生成遠端服務代理,可以和本地bean一樣使用demoService -->
	<dubbo:reference id="userService" interface="com.atguigu.gmall.service.UserService"></dubbo:reference>
           

3、測試調用

通路gmall-order-web的initOrder請求,會調用UserService擷取使用者位址;

調用成功。說明我們order已經可以調用遠端的UserService了;

4、注解版

1、服務提供方

<dubbo:application name="gmall-user"></dubbo:application>
<dubbo:registry address="zookeeper://118.24.44.169:2181" />
<dubbo:protocol name="dubbo" port="20880" />
<dubbo:annotation package="com.atguigu.gmall.user.impl"/>
           
import com.alibaba.dubbo.config.annotation.Service;
import com.atguigu.gmall.bean.UserAddress;
import com.atguigu.gmall.service.UserService;
import com.atguigu.gmall.user.mapper.UserAddressMapper;

@Service //使用dubbo提供的service注解,注冊暴露服務
public class UserServiceImpl implements UserService {

	@Autowired
	UserAddressMapper userAddressMapper;

}
           

2、服務消費方

<dubbo:application name="gmall-order-web"></dubbo:application>
<dubbo:registry address="zookeeper://118.24.44.169:2181" />
<dubbo:annotation package="com.atguigu.gmall.order.controller"/>
           
@Controller
public class OrderController {
	
	@Reference  //使用dubbo提供的reference注解引用遠端服務
	UserService userService;

}
           

5、監控中心

5.1 dubbo-admin

        圖形化的服務管理頁面;安裝時需要指定注冊中心位址,即可從注冊中心中擷取到所有的提供者/消費者進行配置管理

5.2 dubbo-monitor-simple

簡單的監控中心:

1、安裝

1、下載下傳 dubbo-ops

https://github.com/apache/incubator-dubbo-ops

2、修改配置指定注冊中心位址

進入 dubbo-monitor-simple\src\main\resources\conf

修改 dubbo.properties檔案

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、打包dubbo-monitor-simple

mvn clean package -Dmaven.test.skip=true

4、解壓 tar.gz 檔案,并運作start.bat

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

如果缺少servlet-api,自行導入servlet-api再通路監控中心

5、啟動通路8080

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、監控中心配置

所有服務配置連接配接監控中心,進行監控統計

<!-- 監控中心協定,如果為protocol="registry",表示從注冊中心發現監控中心位址,否則直連監控中心 -->
	
<dubbo:monitor protocol="registry"></dubbo:monitor>
           

Simple Monitor 挂掉不會影響到 Consumer 和 Provider 之間的調用,是以用于生産環境不會有風險。

Simple Monitor 采用磁盤存儲統計資訊,請注意安裝機器的磁盤限制,如果要叢集,建議用mount共享磁盤。

6、整合SpringBoot

1、引入spring-boot-starter以及dubbo和curator的依賴

<dependency>
    <groupId>com.alibaba.boot</groupId>
    <artifactId>dubbo-spring-boot-starter</artifactId>
    <version>0.2.0</version>
</dependency>
           

注意starter版本适配:

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

2、配置application.properties

提供者配置:

dubbo.application.name=gmall-user
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.67.159:2181
dubbo.scan.base-package=com.atguigu.gmall
dubbo.protocol.name=dubbo
           

application.name就是服務名,不能跟别的dubbo提供端重複

registry.protocol 是指定注冊中心協定

registry.address 是注冊中心的位址加端口号

protocol.name 是分布式固定是dubbo,不要改。

base-package 注解方式要掃描的包

消費者配置:

dubbo.application.name=gmall-order-web
dubbo.registry.protocol=zookeeper
dubbo.registry.address=192.168.67.159:2181
dubbo.scan.base-package=com.atguigu.gmall
dubbo.protocol.name=dubbo
           

3、dubbo注解

@Service、@Reference

【如果沒有在配置中寫dubbo.scan.base-package,還需要使用**@EnableDubbo**注解】

二、Dubbo配置

1、配置原則

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

JVM 啟動 -D 參數優先,這樣可以使使用者在部署和啟動時進行參數重寫,比如在啟動時需改變協定的端口。

XML 次之,如果在 XML 中有配置,則 dubbo.properties 中的相應配置項無效。

Properties 最後,相當于預設值,隻有 XML 沒有配置時,dubbo.properties 的相應配置項才會生效,通常用于共享公共配置,比如應用名。

2、重試次數

失敗自動切換,當出現失敗,重試其它伺服器,但重試會帶來更長延遲。可通過 retries=“2” 來設定重試次數(不含第一次)。.

重試次數配置如下:
<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
           

3、逾時時間

        由于網絡或服務端不可靠,會導緻調用出現一種不确定的中間狀态(逾時)。為了避免逾時導緻用戶端資源(線程)挂起耗盡,必須設定逾時時間。

1、Dubbo 消費端

全局逾時配置
<dubbo:consumer timeout="5000" />

指定接口以及特定方法逾時配置
<dubbo:reference interface="com.foo.BarService" timeout="2000">
    <dubbo:method name="sayHello" timeout="3000" />
</dubbo:reference>
           

2、Dubbo 服務端

全局逾時配置
<dubbo:provider timeout="5000" />

指定接口以及特定方法逾時配置
<dubbo:provider interface="com.foo.BarService" timeout="2000">
    <dubbo:method name="sayHello" timeout="3000" />
</dubbo:provider>
           

3、配置原則

dubbo推薦在Provider上盡量多配置Consumer端屬性:

        1、作服務的提供者,比服務使用方更清楚服務性能參數,如調用的逾時時間,合理的重試次數,等等

        2、在Provider配置後,Consumer不配置則會使用Provider的配置值,即Provider配置可以作為Consumer的預設值。否則,Consumer會使用Consumer端的全局設定,這對于Provider不可控的,并且往往是不合理的

配置的覆寫規則:

        1) 方法級配置别優于接口級别,即小Scope優先

        2) Consumer端配置 優于 Provider配置 優于 全局配置,

        3) 最後是Dubbo Hard Code的配置值(見配置文檔)

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

4、版本号

當一個接口實作,出現不相容更新時,可以用版本号過渡,版本号不同的服務互相間不引用。

可以按照以下的步驟進行版本遷移:

        在低壓力時間段,先更新一半提供者為新版本

        再将所有消費者更新為新版本

        然後将剩下的一半提供者更新為新版本

老版本服務提供者配置:

<dubbo:service interface=“com.foo.BarService” version=“1.0.0” />

新版本服務提供者配置:

<dubbo:service interface=“com.foo.BarService” version=“2.0.0” />

老版本服務消費者配置:

<dubbo:reference id=“barService” interface=“com.foo.BarService” version=“1.0.0” />

新版本服務消費者配置:

<dubbo:reference id=“barService” interface=“com.foo.BarService” version=“2.0.0” />

如果不需要區分版本,可以按照以下的方式配置:

<dubbo:reference id=“barService” inter*" />

三、高可用

1、zookeeper 當機與 dubbo 直連

現象:zookeeper注冊中心當機,還可以消費dubbo暴露的服務。

原因:

健壯性

        ●監控中心宕掉不影響使用,隻是丢失部分采樣資料

        ●資料庫宕掉後,注冊中心仍能通過緩存提供服務清單查詢,但不能注冊新服務

        ●注冊中心對等叢集,任意一台宕掉後,将自動切換到另一台

        ●注冊中心全部宕掉後,服務提供者和服務消費者仍能通過本地緩存通訊

        ●服務提供者無狀态,任意一台宕掉後,不影響使用

        ●服務提供者全部宕掉後,服務消費者應用将無法使用,并無限次重連等待服務提供者恢複

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

2、叢集下dubbo負載均衡配置

在叢集負載均衡時,Dubbo 提供了多種均衡政策,預設為 random 随機調用。

負載均衡政策

Random LoadBalance

随機,按權重設定随機機率。

在一個截面上碰撞的機率高,但調用量越大分布越均勻,而且按機率使用權重後也比較均勻,有利于動态調整提供者權重。

RoundRobin LoadBalance

輪循,按公約後的權重設定輪循比率。

存在慢的提供者累積請求的問題,比如:第二台機器很慢,但沒挂,當請求調到第二台時就卡在那,久而久之,所有請求都卡在調到第二台上。

LeastActive LoadBalance

最少活躍調用數,相同活躍數的随機,活躍數指調用前後計數差。

使慢的提供者收到更少請求,因為越慢的提供者的調用前後計數差會越大。

ConsistentHash LoadBalance

一緻性 Hash,相同參數的請求總是發到同一提供者。

當某一台提供者挂時,原本發往該提供者的請求,基于虛拟節點,平攤到其它提供者,不會引起劇烈變動。算法參見:http://en.wikipedia.org/wiki/Consistent_hashing

預設隻對第一個參數 Hash,如果要修改,請配置 <dubbo:parameter key=“hash.arguments” value=“0,1” />

預設用 160 份虛拟節點,如果要修改,請配置 <dubbo:parameter key=“hash.nodes” value=“320” />

3、整合hystrix,服務熔斷與降級處理

1、服務降級

什麼是服務降級?

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

可以通過服務降級功能臨時屏蔽某個出錯的非關鍵服務,并定義降級後的傳回政策。

向注冊中心寫入動态配置覆寫規則:

RegistryFactory registryFactory = ExtensionLoader.getExtensionLoader(RegistryFactory.class).getAdaptiveExtension();
Registry registry = registryFactory.getRegistry(URL.valueOf("zookeeper://10.20.153.10:2181"));
registry.register(URL.valueOf("override://0.0.0.0/com.foo.BarService?category=configurators&dynamic=false&application=foo&mock=force:return+null"));
           

其中:

        ●mock=force:return+null 表示消費方對該服務的方法調用都直接傳回 null 值,不發起遠端調用。用來屏蔽不重要服務不可用時對調用方的影響。

        ●還可以改為 mock=fail:return+null 表示消費方對該服務的方法調用在失敗後,再傳回 null 值,不抛異常。用來容忍不重要服務不穩定時對調用方的影響。

2、叢集容錯

在叢集調用失敗時,Dubbo 提供了多種容錯方案,預設為 failover 重試。

叢集容錯模式

Failover Cluster

失敗自動切換,當出現失敗,重試其它伺服器。通常用于讀操作,但重試會帶來更長延遲。可通過 retries=“2” 來設定重試次數(不含第一次)。

重試次數配置如下:

<dubbo:service retries="2" />
或
<dubbo:reference retries="2" />
或
<dubbo:reference>
    <dubbo:method name="findFoo" retries="2" />
</dubbo:reference>
           

Failfast Cluster

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

Failsafe Cluster

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

Failback Cluster

失敗自動恢複,背景記錄失敗請求,定時重發。通常用于消息通知操作。

Forking Cluster

并行調用多個伺服器,隻要一個成功即傳回。通常用于實時性要求較高的讀操作,但需要浪費更多服務資源。可通過 forks=“2” 來設定最大并行數。

Broadcast Cluster

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

叢集模式配置

按照以下示例在服務提供方和消費方配置叢集模式

<dubbo:service cluster="failsafe" />
或
<dubbo:reference cluster="failsafe" />
           

3、整合hystrix

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

1、配置spring-cloud-starter-netflix-hystrix

spring boot官方提供了對hystrix的內建,直接在pom.xml裡加入依賴:

<dependency>
	<groupId>org.springframework.cloud</groupId>
	<artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
	<version>1.4.4.RELEASE</version>
</dependency>
           

然後在Application類上增加@EnableHystrix來啟用hystrix starter:

@SpringBootApplication
@EnableHystrix
public class ProviderApplication {
           

2、配置Provider端

在Dubbo的Provider上增加@HystrixCommand配置,這樣子調用就會經過Hystrix代理。

@Service(version = "1.0.0")
public class HelloServiceImpl implements HelloService {
    @HystrixCommand(commandProperties = {
     @HystrixProperty(name = "circuitBreaker.requestVolumeThreshold", value = "10"),
     @HystrixProperty(name = "execution.isolation.thread.timeoutInMilliseconds", value = "2000") })
    @Override
    public String sayHello(String name) {
        // System.out.println("async provider received: " + name);
        // return "annotation: hello, " + name;
        throw new RuntimeException("Exception to show hystrix enabled.");
    }
}
           

3、配置Consumer端

        對于Consumer端,則可以增加一層method調用,并在method上配置@HystrixCommand。當調用出錯時,會走到fallbackMethod = "reliable"的調用裡。

@Reference(version = "1.0.0")
    private HelloService demoService;

    @HystrixCommand(fallbackMethod = "reliable")
    public String doSayHello(String name) {
        return demoService.sayHello(name);
    }
    public String reliable(String name) {
        return "hystrix fallback value";
    }
           

四、dubbo原理

1、RPC原理

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

一次完整的RPC調用流程(同步調用,異步另說)如下:

        1)服務消費方(client)調用以本地調用方式調用服務;

        2)client stub接收到調用後負責将方法、參數等組裝成能夠進行網絡傳輸的消息體;

        3)client stub找到服務位址,并将消息發送到服務端;

        4)server stub收到消息後進行解碼;

        5)server stub根據解碼結果調用本地的服務;

        6)本地服務執行并将結果傳回給server stub;

        7)server stub将傳回結果打包成消息并發送至消費方;

        8)client stub接收到消息,并進行解碼;

        9)服務消費方得到最終結果。

RPC架構的目标就是要2~8這些步驟都封裝起來,這些細節對使用者來說是透明的,不可見的。

2、netty通信原理

        Netty是一個異步事件驅動的網絡應用程式架構, 用于快速開發可維護的高性能協定伺服器和用戶端。它極大地簡化并簡化了TCP和UDP套接字伺服器等網絡程式設計。

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理
Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

Selector 一般稱 為選擇器 ,也可以翻譯為 多路複用器,

Connect(連接配接就緒)、Accept(接受就緒)、Read(讀就緒)、Write(寫就緒)

Netty基本原理:

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、dubbo原理

1、dubbo原理 -架構設計

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

        ●config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類

        ●proxy 服務代理層:服務接口透明代理,生成服務的用戶端 Stub 和伺服器端 Skeleton, 以 ServiceProxy 為中心,擴充接口為 ProxyFactory

        ●registry 注冊中心層:封裝服務位址的注冊與發現,以服務 URL 為中心,擴充接口為 RegistryFactory, Registry, RegistryService

        ●cluster 路由層:封裝多個提供者的路由及負載均衡,并橋接注冊中心,以 Invoker 為中心,擴充接口為 Cluster, Directory, Router, LoadBalance

        ●monitor 監控層:RPC 調用次數和調用時間監控,以 Statistics 為中心,擴充接口為 MonitorFactory, Monitor, MonitorService

        ●protocol 遠端調用層:封裝 RPC 調用,以 Invocation, Result 為中心,擴充接口為 Protocol, Invoker, Exporter

        ●exchange 資訊交換層:封裝請求響應模式,同步轉異步,以 Request, Response 為中心,擴充接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServer

        ●transport 網絡傳輸層:抽象 mina 和 netty 為統一接口,以 Message 為中心,擴充接口為 Channel, Transporter, Client, Server, Codec

        ●serialize 資料序列化層:可複用的一些工具,擴充接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool

2、dubbo原理 -啟動解析、加載配置資訊

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

3、dubbo原理 -服務暴露

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

4、dubbo原理 -服務引用

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

5、dubbo原理 -服務調用

Dubbo -- 入門一、基礎知識二、Dubbo配置三、高可用四、dubbo原理

繼續閱讀