欧美free性护士vide0shd,老熟女,一区二区三区,久久久久夜夜夜精品国产,久久久久久综合网天天,欧美成人护士h版

首頁綜合 正文
目錄

柚子快報激活碼778899分享:RPC框架dubbo的學(xué)習(xí)

FNAC文化購綜合2025-05-05220

柚子快報激活碼778899分享:RPC框架dubbo的學(xué)習(xí)

http://yzkb.51969.com/

一、基礎(chǔ)知識

1、分布式基礎(chǔ)理論

1.1)、什么是分布式系統(tǒng)?

《分布式系統(tǒng)原理與范型》定義:

“分布式系統(tǒng)是若干獨立計算機的集合,這些計算機對于用戶來說就像單個相關(guān)系統(tǒng)”

分布式系統(tǒng)(distributed system)是建立在網(wǎng)絡(luò)之上的軟件系統(tǒng)。

隨著互聯(lián)網(wǎng)的發(fā)展,網(wǎng)站應(yīng)用的規(guī)模不斷擴大,常規(guī)的垂直應(yīng)用架構(gòu)已無法應(yīng)對,分布式服務(wù)架構(gòu)以及流動計算架構(gòu)勢在必行,亟需一個治理系統(tǒng)確保架構(gòu)有條不紊的演進。

1.2)、發(fā)展演變

單一應(yīng)用架構(gòu)

當(dāng)網(wǎng)站流量很小時,只需一個應(yīng)用,將所有功能都部署在一起,以減少部署節(jié)點和成本。此時,用于簡化增刪改查工作量的數(shù)據(jù)訪問框架(ORM)是關(guān)鍵。

適用于小型網(wǎng)站,小型管理系統(tǒng),將所有功能都部署到一個功能里,簡單易用。

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

2、協(xié)同開發(fā)問題

3、不利于升級維護

垂直應(yīng)用架構(gòu)

當(dāng)訪問量逐漸增大,單一應(yīng)用增加機器帶來的加速度越來越小,將應(yīng)用拆成互不相干的幾個應(yīng)用,以提升效率。此時,用于加速前端頁面開發(fā)的Web框架(MVC)是關(guān)鍵。

通過切分業(yè)務(wù)來實現(xiàn)各個模塊獨立部署,降低了維護和部署的難度,團隊各司其職更易管理,性能擴展也更方便,更有針對性。

缺點: 公用模塊無法重復(fù)利用,開發(fā)性的浪費

分布式服務(wù)架構(gòu)

當(dāng)垂直應(yīng)用越來越多,應(yīng)用之間交互不可避免,將核心業(yè)務(wù)抽取出來,作為獨立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,使前端應(yīng)用能更快速的響應(yīng)多變的市場需求。此時,用于提高業(yè)務(wù)復(fù)用及整合的分布式服務(wù)框架(RPC) 是關(guān)鍵。

流動計算架構(gòu)

當(dāng)服務(wù)越來越多,容量的評估,小服務(wù)資源的浪費等問題逐漸顯現(xiàn),此時需增加一個調(diào)度中心基于訪問壓力實時管理集群容量,提高集群利用率。此時,用于提高機器利用率的資源調(diào)度和治理中心 (SOA)[ Service Oriented Architecture] 是關(guān)鍵。

1.3)、RPC

什么叫RPC

RPC【Remote Procedure Call】是指遠(yuǎn)程過程調(diào)用,是一種進程間通信方式,他是一種技術(shù)的思想,而不是規(guī)范。它允許程序調(diào)用另一個地址空間(通常是共享網(wǎng)絡(luò)的另一臺機器上)的過程或函數(shù),而不用程序員顯式編碼這個遠(yuǎn)程調(diào)用的細(xì)節(jié)。即程序員無論是調(diào)用本地的還是遠(yuǎn)程的函數(shù),本質(zhì)上編寫的調(diào)用代碼基本相同。

RPC基本原理

RPC兩個核心模塊:通訊,序列化。

2、dubbo核心概念

2.1)、簡介

