天天看點

Dubbo Study Essay 1

Dubbo架構

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

  Dubbo架構圖:

Dubbo Study Essay 1

 

節點角色說明:

節點 說明
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注釋