Dubbo架構
Dubbo是Java的RPC架構,具有三大核心功能:面向接口的遠端方法調用,智能容錯和負載均衡,以及服務的自動注冊和發現
Dubbo架構圖:

節點角色說明:
節點 | 說明 |
Provider | 需要暴露服務的服務提供方 |
Consumer | 調用遠端服務的服務消費方 |
Registry | 服務注冊與發現的注冊中心 |
Monitor | 統計服務次數和調用時間的監控中心 |
Container | 服務運作容器 |
調用關系說明:
0. Container負責啟動、加載、運作Provider
1. Provider在啟動時,向Registry注冊自己提供的服務
2. Consumer在啟動時,向Registry訂閱自己所需的服務
3. Registry傳回Provider位址清單給Consumer,若位址有變更,将基于長連接配接推送變更資料給Consumer
4. Consumer從Provider位址清單中,基于軟負載均衡算法,選一台Provider進行調用
5. Consumer和Provider在記憶體中累計調用次數和調用時間,定時每分鐘發一次統計資料到Monitor
子產品目錄說明:
1. API:存放service接口以及實體類、資料傳輸對象等
2. Consumer:消費者目錄,遠端調用Provider提供的接口實作,即互動層
3. Provider:生産者目錄,提供給Consumer的接口實作類
Dubbo整合
寫個SpringBoot整合Dubbo的demo,清晰明了地了解這幾層分層的含義,以及Dubbo的相關配置
1)API層
UserInfo實體類
1 @ToString
2 @AllArgsConstructor
3 @NoArgsConstructor
4 @Data
5 public class userInfo implements Serializable {
6 /**
7 * Serializable 序列化
8 * 實體類必須實作序列化接口
9 **/
10 private Long id;
11 private String userName;
12 private Integer userId;
13 private String userEmail;
14 private String userAddress;
15 private String userGender;
16 }
UserInfoService接口
1 public interface UserInfoService {
2 public List<userInfo> getUserInfo();
3 }
2)Provider層
pom.xml添加相關依賴
1 <dependencies>
2 <!-- 添加api依賴 -->
3 <dependency>
4 <groupId>com.tttori</groupId>
5 <artifactId>api</artifactId>
6 <version>0.0.1-SNAPSHOT</version>
7 <scope>compile</scope>
8 </dependency>
9
10 <!-- dubbo依賴 -->
11 <dependency>
12 <groupId>com.alibaba.boot</groupId>
13 <artifactId>dubbo-spring-boot-starter</artifactId>
14 <version>0.2.0</version>
15 </dependency>
16
17 <!-- zookeeper cli端 -->
18 <dependency>
19 <groupId>org.apache.curator</groupId>
20 <artifactId>curator-framework</artifactId>
21 <version>2.13.0</version>
22 </dependency>
23 </dependencies>
dubbo-config.xml配置dubbo
ServiceImpl類使用@Service("x")注解,其中x與配置中ref一緻
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 聲明服務名dubbo-provider -->
<dubbo:application name="dubbo-provider"/>
<!-- 聲明zookeeper注冊中心,暴露服務位址127.0.0.1:2181 -->
<dubbo:registry id="tttori" protocol="zookeeper" address="127.0.0.1:2181"/>
<!-- 使用dubbo協定,暴露服務端口随機 -->
<dubbo:protocol name="dubbo" port="-1"/>
<!-- 暴露服務接口,ref指向實作對象 -->
<dubbo:service interface="com.tttori.api.service.UserInfoService" ref="userInfoService" registry="tttori" timeout="5000"/>
<dubbo:consumer check="false" timeout="5000"/>
</beans>
UserInfoServiceImpl提供服務的接口實作類
1 @Service("userInfoService") //dubbo包下的Service 暴露服務
2 @Component //POJO執行個體化入容器中
3 public class UserInfoServiceImpl implements UserInfoService{
4 @Override
5 public List<userInfo> getUserInfo(){
6 userInfo userinfo1 = new userInfo(1001L,"Jack",1413112,"[email protected]","China","M");
7 userInfo userinfo2 = new userInfo(1002L,"Dell",1414116,"[email protected]","China","M");
8 return Arrays.asList(userinfo1,userinfo2);
9 }
10 }
ProviderApplication主啟動類
1 @SpringBootApplication
2 @ComponentScan(basePackages = {
3 "com.tttori.provider.serviceImpl"
4 })
5 @MapperScan(basePackages = {"com.tttori.provider.mapper"})
6 @ImportResource(locations = {"classpath:dubbo-config.xml"})
7 @EnableScheduling
8 public class ProviderApplication {
9
10 public static void main(String[] args) {
11 SpringApplication.run(ProviderApplication.class, args);
12
13 try {
14 System.in.read();
15 } catch (IOException e) {
16 e.printStackTrace();
17 }
18 }
19
20 }
3)Consumer層
pom.xml添加API的依賴
1 <dependencies>
2 <!-- api依賴 -->
3 <dependency>
4 <groupId>com.maziyao</groupId>
5 <artifactId>api</artifactId>
6 <version>0.0.1-SNAPSHOT</version>
7 <scope>compile</scope>
8 </dependency>
9 ...
10 </dependencies>
1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
5 xsi:schemaLocation="http://www.springframework.org/schema/beans
6 http://www.springframework.org/schema/beans/spring-beans.xsd
7 http://code.alibabatech.com/schema/dubbo
8 http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
9
10 <!-- 配置服務名 -->
11 <dubbo:application name="dubbo-consumer"/>
12
13 <!-- 指定注冊中心位址 -->
14 <dubbo:registry id="tttori" address="zookeeper://127.0.0.1:2181"/>
15
16 <!-- 訂閱接口,生成遠端服務代理 -->
17 <dubbo:reference id="userInfoService" interface="com.tttori.api.service.UserInfoService" registry="tttori"/>
18
19 </beans>
UserController互動層
@RestController //控制層
public class UserController {
@Autowired
UserService UserService;
@ResponseBody //傳回Json資料
@RequestMapping("/info")
public List<userInfo> getInfo(){
/**
* Consumer接口實作類調用遠端服務Provider接口
**/
return userService.getUserInfo();
}
}
ConsumerApplication啟動類
1 @SpringBootApplication
2 @ImportResource(locations = {"classpath:dubbo-config.xml"})
3 public class ConsumerApplication {
4
5 public static void main(String[] args) {
6 SpringApplication.run(ConsumerApplication.class, args);
7 }
8
9 }
總結
SpringBoot整合Dubbo步驟
1)pom.xml
0. Provider和Consumer配置Dubbo相關的Starter(ZK)
2)dubbo-config.xml
0. dubbo.application.name 聲明目前服務名
1. dubbo.protocol.name 指定通信規則,dubbo協定
2. dubbo.registry.protocol.address 聲明注冊中心,暴露服務位址
3. dubbo.service.interface.ref.registry 暴露服務接口(Provider)
4. dubbo.registry.interface.ref.registry 訂閱服務接口(Consumer)
3)暴露服務
服務實作類使用@Service和@Component注釋