Apache Dubbo (incubating) |?d?b??| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠(yuǎn)程方法調(diào)用,智能容錯和負(fù)載均衡,以及服務(wù)自動注冊和發(fā)現(xiàn)。

官網(wǎng):

http://dubbo.apache.org/

2.2)、基本概念

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

服務(wù)消費者(Consumer) : 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費方,服務(wù)消費者在啟動時,向注冊中心訂閱自己所需的服務(wù),服務(wù)消費者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。

注冊中心(Registry) :注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者

監(jiān)控中心(Monitor) :服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心

調(diào)用關(guān)系說明服務(wù)容器負(fù)責(zé)啟動,加載,運行服務(wù)提供者。服務(wù)提供者在啟動時,向注冊中心注冊自己提供的服務(wù)。服務(wù)消費者在啟動時,向注冊中心訂閱自己所需的服務(wù)。注冊中心返回服務(wù)提供者地址列表給消費者,如果有變更,注冊中心將基于長連接推送變更數(shù)據(jù)給消費者。服務(wù)消費者,從提供者地址列表中,基于軟負(fù)載均衡算法,選一臺提供者進行調(diào)用,如果調(diào)用失敗,再選另一臺調(diào)用。服務(wù)消費者和提供者,在內(nèi)存中累計調(diào)用次數(shù)和調(diào)用時間,定時每分鐘發(fā)送一次統(tǒng)計數(shù)據(jù)到監(jiān)控中心。

3、dubbo環(huán)境搭建

3.1)、【windows】-安裝zookeeper

1、下載zookeeper網(wǎng)址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/2、解壓zookeeper解壓運行zkServer.cmd ,初次運行會報錯,沒有zoo.cfg配置文件3、修改zoo.cfg配置文件將conf下的zoo_sample.cfg復(fù)制一份改名為zoo.cfg即可。注意幾個重要位置:dataDir=./ 臨時數(shù)據(jù)存儲的目錄(可寫相對路徑)clientPort=2181 zookeeper的端口號修改完成后再次啟動zookeeper4、使用zkCli.cmd測試ls /:列出zookeeper根下保存的所有節(jié)點create –e /atguigu 123:創(chuàng)建一個atguigu節(jié)點,值為123get /atguigu:獲取/atguigu節(jié)點的值

3.2)、【windows】-安裝dubbo-admin管理控制臺

dubbo本身并不是一個服務(wù)軟件。它其實就是一個jar包能夠幫你的java程序連接到zookeeper,并利用zookeeper消費、提供服務(wù)。所以你不用在Linux上啟動什么dubbo服務(wù)。

但是為了讓用戶更好的管理監(jiān)控眾多的dubbo服務(wù),官方提供了一個可視化的監(jiān)控程序,不過這個監(jiān)控即使不裝也不影響使用。

1、下載dubbo-adminhttps://github.com/apache/incubator-dubbo-ops2、進入目錄,修改dubbo-admin配置修改 src\main\resources\application.properties 指定zookeeper地址3、打包dubbo-adminmvn clean package -Dmaven.test.skip=true4、運行dubbo-adminjava -jar dubbo-admin-0.0.1-SNAPSHOT.jar**注意:【有可能控制臺看著啟動了,但是網(wǎng)頁打不開,需要在控制臺按下ctrl+c即可】**默認(rèn)使用root/root 登陸

3.3)、【linux】-安裝zookeeper

1、安裝jdk

1、下載jdkhttp://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html不要使用wget命令獲取jdk鏈接,這是默認(rèn)不同意,導(dǎo)致下載來的jdk壓縮內(nèi)容錯誤2、上傳到服務(wù)器并解壓3、設(shè)置環(huán)境變量/usr/local/java/jdk1.8.0_171文件末尾加入下面配置export JAVA_HOME=/usr/local/java/jdk1.8.0_171export JRE_HOME=

J

A

V

A

H

O

M

E

/

j

r

e

e

x

p

o

r

t

C

L

A

S

S

P

A

T

H

=

.

:

{JAVA_HOME}/jreexport CLASSPATH=.:

JAVAH?OME/jreexportCLASSPATH=.:{JAVA_HOME}/lib:

J

R

