Dubbo系列服務(wù)注冊(cè)與發(fā)現(xiàn)

      網(wǎng)友投稿 640 2022-05-30

      文章目錄

      一、分布式基本理論

      1.1、分布式基本定義

      1.2 架構(gòu)發(fā)展演變

      1.3、RPC簡(jiǎn)介

      二、Dubbo理論簡(jiǎn)介

      三、Dubbo環(huán)境搭建

      3.1 Zookeeper搭建

      3.2 Dubbo管理頁(yè)面搭建

      四、Dubbo服務(wù)注冊(cè)發(fā)現(xiàn)例子

      4.1、業(yè)務(wù)場(chǎng)景

      4.2、api工程創(chuàng)建

      4.3、服務(wù)提供者工程

      4.4、服務(wù)消費(fèi)者工程

      一、分布式基本理論

      1.1、分布式基本定義

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

      “分布式系統(tǒng)是若干獨(dú)立計(jì)算機(jī)的集合,這些計(jì)算機(jī)對(duì)于用戶(hù)來(lái)說(shuō)就像單個(gè)相關(guān)系統(tǒng)”

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

      1.2 架構(gòu)發(fā)展演變

      架構(gòu)的發(fā)展是由最初的單一應(yīng)用架構(gòu)構(gòu)建的,一般就是ORM框架方便數(shù)據(jù)庫(kù)操作。

      不過(guò)隨著系統(tǒng)越來(lái)越復(fù)雜,單一應(yīng)用架構(gòu)會(huì)變得難以維護(hù),所以架構(gòu)逐漸演變出了垂直應(yīng)用架構(gòu),所謂垂直應(yīng)用架構(gòu)其實(shí)就是安裝業(yè)務(wù)模板進(jìn)行拆分,比如可以安裝業(yè)務(wù)將一個(gè)電商系統(tǒng)分為訂單模塊,用戶(hù)信息管理模塊,商品管理模塊等等,這時(shí)候MVC框架就派上用場(chǎng),MVC框架可以協(xié)助系統(tǒng)更好的按業(yè)務(wù)拆分,不過(guò)業(yè)務(wù)拆分后雖然是比單一應(yīng)用架構(gòu)更好維護(hù)了。

      不過(guò)隨著系統(tǒng)越來(lái)約復(fù)雜,發(fā)現(xiàn)很多共用的模塊很難復(fù)用起來(lái),這時(shí)候分布式服務(wù)架構(gòu)登場(chǎng)了,分布式架構(gòu)是將一些核心業(yè)務(wù)抽取出來(lái),作為獨(dú)立的服務(wù),逐漸形成穩(wěn)定的服務(wù)中心,當(dāng)應(yīng)用需要時(shí),就去服務(wù)中心調(diào)服務(wù)就可以,而實(shí)現(xiàn)這種服務(wù)注冊(cè)的肯定是RPC框架了。

      當(dāng)服務(wù)越來(lái)越多,容量的評(píng)估,小服務(wù)資源的浪費(fèi)等問(wèn)題逐漸顯現(xiàn),此時(shí)需增加一個(gè)調(diào)度中心基于訪問(wèn)壓力實(shí)時(shí)管理集群容量,提高集群利用率,這時(shí)候就需要流動(dòng)計(jì)算架構(gòu)(SOA)[ Service Oriented Architecture],用于提高機(jī)器利用率的資源調(diào)度,SOA是一個(gè)治理中心,綜上所述,到目前,軟件系統(tǒng)架構(gòu)演變經(jīng)歷了:?jiǎn)我粦?yīng)用架構(gòu)->垂直應(yīng)用架構(gòu)->分布式應(yīng)用架構(gòu)->流動(dòng)計(jì)算架構(gòu),下面Dubbo官網(wǎng)的圖片可以很好的描述

      1.3、RPC簡(jiǎn)介

      RPC概念

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

      RPC核心模塊

      RPC有兩個(gè)核心模塊:通信和序列化

      二、Dubbo理論簡(jiǎn)介

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

      官網(wǎng):

      http://dubbo.apache.org/

      Dubbo的服務(wù)治理:

      Dubbo原理圖片,圖片來(lái)自Dubbo官網(wǎng):

      Dubbo角色:

      Provider:暴露服務(wù)的服務(wù)提供者

      Container:服務(wù)運(yùn)行的容器

      Consumer:調(diào)用遠(yuǎn)程服務(wù)的消費(fèi)者

      Registry:服務(wù)注冊(cè)和發(fā)現(xiàn)的注冊(cè)中心

      Minitor:統(tǒng)計(jì)服務(wù)調(diào)用次數(shù)和時(shí)間的監(jiān)控中心

      調(diào)用過(guò)程:

      下面根據(jù)我的理解說(shuō)明一下

      0:服務(wù)器容器負(fù)責(zé)啟動(dòng)、加載、運(yùn)行服務(wù)提供者

      1:服務(wù)提供者在啟動(dòng)后就可以向注冊(cè)中心暴露服務(wù)

      2:服務(wù)消費(fèi)者在啟動(dòng)后就可以向注冊(cè)中心訂閱想要的服務(wù)

      3:注冊(cè)中心向服務(wù)消費(fèi)者返回服務(wù)調(diào)用列表

      4:服務(wù)消費(fèi)者基于軟負(fù)載均衡算法調(diào)用服務(wù)提供者的服務(wù),這個(gè)服務(wù)提供者有可能是一個(gè)服務(wù)提供者列表,調(diào)用那個(gè)服務(wù)提供者就是根據(jù)負(fù)載均衡來(lái)調(diào)用了

      5:服務(wù)提供者和服務(wù)消費(fèi)者定時(shí)將保存在內(nèi)存中的服務(wù)調(diào)用次數(shù)和服務(wù)調(diào)用時(shí)間推送給監(jiān)控中心

      三、Dubbo環(huán)境搭建

      3.1 Zookeeper搭建

      搭建Zookeeper,首先是搭建分布式架構(gòu)的注冊(cè)中心Zookeeper,當(dāng)然也可以用Redis等等來(lái)做服務(wù)注冊(cè)中心,不過(guò)本博客只介紹Zookeeper的,因?yàn)闆](méi)有l(wèi)inux服務(wù)器,所以只介紹window版的搭建

      1、下載Zookeeper:

      網(wǎng)址 https://archive.apache.org/dist/zookeeper/zookeeper-3.4.13/

      2、解壓Zookeeper

      解壓Zookeeper之后,運(yùn)行bin目錄里的zkServer.cmd,發(fā)現(xiàn)報(bào)錯(cuò)了,提示找不到配置文件,所以需要繼續(xù)步驟3

      3、配置Zookeeper

      因?yàn)閆ookeeper的conf文件夾下面只提供zoo_sample.cfg文件,需要自己修改命名為zoo.cfg

      對(duì)于配置文件需要注意:

      dataDir=./ 臨時(shí)數(shù)據(jù)存儲(chǔ)的目錄(可寫(xiě)相對(duì)路徑)

      clientPort=2181 zookeeper的端口號(hào)

      4、使用zkCli.cmd測(cè)試

      修改配置文件后,重新啟動(dòng)zkServer.cmd,啟動(dòng)bin目錄下面的zkCli.cmd,很顯然這是個(gè)客戶(hù)端程序,注意zkServer.cmd是服務(wù)端程序,必須啟動(dòng)

      ok,簡(jiǎn)單在zkCli.cmd敲幾個(gè)命令測(cè)試一下:

      ls /:列出zookeeper根下保存的所有節(jié)點(diǎn)

      create –e /testNode 12345678:創(chuàng)建一個(gè)testNode節(jié)點(diǎn),值為12345678

      get /testNode:獲取/testNode節(jié)點(diǎn)的值

      3.2 Dubbo管理頁(yè)面搭建

      搭建了服務(wù)注冊(cè)中心后,就需要搭建Dubbo-admin了,最近看了一下,dubbo的Github項(xiàng)目已經(jīng)進(jìn)行了更新,管理平臺(tái)已經(jīng)做了比較大的改動(dòng),而我學(xué)習(xí)的時(shí)候,平臺(tái)是比較簡(jiǎn)單的,所以本dubbo-admin搭建是以舊版master的為準(zhǔn),不過(guò)以學(xué)習(xí)為目的的,只需要知道具體原理和操作技巧就可以

      下載dubbo-admin

      去下載一下dubbo-admin,可以找主干master分支的,找到dubbo-admin,git clone到本地

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

      因?yàn)槲掖罱〞r(shí)候(ps:不是博客寫(xiě)作時(shí)間),dubbo還沒(méi)做比較大改動(dòng),所以我以比較舊的版本為例子,現(xiàn)在新的具體參考dubbo官方的教程,本博客只是做記錄

      修改dubbo-admin

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

      Maven package dubbo-admin

      mvn clean package -Dmaven.test.skip=true

      1

      運(yùn)行dubbo-admin的jar

      maven打包之后,就去target里找到j(luò)ar,然后cmd運(yùn)行

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

      1

      運(yùn)行成功之后,訪問(wèn): http://127.0.0.1:7001,輸入默認(rèn)的賬號(hào)密碼root/root,登錄成功

      四、Dubbo服務(wù)注冊(cè)發(fā)現(xiàn)例子

      經(jīng)典例子:

      4.1、業(yè)務(wù)場(chǎng)景

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

      我們現(xiàn)在 需要?jiǎng)?chuàng)建兩個(gè)服務(wù)模塊進(jìn)行測(cè)試

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

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

      4.2、api工程創(chuàng)建

      創(chuàng)建工程:

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

      創(chuàng)建一個(gè)API工程,將實(shí)體類(lèi)和接口都放在api工程

      maven新建一個(gè)shop-api-common工程:

      用戶(hù)地址DTO類(lèi):

      package com.test.dubbo.bean; import java.io.Serializable; public class UserAddress implements Serializable { private Integer id; private String userAddress; //用戶(hù)地址 private String userId; //用戶(hù)id private String consignee; //收貨人 private String phoneNum; //電話(huà)號(hào)碼 private String isDefault; //是否為默認(rèn)地址 Y-是 N-否 public UserAddress() { super(); } public UserAddress(Integer id, String userAddress, String userId, String consignee, String phoneNum, String isDefault) { super(); this.id = id; this.userAddress = userAddress; this.userId = userId; this.consignee = consignee; this.phoneNum = phoneNum; this.isDefault = isDefault; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getConsignee() { return consignee; } public void setConsignee(String consignee) { this.consignee = consignee; } public String getPhoneNum() { return phoneNum; } public void setPhoneNum(String phoneNum) { this.phoneNum = phoneNum; } public String getIsDefault() { return isDefault; } public void setIsDefault(String isDefault) { this.isDefault = isDefault; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      40

      41

      42

      43

      44

      45

      46

      47

      48

      49

      50

      51

      52

      53

      54

      55

      56

      57

      58

      59

      60

      61

      62

      63

      64

      用戶(hù)信息服務(wù)接口:

      package com.test.dubbo.service; import java.util.List; import com.test.dubbo.bean.UserAddress; /** * 用戶(hù)服務(wù) */ public interface UserService { /** * 按照用戶(hù)id返回所有的收貨地址 * @param userId * @return */ public List getUserAddressList(String userId); }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      訂單信息服務(wù)接口:

      package com.test.dubbo.service; import java.util.List; import com.test.dubbo.bean.UserAddress; public interface OrderService { /** * 初始化訂單 * @param userId */ public List initOrder(String userId); }

      1

      2

      3

      Dubbo系列之服務(wù)注冊(cè)與發(fā)現(xiàn)

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      ok,創(chuàng)建好api工程

      4.3、服務(wù)提供者工程

      要實(shí)現(xiàn)服務(wù)提供,配置文件主要需要配置如下:

      Dubbo提供者加載過(guò)程(Dubbo容器的啟動(dòng)):

      Spring加載xml配置之后暴露服務(wù)的過(guò)程:

      Exporter方法主要是打開(kāi)socket的監(jiān)聽(tīng),接收客戶(hù)的請(qǐng)求

      ok,理解了上面的理論知識(shí)后,繼續(xù)創(chuàng)建一個(gè)user-service-provider工程:

      maven配置:

      com.alibaba dubbo 2.6.2 org.apache.curator curator-framework 2.12.0

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      resources加一個(gè)提供者的配置文件provider.xml

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      加個(gè)業(yè)務(wù)實(shí)現(xiàn)類(lèi):

      package com.test.dubbo.service.impl; import java.util.Arrays; import java.util.List; import com.test.dubbo.bean.UserAddress; import com.test.dubbo.service.UserService; public class UserServiceImpl implements UserService { //@Override public List getUserAddressList(String userId) { UserAddress address1 = new UserAddress(1, "北京市昌平區(qū)", "1", "李老師", "010-56253825", "Y"); UserAddress address2 = new UserAddress(2, "深圳市寶安區(qū)", "1", "王老師", "010-56253825", "N"); return Arrays.asList(address1,address2); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      啟動(dòng)服務(wù)提供者,注冊(cè)到Zookeeper:

      啟動(dòng)服務(wù)提供者有兩種方法,一種是IOC啟動(dòng):

      package com.test.dubbo; import java.io.IOException; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApplication { public static void main(String[] args) throws IOException { ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml"); ioc.start(); System.in.read(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      另外一種是調(diào)dubbo的Main類(lèi),啟動(dòng):

      dubbo的main函數(shù):

      com.alibaba.dubbo.container.Main

      com.alibaba.dubbo.container.spring.SpringContainer

      服務(wù)注冊(cè)成功,可以去dubbo-admin看

      查看服務(wù)接口的詳細(xì)信息:

      4.4、服務(wù)消費(fèi)者工程

      然后服務(wù)已經(jīng)注冊(cè)了,現(xiàn)在創(chuàng)建一個(gè)消費(fèi)者工程order-service-comsumer

      maven加上配置

      com.alibaba dubbo 2.6.2 org.apache.curator curator-framework 2.12.0

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      消費(fèi)者配置文件:

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      31

      32

      33

      34

      35

      36

      37

      38

      39

      訂單服務(wù)類(lèi):

      package com.test.dubbo.service.impl; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.test.dubbo.bean.UserAddress; import com.test.dubbo.service.OrderService; import com.test.dubbo.service.UserService; /** * 讓服務(wù)消費(fèi)者去注冊(cè)中心訂閱服務(wù)提供者的服務(wù)地址 */ @Service public class OrderServiceImpl implements OrderService { @Autowired UserService userService; @Override public List initOrder(String userId) { System.out.println("用戶(hù)id:"+userId); //查詢(xún)用戶(hù)的收貨地址 List addressList = userService.getUserAddressList(userId); for (UserAddress userAddress : addressList) { System.out.println(userAddress.getUserAddress()); } return addressList; } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      22

      23

      24

      25

      26

      27

      28

      29

      30

      IOC啟動(dòng)

      同樣也是可以ioc啟動(dòng),或者Dubbo提供的Main類(lèi)啟動(dòng):

      package com.test.dubbo; import java.io.IOException; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.test.dubbo.service.OrderService; public class MainApplication { @SuppressWarnings("resource") 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("調(diào)用成功...."); System.in.read(); } }

      1

      2

      3

      4

      5

      6

      7

      8

      9

      10

      11

      12

      13

      14

      15

      16

      17

      18

      19

      20

      21

      調(diào)用成功,console打?。?/p>

      用戶(hù)id:1 北京市昌平區(qū) 深圳市寶安區(qū) 調(diào)用成功....

      1

      2

      3

      4

      5

      Dubbo

      版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶(hù)投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。

      上一篇:excel表格不能設(shè)置超鏈接的解決方法
      下一篇:Java15來(lái)了!!!一文詳解JDK15新特性
      相關(guān)文章
      亚洲精品中文字幕麻豆| 亚洲永久精品ww47| 国产精品V亚洲精品V日韩精品 | 456亚洲人成在线播放网站| 亚洲国产精品一区二区第一页免 | 亚洲三级电影网站| 久久亚洲精品中文字幕三区| 国产亚洲美日韩AV中文字幕无码成人 | 亚洲午夜无码久久久久| 亚洲性久久久影院| 亚洲国产精品一区二区三区久久| 亚洲成年网站在线观看| 久久精品国产亚洲av麻豆图片| 67194在线午夜亚洲| 亚洲国产区男人本色在线观看| 亚洲伊人久久精品| 亚洲乱码一二三四区国产| 亚洲福利视频一区二区三区| 亚洲人成毛片线播放| 亚洲人成电影在线观看青青| 亚洲精品午夜国产va久久| 亚洲乱码无人区卡1卡2卡3| 亚洲AV无码AV男人的天堂不卡| 亚洲a∨国产av综合av下载| 亚洲男人av香蕉爽爽爽爽| 亚洲综合伊人久久大杳蕉| 国产AV无码专区亚洲A∨毛片| 久久精品国产亚洲一区二区| 亚洲AV无码精品色午夜果冻不卡 | 亚洲国产精品无码专区影院| 亚洲国产精品久久| 亚洲最大的视频网站| 亚洲三级高清免费| 久久精品国产亚洲av瑜伽| 亚洲国产高清在线一区二区三区| ZZIJZZIJ亚洲日本少妇JIZJIZ| 亚洲中文字幕在线第六区| 亚洲毛片αv无线播放一区| 婷婷亚洲久悠悠色悠在线播放| 亚洲欧洲日产v特级毛片| 亚洲色偷偷综合亚洲AV伊人蜜桃|