文章目錄
一、分佈式基本知識
1.1) 架構演變
1.2)、分佈式基本概念
二、RCP簡介
2.1) RPC概念
2.2) RPC核心模塊
三、Dubbo原理簡介
3.1) Dubbo簡介
3.2) 核心功能
3.3) 原理簡介
四、Dubbo安裝部署
4.1) Zookeeper安裝
4.2) Dubbo監控平臺部署
五、Dubbo例子
一、分佈式基本知識
1.1) 架構演變
先給出dubbo官方的圖,圖片表示了架構的演變。然後我說一下自己的理解。
應用最開始是單體應用,即一個應用包括了所有應用模塊。
隨後就是垂直應用架構,也就是將系統拆分為多個應用模塊。
隨後就是RPC架構,之前的垂直應用架構其實可以說是在一個進程內的通訊,而RPC就是一種進步,RPC是進程之間的通訊,遠程過程調用就是這麼來的。
有了RPC之後,雖然可以實現進程之間的通訊,但是服務器集群后的服務器資源利用有些時候容易造成浪費,比如有個系統,一般情況都是不能很好地預估需要分配多少機器的,很容易造成一種情況就是業務訪問很頻繁的模塊分配了不足的機器,而訪問不是很頻繁的模塊分配了太多的機器,這種情況就不能實現資源的很好利用,所以針對這種情況就有了SOA(Service Oriented Architecture)的出現,SOA其實就是一個服務註冊中心,可以實現資源調度,合理地分配資源,提高資源調度,是一個治理中心。
1.2)、分佈式基本概念
所以我們瞭解了架構演變之後,就可以更好的理解分佈式,分佈式其實就是一種可以實現不同進程之間通訊的架構,然後進程之間怎麼通訊的?一般都是通過RPC框架實現。比如Java方面的,Dubbo框架或者Spring Cloud。
二、RCP簡介
2.1) RPC概念
RPC:全稱遠程過程調用,是一種進程間的通信的方式,它所做的事情就是實現進程內的通信,允許調用另外一個地址空間,可以是共享網絡裡的另外一臺機器。
2.2) RPC核心模塊
RPC有兩個核心模塊:通信和序列化
三、Dubbo原理簡介
3.1) Dubbo簡介
Dubbo是阿里巴巴開源的一款Java RPC框架,現在已經捐贈給Apache
官網:http://dubbo.apache.org/
3.2) 核心功能
a、智能容錯和負載均衡
b、服務註冊和發現
c、面向接口的遠程方法調用
3.3) 原理簡介
上圖是Dubbo官方的圖
角色
Provider:暴露服務的服務提供者
Container:服務運行的容器
Consumer:調用遠程服務的消費者
Registry:服務註冊和發現的註冊中心
Minitor:統計服務調用次數和時間的監控中心
調用
下面根據我的理解說明一下
0:服務器容器負責啟動、加載、運行服務提供者
1:服務提供者在啟動後就可以向註冊中心暴露服務
2:服務消費者在啟動後就可以向註冊中心訂閱想要的服務
3:註冊中心向服務消費者返回服務調用列表
4:服務消費者基於軟負載均衡算法調用服務提供者的服務,這個服務提供者有可能是一個服務提供者列表,調用那個服務提供者就是根據負載均衡來調用了
5:服務提供者和服務消費者定時將保存在內存中的服務調用次數和服務調用時間推送給監控中心
四、Dubbo安裝部署
4.1) Zookeeper安裝
因為沒有實踐過linux系統的安裝,所以本博客只介紹window系統的安裝,當然linux安裝dubbo環境也不會難。Dubbo的註冊中心實現有很多種,比如Redis、Multicast等等,不過官方推薦的還是Zookeeper,所以本博客選Zookeeper註冊中心搭建進行介紹。
下載Zookeeper
https://archive.apache.org/dist/zookeeper/
ps:先下載Zookeeper,因為3.5.X的都是公測版或者內測版,所以有可能不太穩定,不建議下載。
修改配置文件
解壓下載好的Zookeeper壓縮文件,zookeeper-3.4.13的配置文件在conf文件夾下面,可以看到裡面有個zoo_sample.cfg的文件,我們需要修改文件名稱,不然會出現文件找不到,將文件名稱改為zoo.cfg
這裡主要改一下Zookeeper臨時文件夾,默認是linux系統的tmp/zookeeper,我修改後的配置如下:
# The number of milliseconds of each tick
tickTime=2000
# The number of ticks that the initial
# synchronization phase can take
initLimit=10
# The number of ticks that can pass between
# sending a request and getting an acknowledgement
syncLimit=5
# the directory where the snapshot is stored.
# do not use /tmp for storage, /tmp here is just
# example sakes.
# Linux系統下的臨時目錄
# dataDir=/tmp/zookeeper
dataDir=../tmp/zookeeper
# the port at which the clients will connect
clientPort=2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
#
# Be sure to read the maintenance section of the
# administrator guide before turning on autopurge.
#
# http://zookeeper.apache.org/doc/current/zookeeperAdmin.html#sc_maintenance
#
# The number of snapshots to retain in dataDir
#autopurge.snapRetainCount=3
# Purge task interval in hours
# Set to "0" to disable auto purge feature
#autopurge.purgeInterval=1
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
啟動Zookeeper
在bin目錄下面,有個zkServer.cmd文件,這是Zookeeper服務端啟動的文件,點擊啟動
zkCli.cmd是客戶端啟動文件,我們點擊啟動,Zookeeper是一個樹形目錄結構的
### get根目錄
[zk: localhost:2181(CONNECTED) 1] get /
cZxid = 0x0
ctime = Thu Jan 01 08:00:00 CST 1970
mZxid = 0x0
mtime = Thu Jan 01 08:00:00 CST 1970
pZxid = 0x0
cversion = -1
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x0
dataLength = 0
numChildren = 1
### 看一下根目錄下面有什麼,默認有Zookeeper這個目錄
[zk: localhost:2181(CONNECTED) 2] ls /
[zookeeper]
### 在根目錄下面創建一個taoshop的目錄,並寫值"mytest"
[zk: localhost:2181(CONNECTED) 3] create -e /taoshop mytest
Created /taoshop
### 查看一下,創建成功
[zk: localhost:2181(CONNECTED) 4] ls /
[taoshop, zookeeper]
### 查看一下taoshop目錄下面有什麼,可以看到"mytest"這個保存的值
[zk: localhost:2181(CONNECTED) 5] get /taoshop
mytest
cZxid = 0x6
ctime = Sun Nov 04 20:54:19 CST 2018
mZxid = 0x6
mtime = Sun Nov 04 20:54:19 CST 2018
pZxid = 0x6
cversion = 0
dataVersion = 0
aclVersion = 0
ephemeralOwner = 0x1000250f2010000
dataLength = 6
numChildren = 0
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
4.2) Dubbo監控平臺部署
下載一下Dubbo提供的監控平臺,可以先去下載master分支,有看到一個develop分支,不過感覺develop分支的還沒穩定下來,根據自己需要下載,我就是下載master版本的
https://github.com/apache/incubator-dubbo-ops/tree/master
可以git clone一下https://github.com/apache/incubator-dubbo-ops.git
git clone https://github.com/apache/incubator-dubbo-ops.git
1
然後到dubbo-admin下面打包一下
incubator-dubbo-ops-master/dubbo-admin
mvn clean package
1
完成後,到該目錄target下面發現一個jar,cmd運行
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
1
當然也可以寫個簡單的bat腳本來執行,不用每次都敲命令,創建一個startDubboAdmin.bat文件
敲上以下腳本,然後保存,下次就不用再敲命令了,不過jar文件要和bat文件放在同級目錄
@echo off
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
1
2
訪問Dubbo管理平臺
http://localhost:7001/
輸入賬號密碼root/root
Dubbo監控平臺配置
在官方下載的incubator-dubbo-ops-master/dubbo-monitor-simple下面
使用maven命令打包一下
mvn clean package
1
然後在target文件夾下面會生成
dubbo-monitor-simple-2.0.0-assembly.tar.gz壓縮文件夾,我們解壓一下,然後
在dubbo-monitor-simple-2.0.0-assembly/dubbo-moitor-simple-2.0.0/assembly.bin文件夾下面可以看到start.bat文件,start.sh是linux系統的。win系統可以點擊start.bat運行,運行之後訪問127.0.0.1:8080,可以看到Dubbo官方提供的一個監控平臺頁面
五、Dubbo例子
下面簡單寫個例子實踐一下Dubbo
Dubbo是處理分佈式架構的一種很不錯的RPC框架,官方文檔比較齊全。
下面是Dubbo官方給的架構分包建議。ps:Dubbo現在暫不能支持分佈式事務,所以服務定義的時候要設計好,儘量避免分佈式事務的處理
建議將服務接口,服務模型,服務異常等均放在 API 包中,因為服務模型及異常也是 API 的一部分,同時,這樣做也符合分包原則:重用發佈等價原則(REP),共同重用原則(CRP)。
服務提供者實現
maven加上jar,Zookeeper注意加上去除log4j依賴,假如你項目引入其它版本的log4j的話,容易造成jar衝突
1
2
3
4
5
6
7
8
9
10
dubbo配置,我放在一個common工程,taoshop-common-rpc
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
provider工程一般是Service工程,我新建一個taoshop-provider-item訂單工程
1
2
3
4
5
6
7
8
9
10
11
12
dubbo配置:
spring.dubbo.application.name=taoshop-provider-item
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.muses.taoshop
1
2
3
4
5
6
業務接口實現:
注意點:這裡要加上dubbo提供的@Service註解,而不是spring框架提供的@Service註解
com.alibaba.dubbo.config.annotation.Service
package com.muses.taoshop.item.service;
import com.alibaba.dubbo.config.annotation.Service;
import com.muses.taoshop.item.entity.ItemDetail;
import com.muses.taoshop.item.entity.ItemPortal;
import com.muses.taoshop.item.entity.ItemSpec;
import com.muses.taoshop.item.mapper.ItemMapper;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.List;
/**
*
* 商品信息服務實現類
*
*
* @author nicky
* @version 1.00.00
*
* 修改記錄
* 修改後版本: 修改人: 修改日期: 2018.06.24 22:37 修改內容:
*
*/
@Service(version = "1.0.0")
public class ItemServiceImpl implements IItemService {
@Autowired
ItemMapper itemMapper;
/**
* 在門戶網站列出商品粗略信息
*
* @return
*/
@Override
public List
return itemMapper.listItemPortal();
}
/**
* 獲取商品詳情信息
* @return ItemDetail
*/
@Override
public ItemDetail getItemDetailInfo(int spuId){
ItemDetail itemDetail = itemMapper.getItemDetail(spuId);
return itemDetail;
}
}
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
隨意寫個SpringBoot啟動類:
package com.muses.taoshop.item;
/**
*
* 服務提供者
*
*
* @author nicky
* @version 1.00.00
*
* 修改記錄
* 修改後版本: 修改人: 修改日期: 2018.11.17 23:24 修改內容:
*
*/
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ImportResource;
import java.util.concurrent.CountDownLatch;
@SpringBootApplication
//@ImportResource({"classpath:dubbo-provider.xml"})
public class ItemProviderApplication {
// private static final Logger logger = Logger.getLogger(ItemProviderApplication.class);
@Bean
public CountDownLatch closeLatch() {
return new CountDownLatch(1);
}
public static void main(String[] args) throws InterruptedException {
ApplicationContext ctx = SpringApplication.run(ItemProviderApplication.class, args);
//logger.info("項目啟動!");
//CountDownLatch closeLatch = ctx.getBean(CountDownLatch.class);
//closeLatch.await();
}
}
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
啟動一下provider,在監控平臺上可以看到啟動成功的服務,服務接口暴露成功
服務消費者
Dubbo配置:
spring.dubbo.application.name=taoshop-consume-portal
spring.dubbo.registry.protocol=zookeeper
spring.dubbo.registry.address=127.0.0.1:2181
spring.dubbo.scan=com.muses.taoshop
spring.dubbo.monitor.protocol=registry
1
2
3
4
5
xml配置就是這樣的
自動發現
1
引用,主要是引入import com.alibaba.dubbo.config.annotation.Reference;
@Reference
IItemService iItemService;
閱讀更多 程序員小新人學習 的文章