E

H

O

M

E

/

l

i

b

e

x

p

o

r

t

P

A

T

H

=

{JRE_HOME}/libexport PATH=

JREH?OME/libexportPATH={JAVA_HOME}/bin:$PATH4、使環(huán)境變量生效&測試JDK

2、安裝zookeeper

1、下載zookeeper網(wǎng)址 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.gz2、解壓3、移動到指定位置并改名為zookeeper

3、開機啟動zookeeper

| 1)-復(fù)制如下腳本#!/bin/bash#chkconfig:2345 20 90#description:zookeeper#processname:zookeeperZK_PATH=/usr/local/zookeeperexport JAVA_HOME=/usr/local/java/jdk1.8.0_171case $1 instart) 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” ;;esac2)-把腳本注冊為Service3)-增加權(quán)限 | | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

4、配置zookeeper

1、初始化zookeeper配置文件拷貝/usr/local/zookeeper/conf/zoo_sample.cfg到同一個目錄下改個名字叫zoo.cfg2、啟動zookeeper

3.4)、【linux】-安裝dubbo-admin管理控制臺

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

1、下載Tomcat8并解壓https://tomcat.apache.org/download-80.cgiwget http://mirrors.shu.edu.cn/apache/tomcat/tomcat-8/v8.5.32/bin/apache-tomcat-8.5.32.tar.gz2、解壓移動到指定位置3、開機啟動tomcat8復(fù)制如下腳本#!/bin/bash#chkconfig:2345 21 90#description:apache-tomcat-8#processname:apache-tomcat-8CATALANA_HOME=/opt/apache-tomcat-8.5.32export JAVA_HOME=/opt/java/jdk1.8.0_171case

1

i

n

s

t

a

r

t

)

e

c

h

o

"

S

t

a

r

t

i

n

g

T

o

m

c

a

t

.

.

.

"

1 instart)echo "Starting Tomcat..."

1instart)echo"StartingTomcat..."CATALANA_HOME/bin/startup.sh;;stop)echo "Stopping Tomcat…"

C

A

T

A

L

A

N

A

H

O

M

E

/

b

i

n

/

s

h

u

t

d

o

w

n

.

s

h

;

;

r

e

s

t

a

r

t

)

e

c

h

o

"

S

t

o

p

p

i

n

g

T

o

m

c

a

t

.

.

.

"

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

CATALANAH?OME/bin/shutdown.sh;;restart)echo"StoppingTomcat..."CATALANA_HOME/bin/shutdown.shsleep 2echoecho “Starting Tomcat…”$CATALANA_HOME/bin/startup.sh;;*)echo "Usage: tomcat {start4、注冊服務(wù)&添加權(quán)限5、啟動服務(wù)&訪問tomcat測試

2、安裝dubbo-admin

dubbo本身并不是一個服務(wù)軟件。它其實就是一個jar包能夠幫你的java程序連接到zookeeper,并利用zookeeper消費、提供服務(wù)。所以你不用在Linux上啟動什么dubbo服務(wù)。

但是為了讓用戶更好的管理監(jiān)控眾多的dubbo服務(wù),官方提供了一個可視化的監(jiān)控程序,不過這個監(jiān)控即使不裝也不影響使用。

1、下載dubbo-adminhttps://github.com/apache/incubator-dubbo-ops2、進入目錄,修改dubbo-admin配置修改 src\main\resources\application.properties 指定zookeeper地址3、打包dubbo-adminmvn clean package -Dmaven.test.skip=true4、運行dubbo-adminjava -jar dubbo-admin-0.0.1-SNAPSHOT.jar默認(rèn)使用root/root 登陸

4、dubbo-helloworld

4.1)、提出需求

某個電商系統(tǒng),訂單服務(wù)需要調(diào)用用戶服務(wù)獲取某個用戶的所有地址;

我們現(xiàn)在 需要創(chuàng)建兩個服務(wù)模塊進行測試

模塊功能訂單服務(wù)web模塊創(chuàng)建訂單等用戶服務(wù)service模塊查詢用戶地址等

測試預(yù)期結(jié)果:

