Dubbo原始碼分析(一)Dubbo與Spring整合例項

清幽之地發表於2019-03-19

前言

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

1、特性

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

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

智慧負載均衡

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

服務自動註冊與發現

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

高度可擴充套件能力

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

執行期流量排程

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

視覺化的服務治理與運維

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

2、節點角色

角色 說明
Provider 暴露服務的服務提供方
Consumer 呼叫遠端服務的服務消費方
Registry 服務註冊與發現的註冊中心
Monitor 統計服務的呼叫次數和呼叫時間的監控中心
Container 服務執行容器

我們再來看一張官網提供的架構圖:

dubbo-architecture.jpg

關於更多Dubbo的架構、用法等,請訪問官網:http://dubbo.apache.org/zh-cn/index.html

一、與Spring整合

Dubbo 採用全 Spring 配置方式,透明化接入應用,對應用沒有任何 API 侵入,只需用 Spring 載入 Dubbo 的配置即可,Dubbo基於Spring的Schema擴充套件進行載入。

所以,我們想使用Dubbo,只需引入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();
			}
        }
	}
}
複製程式碼

通過上面的程式碼,消費者端就可以源源不斷的從生產者端獲取資料。以上為Dubbo框架的最基礎應用,怎麼樣?簡單吧。快來試一試~

相關文章