Dubbo解析之與Spring整合
阿新 • • 發佈:2021-12-06
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(); } } } }通過上面的程式碼,消費者端就可以源源不斷的從生產者端獲取資料。