訂單服務(wù)web模塊在A服務(wù)器,用戶服務(wù)模塊在B服務(wù)器,A可以遠(yuǎn)程調(diào)用B的功能。

4.2)、工程架構(gòu)

根據(jù) dubbo《服務(wù)化最佳實踐》

1、分包

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

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

2、粒度

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

服務(wù)接口建議以業(yè)務(wù)場景為單位劃分,并對相近業(yè)務(wù)做抽象,防止接口數(shù)量爆炸。

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

4.3)、創(chuàng)建模塊

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

作用:定義公共接口,也可以導(dǎo)入公共依賴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;}3、Service接口UserServicepublic List getUserAddressList(String userId)

2、gmall-user:用戶模塊(對用戶接口的實現(xiàn))

1、pom.xmlcom.atguigu.dubbogmall-interface0.0.1-SNAPSHOT2、Servicepublic class UserServiceImpl implements UserService {@Overridepublic List getUserAddressList(String userId) {// TODO Auto-generated method stubreturn userAddressDao.getUserAddressById(userId);}}

4、gmall-order-web:訂單模塊(調(diào)用用戶模塊)

1、pom.xmlcom.atguigu.dubbogmall-interface0.0.1-SNAPSHOT2、測試public class OrderService {UserService userService;/*** 初始化訂單,查詢用戶的所有地址并返回* @param userId* @return*/public List initOrder(String userId){return userService.getUserAddressList(userId);}}

現(xiàn)在這樣是無法進行調(diào)用的。我們gmall-order-web引入了gmall-interface,但是interface的實現(xiàn)是gmall-user,我們并沒有引入,而且實際他可能還在別的服務(wù)器中。

4.4)、使用dubbo改造

1、改造gmall-user作為服務(wù)提供者

1、引入dubbo

com.alibabadubbo2.6.2

com.101teczkclient0.10

org.apache.curatorcurator-framework2.12.02、配置提供者

3、啟動服務(wù)public static void main(String[] args) throws IOException {ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext(“classpath:spring-beans.xml”);System.in.read();}

2、改造gmall-order-web作為服務(wù)消費者

1、引入dubbo

com.alibabadubbo2.6.2

com.101teczkclient0.10

org.apache.curatorcurator-framework2.12.02、配置消費者信息

3、測試調(diào)用

訪問gmall-order-web的initOrder請求,會調(diào)用UserService獲取用戶地址;

調(diào)用成功。說明我們order已經(jīng)可以調(diào)用遠(yuǎn)程的UserService了;

4、注解版

1、服務(wù)提供方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注解,注冊暴露服務(wù)****public** class UserServiceImpl implements UserService {@AutowiredUserAddressMapper userAddressMapper;2、服務(wù)消費方@Controllerpublic class OrderController {@Reference //使用dubbo提供的reference注解引用遠(yuǎn)程服務(wù)UserService userService;

5、監(jiān)控中心

5.1)、dubbo-admin

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

5.2)、dubbo-monitor-simple

簡單的監(jiān)控中心;

1、安裝

1、下載 dubbo-opshttps://github.com/apache/incubator-dubbo-ops2、修改配置指定注冊中心地址進入 dubbo-monitor-simple\src\main\resources\conf修改 dubbo.properties文件3、打包dubbo-monitor-simplemvn clean package -Dmaven.test.skip=true4、解壓 tar.gz 文件,并運行start.bat如果缺少servlet-api,自行導(dǎo)入servlet-api再訪問監(jiān)控中心5、啟動訪問8080

2、監(jiān)控中心配置

所有服務(wù)配置連接監(jiān)控中心,進行監(jiān)控統(tǒng)計

Simple Monitor 掛掉不會影響到 Consumer 和 Provider 之間的調(diào)用,所以用于生產(chǎn)環(huán)境不會有風(fēng)險。

Simple Monitor 采用磁盤存儲統(tǒng)計信息,請注意安裝機器的磁盤限制,如果要集群,建議用mount共享磁盤。

6、整合SpringBoot

1、引入spring-boot-starter以及dubbo和curator的依賴com.alibaba.bootdubbo-spring-boot-starter0.2.0注意starter版本適配: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=dubboapplication.name就是服務(wù)名,不能跟別的dubbo提供端重復(fù)registry.protocol 是指定注冊中心協(xié)議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=dubbo3、dubbo注解@Service、@Reference**【如果沒有在配置中寫** dubbo.scan.base-package, 還需要使用@EnableDubbo注解】

二、dubbo配置

1、配置原則

JVM 啟動 -D 參數(shù)優(yōu)先,這樣可以使用戶在部署和啟動時進行參數(shù)重寫,比如在啟動時需改變協(xié)議的端口。

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

Properties 最后,相當(dāng)于缺省值,只有 XML 沒有配置時,dubbo.properties 的相應(yīng)配置項才會生效,通常用于共享公共配置,比如應(yīng)用名。

2、重試次數(shù)

失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器,但重試會帶來更長延遲??赏ㄟ^ retries=“2” 來設(shè)置重試次數(shù)(不含第一次)。

重試次數(shù)配置如下:或dubbo:reference

3、超時時間

由于網(wǎng)絡(luò)或服務(wù)端不可靠,會導(dǎo)致調(diào)用出現(xiàn)一種不確定的中間狀態(tài)(超時)。為了避免超時導(dǎo)致客戶端資源(線程)掛起耗盡,必須設(shè)置超時時間。

1、Dubbo消費端

全局超時配置指定接口以及特定方法超時配置

2、Dubbo服務(wù)端

全局超時配置指定接口以及特定方法超時配置

3、配置原則

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

1、作服務(wù)的提供者,比服務(wù)使用方更清楚服務(wù)性能參數(shù),如調(diào)用的超時時間,合理的重試次數(shù),等等2、在Provider配置后,Consumer不配置則會使用Provider的配置值,即Provider配置可以作為Consumer的缺省值。否則,Consumer會使用Consumer端的全局設(shè)置,這對于Provider不可控的,并且往往是不合理的

配置的覆蓋規(guī)則:

方法級配置別優(yōu)于接口級別,即小Scope優(yōu)先 Consumer端配置 優(yōu)于 Provider配置 優(yōu)于 全局配置, 最后是Dubbo Hard Code的配置值(見配置文檔)

4、版本號

當(dāng)一個接口實現(xiàn),出現(xiàn)不兼容升級時,可以用版本號過渡,版本號不同的服務(wù)相互間不引用。

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

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

再將所有消費者升級為新版本

然后將剩下的一半提供者升級為新版本

老版本服務(wù)提供者配置:新版本服務(wù)提供者配置:老版本服務(wù)消費者配置:新版本服務(wù)消費者配置:如果不需要區(qū)分版本,可以按照以下的方式配置:

三、高可用

1、zookeeper宕機與dubbo直連

現(xiàn)象:zookeeper注冊中心宕機,還可以消費dubbo暴露的服務(wù)。

原因:

| 健壯性- 監(jiān)控中心宕掉不影響使用,只是丟失部分采樣數(shù)據(jù)

數(shù)據(jù)庫宕掉后,注冊中心仍能通過緩存提供服務(wù)列表查詢,但不能注冊新服務(wù)注冊中心對等集群,任意一臺宕掉后,將自動切換到另一臺注冊中心全部宕掉后,服務(wù)提供者和服務(wù)消費者仍能通過本地緩存通訊服務(wù)提供者無狀態(tài),任意一臺宕掉后,不影響使用服務(wù)提供者全部宕掉后,服務(wù)消費者應(yīng)用將無法使用,并無限次重連等待服務(wù)提供者恢復(fù) | | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |

高可用:通過設(shè)計,減少系統(tǒng)不能提供服務(wù)的時間;

2、集群下dubbo負(fù)載均衡配置

在集群負(fù)載均衡時,Dubbo 提供了多種均衡策略,缺省為 random 隨機調(diào)用。

負(fù)載均衡策略

Random LoadBalance隨機,按權(quán)重設(shè)置隨機概率。在一個截面上碰撞的概率高,但調(diào)用量越大分布越均勻,而且按概率使用權(quán)重后也比較均勻,有利于動態(tài)調(diào)整提供者權(quán)重。RoundRobin LoadBalance輪循,按公約后的權(quán)重設(shè)置輪循比率。存在慢的提供者累積請求的問題,比如:第二臺機器很慢,但沒掛,當(dāng)請求調(diào)到第二臺時就卡在那,久而久之,所有請求都卡在調(diào)到第二臺上。LeastActive LoadBalance最少活躍調(diào)用數(shù),相同活躍數(shù)的隨機,活躍數(shù)指調(diào)用前后計數(shù)差。使慢的提供者收到更少請求,因為越慢的提供者的調(diào)用前后計數(shù)差會越大。ConsistentHash LoadBalance一致性 Hash,相同參數(shù)的請求總是發(fā)到同一提供者。當(dāng)某一臺提供者掛時,原本發(fā)往該提供者的請求,基于虛擬節(jié)點,平攤到其它提供者,不會引起劇烈變動。算法參見:http://en.wikipedia.org/wiki/Consistent_hashing缺省只對第一個參數(shù) Hash,如果要修改,請配置 缺省用 160 份虛擬節(jié)點,如果要修改,請配置

3、整合hystrix,服務(wù)熔斷與降級處理

1、服務(wù)降級

什么是服務(wù)降級?

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

可以通過服務(wù)降級功能臨時屏蔽某個出錯的非關(guān)鍵服務(wù),并定義降級后的返回策略。

向注冊中心寫入動態(tài)配置覆蓋規(guī)則:

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 表示消費方對該服務(wù)的方法調(diào)用都直接返回 null 值,不發(fā)起遠(yuǎn)程調(diào)用。用來屏蔽不重要服務(wù)不可用時對調(diào)用方的影響。還可以改為 mock=fail:return+null 表示消費方對該服務(wù)的方法調(diào)用在失敗后,再返回 null 值,不拋異常。用來容忍不重要服務(wù)不穩(wěn)定時對調(diào)用方的影響。

2、集群容錯

在集群調(diào)用失敗時,Dubbo 提供了多種容錯方案,缺省為 failover 重試。

集群容錯模式

Failover Cluster失敗自動切換,當(dāng)出現(xiàn)失敗,重試其它服務(wù)器。通常用于讀操作,但重試會帶來更長延遲??赏ㄟ^ retries=“2” 來設(shè)置重試次數(shù)(不含第一次)。重試次數(shù)配置如下:或dubbo:referenceFailfast Cluster快速失敗,只發(fā)起一次調(diào)用,失敗立即報錯。通常用于非冪等性的寫操作,比如新增記錄。Failsafe Cluster失敗安全,出現(xiàn)異常時,直接忽略。通常用于寫入審計日志等操作。Failback Cluster失敗自動恢復(fù),后臺記錄失敗請求,定時重發(fā)。通常用于消息通知操作。Forking Cluster并行調(diào)用多個服務(wù)器,只要一個成功即返回。通常用于實時性要求較高的讀操作,但需要浪費更多服務(wù)資源??赏ㄟ^ forks=“2” 來設(shè)置最大并行數(shù)。Broadcast Cluster廣播調(diào)用所有提供者,逐個調(diào)用,任意一臺報錯則報錯 [2]。通常用于通知所有提供者更新緩存或日志等本地資源信息。集群模式配置按照以下示例在服務(wù)提供方和消費方配置集群模式

3、整合hystrix

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

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

spring boot官方提供了對hystrix的集成,直接在pom.xml里加入依賴:

org.springframework.cloudspring-cloud-starter-netflix-hystrix1.4.4.RELEASE

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

@SpringBootApplication@EnableHystrixpublic class ProviderApplication {

2、配置Provider端

在Dubbo的Provider上增加@HystrixCommand配置,這樣子調(diào)用就會經(jīng)過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”) })@Overridepublic 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調(diào)用,并在method上配置@HystrixCommand。當(dāng)調(diào)用出錯時,會走到fallbackMethod = "reliable"的調(diào)用里。

