Apache Dubbo (incubating) |ˈdʌbəʊ| 是一款高性能、輕量級的開源Java RPC框架,它提供了三大核心能力:面向接口的遠程方法調用,智能容錯和負載均衡,以及服務自動註冊和發現。html
提供高性能的基於代理的遠程調用能力,服務以接口爲粒度,爲開發者屏蔽遠程調用底層細節。java
內置多種負載均衡策略,智能感知下游節點健康情況,顯著減小調用延遲,提升系統吞吐量。spring
支持多種註冊中心服務,服務實例上下線實時感知。apache
遵循微內核+插件的設計原則,全部核心能力如Protocol、Transport、Serialization被設計爲擴展點,平等對待內置實現和第三方實現。bash
內置條件、腳本等路由策略,經過配置不一樣的路由規則,輕鬆實現灰度發佈,同機房優先等功能。服務器
提供豐富服務治理、運維工具:隨時查詢服務元數據、服務健康狀態及調用統計,實時下發路由策略、調整配置參數。架構
角色 | 說明 |
---|---|
Provider | 暴露服務的服務提供方 |
Consumer | 調用遠程服務的服務消費方 |
Registry | 服務註冊與發現的註冊中心 |
Monitor | 統計服務的調用次數和調用時間的監控中心 |
Container | 服務運行容器 |
咱們再來看一張官網提供的架構圖: app
關於更多Dubbo的架構、用法等,請訪問官網:http://dubbo.apache.org/zh-cn/index.html
負載均衡
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;
}
}
複製代碼
咱們先來看一下生產者端的配置文件。
<?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>
複製代碼
<?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框架的最基礎應用,怎麼樣?簡單吧。快來試一試~