1. 程式人生 > 其它 >Dubbo解析之與Spring整合

Dubbo解析之與Spring整合

Apache Dubbo 是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。

特性

  • 面向介面代理的高效能RPC呼叫

    提供高效能的基於代理的遠端呼叫能力,服務以介面為粒度,為開發者遮蔽遠端呼叫底層細節。

  • 智慧負載均衡

    內建多種負載均衡策略,智慧感知下游節點健康狀況,顯著減少呼叫延遲,提高系統吞吐量。

  • 服務自動註冊與發現

    支援多種註冊中心服務,服務例項上下線實時感知。

  • 高度可擴充套件能力

    遵循微核心+外掛的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴充套件點,平等對待內建實現和第三方實現。

  • 執行期流量排程

    內建條件、指令碼等路由策略,通過配置不同的路由規則,輕鬆實現灰度釋出,同機房優先等功能。

  • 視覺化的服務治理與運維

    提供豐富服務治理、運維工具:隨時查詢服務元資料、服務健康狀態及呼叫統計,實時下發路由策略、調整配置引數。

節點角色

角色 說明
Provider 暴露服務的服務提供方
Consumer 呼叫遠端服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器
再來看一張官網提供的架構圖:

與Spring整合

Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API侵入,只需用 Spring 載入 Dubbo 的配置即可,Dubbo 基於Spring 的 Schema 擴充套件 進行載入。只需引入Maven座標。Dubbo裡面已經包含了Spring、Zookeeper、Netty等。
<
dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.2</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</
version> </dependency>
首先,我們要定義介面和實現類,在這裡我們還是搞一個操作使用者資訊的介面。

1、介面

package com.viewscenes.netsupervisor.service;
import java.util.List;
import com.viewscenes.netsupervisor.entity.InfoUser;

public interface InfoUserService {
    
    void insertInfoUser(InfoUser user);
    InfoUser getUserById(String id);    
    void deleteUserById(String id);
    List<InfoUser> getAllUser();
}
package com.viewscenes.netsupervisor.service.impl;

public class InfoUserServiceImpl implements InfoUserService{

    private Logger logger = LoggerFactory.getLogger(this.getClass());
    
    private Map<String,InfoUser> userMap = new HashMap<String, InfoUser>();
    
    public void insertInfoUser(InfoUser user) {
        logger.info("新增使用者資訊...{}",JSONObject.toJSONString(user));
        userMap.put(user.getId(), user);
    }
    public List<InfoUser> getAllUser(){
        List<InfoUser> infoUserList = new ArrayList<InfoUser>();
        for(Map.Entry<String, InfoUser> entry:userMap.entrySet()) {
            infoUserList.add(entry.getValue());
        }
        System.out.println("獲取全部使用者資料:"+infoUserList.size());
        return infoUserList;
    }
}

2、Provider

先來看一下生產者端的配置檔案。
<?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://dubbo.apache.org/schema/dubbo"
            xsi:schemaLocation="http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-4.3.xsd 
            http://dubbo.apache.org/schema/dubbo 
            http://dubbo.apache.org/schema/dubbo/dubbo.xsd">  
   
    <!-- 提供方應用資訊,用於計算依賴關係 -->
    <dubbo:application name="dubbo_producer1"/>   
    <!-- 使用zookeeper註冊中心暴露服務地址 -->
    <dubbo:registry address="zookeeper://192.168.139.129:2181?client=zkclient"/>    
    <!-- 用dubbo協議在20880埠暴露服務 -->
    <dubbo:protocol name="dubbo" port="20880"/>     
    <!-- Spring的Bean -->
    <bean id="infoUserService" class="com.viewscenes.netsupervisor.service.impl.InfoUserServiceImpl" />     
    <!-- 服務配置,暴露一個介面服務  -->
    <dubbo:service interface="com.viewscenes.netsupervisor.service.InfoUserService" ref="infoUserService" /> 
</beans>

3、Consumer

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
       http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
    
    <!-- 消費者方應用資訊,用於計算依賴關係 -->
    <dubbo:application name="dubbo_consumer"/>
    <!-- 用於配置連線註冊中心相關資訊 -->
    <dubbo:registry protocol="zookeeper" address="192.168.139.129:2181" client="zkclient" />
    <!-- 引用配置   用於建立一個遠端介面服務代理 -->
    <dubbo:reference id="infoUserService" check="false" interface="com.viewscenes.netsupervisor.service.InfoUserService"/>
</beans>

4、啟動

配置好之後,我們就可以在Spring專案中分別啟動生產者端和消費者端。當然,先要把zookeeper伺服器啟動。
public class Provider1 {
    public static void main(String[] args) throws IOException {
        ClassPathXmlApplicationContext applicationContext = new
            ClassPathXmlApplicationContext(new String[]{"classpath:dubbo_provider1.xml"});      
        applicationContext.start();
        System.in.read();
    }
}
然後,通過消費者端來建立一個使用者,並不斷的請求使用者查詢方法。
public class Consumer1 {    
    @SuppressWarnings("resource")
    public static void main(String[] args) {
        
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext
                (new String[]{"classpath:dubbo_consumer1.xml"});
        context.start();
        
        InfoUserService userService = (InfoUserService) context.getBean("infoUserService");
        
        InfoUser infoUser = new InfoUser();
        infoUser.setId(UUID.randomUUID().toString());
        infoUser.setName("Jack");
        infoUser.setAddress("BeiJing");
        userService.insertInfoUser(infoUser);
        
        while(true) {
            List<InfoUser> userList = userService.getAllUser();
            System.out.println("查詢使用者資訊返回資料:"+JSONObject.toJSONString(userList));
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}
通過上面的程式碼,消費者端就可以源源不斷的從生產者端獲取資料。