@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原理

一次完整的RPC調(diào)用流程(同步調(diào)用,異步另說)如下:**1)服務(wù)消費方(client)調(diào)用以本地調(diào)用方式調(diào)用服務(wù);**2)client stub接收到調(diào)用后負(fù)責(zé)將方法、參數(shù)等組裝成能夠進行網(wǎng)絡(luò)傳輸?shù)南Ⅲw;3)client stub找到服務(wù)地址,并將消息發(fā)送到服務(wù)端;4)server stub收到消息后進行解碼;5)server stub根據(jù)解碼結(jié)果調(diào)用本地的服務(wù);6)本地服務(wù)執(zhí)行并將結(jié)果返回給server stub;7)server stub將返回結(jié)果打包成消息并發(fā)送至消費方;8)client stub接收到消息,并進行解碼;**9)服務(wù)消費方得到最終結(jié)果。**RPC框架的目標(biāo)就是要2~8這些步驟都封裝起來,這些細(xì)節(jié)對用戶來說是透明的,不可見的。

2、netty通信原理

Netty是一個異步事件驅(qū)動的網(wǎng)絡(luò)應(yīng)用程序框架, 用于快速開發(fā)可維護的高性能協(xié)議服務(wù)器和客戶端。它極大地簡化并簡化了TCP和UDP套接字服務(wù)器等網(wǎng)絡(luò)編程。

