前言
Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高效能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向介面的遠端方法呼叫,智慧容錯和負載均衡,以及服務自動註冊和發現。
1、特性
面向介面代理的高效能RPC呼叫
提供高效能的基於代理的遠端呼叫能力,服務以介面為粒度,為開發者遮蔽遠端呼叫底層細節。
智慧負載均衡
內建多種負載均衡策略,智慧感知下游節點健康狀況,顯著減少呼叫延遲,提高系統吞吐量。
服務自動註冊與發現
支援多種註冊中心服務,服務例項上下線實時感知。
高度可擴充套件能力
遵循微核心+外掛的設計原則,所有核心能力如Protocol、Transport、Serialization被設計為擴充套件點,平等對待內建實現和第三方實現。
執行期流量排程
內建條件、指令碼等路由策略,通過配置不同的路由規則,輕鬆實現灰度釋出,同機房優先等功能。
視覺化的服務治理與運維
提供豐富服務治理、運維工具:隨時查詢服務後設資料、服務健康狀態及呼叫統計,實時下發路由策略、調整配置引數。
2、節點角色
角色 | 說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 呼叫遠端服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的呼叫次數和呼叫時間的監控中心 |
Container | 服務執行容器 |
我們再來看一張官網提供的架構圖:
關於更多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框架的最基礎應用,怎麼樣?簡單吧。快來試一試~