大數(shù)據(jù)服務(wù)上云的思考">大數(shù)據(jù)服務(wù)上云的思考
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
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
1
2
3
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配置:
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
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加上配置
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
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)容。