BIO:(Blocking IO)

NIO (Non-Blocking IO)

Selector 一般稱 為選擇器 ,也可以翻譯為 多路復(fù)用器,

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

Netty基本原理:

3、dubbo原理

1、dubbo原理 -框架設(shè)計

config 配置層:對外配置接口,以 ServiceConfig, ReferenceConfig 為中心,可以直接初始化配置類,也可以通過 spring 解析配置生成配置類proxy 服務(wù)代理層:服務(wù)接口透明代理,生成服務(wù)的客戶端 Stub 和服務(wù)器端 Skeleton, 以 ServiceProxy 為中心,擴展接口為 ProxyFactoryregistry 注冊中心層:封裝服務(wù)地址的注冊與發(fā)現(xiàn),以服務(wù) URL 為中心,擴展接口為 RegistryFactory, Registry, RegistryServicecluster 路由層:封裝多個提供者的路由及負(fù)載均衡,并橋接注冊中心,以 Invoker 為中心,擴展接口為 Cluster, Directory, Router, LoadBalancemonitor 監(jiān)控層:RPC 調(diào)用次數(shù)和調(diào)用時間監(jiān)控,以 Statistics 為中心,擴展接口為 MonitorFactory, Monitor, MonitorServiceprotocol 遠(yuǎn)程調(diào)用層:封裝 RPC 調(diào)用,以 Invocation, Result 為中心,擴展接口為 Protocol, Invoker, Exporterexchange 信息交換層:封裝請求響應(yīng)模式,同步轉(zhuǎn)異步,以 Request, Response 為中心,擴展接口為 Exchanger, ExchangeChannel, ExchangeClient, ExchangeServertransport 網(wǎng)絡(luò)傳輸層:抽象 mina 和 netty 為統(tǒng)一接口,以 Message 為中心,擴展接口為 Channel, Transporter, Client, Server, Codecserialize 數(shù)據(jù)序列化層:可復(fù)用的一些工具,擴展接口為 Serialization, ObjectInput, ObjectOutput, ThreadPool

2、dubbo原理 -啟動解析、加載配置信息

3、dubbo原理 -服務(wù)暴露

4、dubbo原理 -服務(wù)引用

5、dubbo原理 -服務(wù)調(diào)用

柚子快報激活碼778899分享:RPC框架dubbo的學(xué)習(xí)

http://yzkb.51969.com/

文章鏈接

評論可見,查看隱藏內(nèi)容

本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點和立場。

轉(zhuǎn)載請注明,如有侵權(quán),聯(lián)系刪除。

本文鏈接:http://gantiao.com.cn/post/18968006.html

發(fā)布評論

您暫未設(shè)置收款碼

請在主題配置——文章設(shè)置里上傳

掃描二維碼手機訪問

文章目錄