Dubbo源碼分析(一)Dubbo與Spring集成實例

前言

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

一、特性

面向接口代理的高性能RPC調用

提供高性能的基於代理的遠程調用能力,服務以接口爲粒度,爲開發者屏蔽遠程調用底層細節。java

智能負載均衡

內置多種負載均衡策略,智能感知下游節點健康情況,顯著減小調用延遲,提升系統吞吐量。spring

服務自動註冊與發現

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

高度可擴展能力

遵循微內核+插件的設計原則,全部核心能力如Protocol、Transport、Serialization被設計爲擴展點,平等對待內置實現和第三方實現。bash

運行期流量調度

內置條件、腳本等路由策略,經過配置不一樣的路由規則,輕鬆實現灰度發佈,同機房優先等功能。服務器

可視化的服務治理與運維

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

二、節點角色

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

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

dubbo-architecture.jpg

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

1、與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>
複製代碼

首先,咱們要定義接口和實現類,在這裏咱們仍是搞一個操做用戶信息的接口。

一、接口

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;
	}
}

複製代碼

二、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>
複製代碼

三、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>
複製代碼

四、啓動

配置好以後,咱們就能夠在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框架的最基礎應用,怎麼樣?簡單吧。快來試一試~

相關文章
相關標籤/搜索