Dubbo簡介
Dubbo是Alibaba開源的分布式服務框架,它最大的特點是按照分業(yè)務的架構俭嘁,使用這種方式可以使各個業(yè)務之間解耦合(或者最大限度地松耦合)。
簡單來說Dubbo:
- 一款分布式服務框架
- 高性能和透明化的RPC遠程服務調用方案
- SOA服務治理方案
Dubbo架構
Provider: 暴露服務的服務提供方。
Consumer: 調用遠程服務的服務消費方。
Registry: 服務注冊與發(fā)現的注冊中心凌停。
Monitor: 統(tǒng)計服務的調用次數和調用時間的監(jiān)控中心。
調用流程
- 服務容器負責啟動售滤,加載,運行服務提供者台诗。
- 服務提供者在啟動時完箩,向注冊中心注冊自己提供的服務。
- 服務消費者在啟動時拉队,向注冊中心訂閱自己所需的服務弊知。
- 注冊中心返回服務提供者地址列表給消費者,如果有變更粱快,注冊中心將基于長連接推送變更數據給消費者秩彤。
- 服務消費者,從提供者地址列表中事哭,基于軟負載均衡算法漫雷,選一臺提供者進行調用,如果調用失敗鳍咱,再選另一臺調用降盹。
- 服務消費者和提供者,在內存中累計調用次數和調用時間谤辜,定時每分鐘發(fā)送一次統(tǒng)計數據到監(jiān)控中心蓄坏。
SpringBoot整合Dubbo
項目整體架構
這里還用到了Zookeeper注冊中心,所以需要到Zookeeper官網下載壓縮包,下載后進行解壓丑念,然后啟動Zookeeper涡戳,點擊解壓包下的bin/zkServer.cmd:
這里還用到了zookeeper的可視化工具ZK UI。
服務監(jiān)控中心搭建:dubbo-admin的下載脯倚,地址:https://github.com/Linliuxing/dubbo-admin
直接下載zip包渔彰,解壓后將dubbo-admin下的內容全部拷貝到本地tomcat的webapps下
在運行tomcat之前,先將zookeeper啟動推正,如果不配置監(jiān)控中心(WEB-INF/dubbo.properties胳岂,內容如下),
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
默認啟動tomcat即可,http://localhost:8080/dubbo-admin, 登錄時輸入root/root
SpringBoot添加Dubbo和Zookeeper依賴:
<!--spring-boot-starter-dubbo-->
<dependency>
<groupId>com.gitee.reger</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.1.1</version>
</dependency>
<!-- 引入zookeeper舔稀,去除其中的log4j乳丰,否則會因為日志原因導致堆棧溢出 -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.10</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
springboot-dubbo-api:
- 定義服務接口ProviderService :
public interface ProviderService {
String sayHello(String name);
}
springboot-dubbo-provider:
- application.yml配置信息:
server:
port: 8081
spring:
dubbo:
application:
name: service-provider
base-package: com.lin.service # dubbo服務發(fā)布者所在的包
registry:
address: 192.168.0.116 # zookeeper注冊中心的地址
port: 2181 # zookeeper注冊中心的端口
protocol: zookeeper
register: true
protocol:
name: dubbo
port: 20880
accesslog: true
provider:
retries: 1
delay: -1
- 服務實現類:
@Service(version = "1.0.0")
@Component
public class ProviderServiceImpl implements ProviderService {
@Override
public String sayHello(String name) {
return "Hello "+name;
}
}
springboot-dubbo-consumer:
- application.yml配置信息:
server:
port: 8082
spring:
dubbo:
application:
name: service-consumer
base-package: com.lin.service # dubbo服務調用者所在的包
registry:
address: 192.168.0.116 # zookeeper注冊中心的地址
port: 2181 # zookeeper注冊中心的端口
protocol: zookeeper
subscribe: true
protocol:
name: dubbo
host: 192.168.0.116
consumer:
timeout: 1000
check: false # 服務啟動時檢查被調用服務是否可用
retries: 2 # 服務調用重試次數
- 調用服務提供者的服務:
@RestController
public class Consumer {
// 使用兼容注入,可以使用dubbo原生注解@Reference注入
@Reference(version = "1.0.0")
public ProviderService service;
@GetMapping(value = "/hello/{name}")
public String hello(@PathVariable String name){
return service.sayHello(name);
}
}
測試:
- 瀏覽器訪問消費者的接口内贮,返回的是提供者的處理請求:
- 查看服務提供者和消費者是否注冊到Zookeeper注冊中心:
-
查看服務提供者和消費者是否注冊到服務監(jiān)控中心:
- 查看springboot-dubbo-provider的Zookeeper打印信息: