Dubbo應用篇

文章目錄

  • 一、Dubbo簡介
  • 二、SSM項目整合Dubbo
    • 1.生產者方配置
    • 2.消費者方配置
  • 三、Spring Boot 項目整合Dubbo
    • 1.生產者方配置
    • 2.消費者方配置
  • 四、應用案例
  • 五、Dubbo配置的優先級別
    • 1. 方法級配置(Highest Priority)
    • 2. 接口級配置
    • 3. 消費者/提供者級配置
    • 4. 全局配置
  • 六、Dubbo超時時間和重試
  • 七、設置本地存根
  • 八、整合Hystrix
  • 總結


一、Dubbo簡介

??Dubbo 是一個RPC(遠程過程調用)服務框架:

  1. 服務注冊與發現:Dubbo 提供內置的注冊中心(如 Zookeeper 等),服務提供者注冊服務,消費者動態發現服務。
  2. 高效的遠程調用:通過支持多種通信協議(默認 Dubbo 協議),實現快速、可靠的遠程方法調用。
  3. 負載均衡:提供多種負載均衡策略,如隨機、輪詢、一致性哈希等,保證服務調用的高效性和穩定性。
  4. 服務治理:包括限流、降級、熔斷、動態路由等功能,提升系統穩定性和靈活性。
  5. 擴展性強:采用模塊化設計,用戶可以根據需求定制和擴展功能。

??Dubbo主要由以下五部分組成:

  1. Provider(服務提供者):提供服務的應用。
  2. Consumer(服務消費者):調用服務的應用。
  3. Registry(注冊中心):管理服務的注冊與發現。
  4. Monitor(監控中心):監控服務的調用性能。
  5. Protocol(協議層):定義服務調用的規則和數據傳輸方式。

在這里插入圖片描述

??常見的遠程調用工具,除了Dubbo還有Open Feign,HttpClient等,那么Dubbo和Open Feign有什么區別?

  1. 框架定位和設計目標
DubboOpenFeign
分布式服務框架,重點在 服務治理聲明式 HTTP 客戶端,主要關注 HTTP 調用
提供端到端的解決方案,包括服務注冊發現、負載均衡、服務路由、服務降級等。偏重于與 REST API 的集成,通常依賴 Spring Cloud 生態提供更多功能。
支持多種通信協議(如 Dubbo 協議、HTTP、gRPC)。僅支持基于 HTTP 的遠程調用。

  1. 通信協議
DubboOpenFeign
支持多種通信協議,默認采用高性能的 Dubbo 協議,基于二進制序列化,通信效率高。僅支持 HTTP,通常基于 JSON 格式的數據交換,性能比二進制協議略低。
可以支持 TCP、HTTP、gRPC 等不同的底層傳輸協議。依賴 HTTP 和 RESTful 風格,靈活性較低。

  1. 注冊與發現
DubboOpenFeign
通過注冊中心(如 Zookeeper、Nacos)實現動態的服務注冊與發現。通常依賴 Spring Cloud 服務注冊中心(如 Eureka、Consul)。
服務發現、路由完全由 Dubbo 框架管理。需要依賴 Spring Cloud 相關組件完成服務發現。

  1. 負載均衡與服務治理
DubboOpenFeign
內置多種負載均衡算法(如隨機、輪詢、一致性哈希)。負載均衡通常依賴 Ribbon 或 Spring Cloud LoadBalancer。
提供豐富的服務治理功能,如熔斷、限流、動態路由等。通常通過 Hystrix、Resilience4j 等第三方庫實現。

  1. 性能與適用場景
DubboOpenFeign
性能高,適合 高并發、低延遲的場景(如 RPC 調用)。易用性高,適合 跨服務的 RESTful 調用 場景。
偏向于大規模、高性能分布式系統。偏向于 REST 風格 API 的微服務開發。

  1. 擴展性與生態
DubboOpenFeign
自帶強大的擴展能力,可以通過 SPI 自定義組件,如協議、序列化機制等。集成簡單,主要依賴 Spring Cloud 生態,與其他組件兼容性好。
社區活躍度較高,但主要適用于阿里系生態。社區支持廣泛,與 Spring Cloud 微服務結合更緊密。

二、SSM項目整合Dubbo

??無論是生產者方,消費者方,首先加入依賴:

<!--        dubbo--><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.2</version></dependency>
<!--        zookeeper--><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>2.10.0</version></dependency>

1.生產者方配置

??resource目錄下編寫provider.xml文件:

<?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://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!-- 1、指定當前服務/應用的名字(同樣的服務名字相同,不要和別的服務同名) --><dubbo:application name="user-service-provider"></dubbo:application><!-- 2、指定注冊中心的位置 在本案例中使用的是zk,也可以使用其他的 --><dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry><!-- 3、指定通信規則(通信協議?通信端口) --><dubbo:protocol name="dubbo" port="20882"></dubbo:protocol><!-- 4、暴露服務   ref:指向服務的真正的實現對象 --><dubbo:service interface="com.atguigu.gmall.service.UserService"ref="userServiceImpl01" timeout="1000" version="1.0.0"><dubbo:method name="getUserAddressList" timeout="1000"></dubbo:method></dubbo:service><!-- 服務的實現 --><bean id="userServiceImpl01" class="com.light.gmall.service.impl.UserServiceImpl"></bean><!--統一設置服務提供方的規則  --><dubbo:provider timeout="1000"></dubbo:provider><!-- 連接監控中心 --><dubbo:monitor protocol="registry"></dubbo:monitor></beans>

2.消費者方配置

<?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"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsdhttp://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd"><!--  掃描消費者的業務類,注冊成bean放入容器--><context:component-scan base-package="com.light.gmall.service.impl"></context:component-scan><dubbo:application name="order-service-consumer"></dubbo:application><dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry><!--聲明需要調用的遠程服務的接口;生成遠程服務代理  --><dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService" timeout="5000" retries="3" version="*"></dubbo:reference><!-- 配置當前消費者的統一規則:所有的服務都不檢查 --><dubbo:consumer check="false" timeout="5000"></dubbo:consumer><dubbo:monitor protocol="registry"></dubbo:monitor></beans>

三、Spring Boot 項目整合Dubbo

??同樣地,無論是生產者方,消費者方,首先加入依賴,并且啟動類上加入@EnableDubbo注解:

		<dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency>

1.生產者方配置

dubbo.application.name=user-service-provider #指定當前服務/應用的名字
dubbo.registry.address=127.0.0.1:2181 #指定注冊中心的位置
dubbo.registry.protocol=zookeeper  #指定注冊中心的類型dubbo.protocol.name=dubbo # 指定通信協議
dubbo.protocol.port=20880 # 指定通信端口dubbo.monitor.protocol=registry #連接監控中心

??暴露服務可以通過@Service注解實現,該注解是import com.alibaba.dubbo.config.annotation.Service。并且只能加在類上。

2.消費者方配置

dubbo.application.name=boot-order-service-consumer # 指定當前服務/應用的名字
dubbo.registry.address=zookeeper://127.0.0.1:2181	# 指定注冊中心
dubbo.monitor.protocol=registry #連接監控中心

??調用生產者方暴露的類的方法,可以在注入目標類時加入@Reference方法,并且可以指定負載均衡和超時時間等策略:

	@Reference(loadbalance="random",timeout=1000) //dubbo直連UserService userService;

四、應用案例

??在本篇的應用中,將所有需要被遠程調用的接口,抽取成一個獨立的模塊進行管理,消費者生產者去依賴該模塊:
在這里插入圖片描述??生產者方:

@Service//暴露服務 
@Component
public class UserServiceImpl implements UserService {@HystrixCommand@Overridepublic List<UserAddress> getUserAddressList(String userId) {// TODO Auto-generated method stubSystem.out.println("UserServiceImpl..3.....");UserAddress address1 = new UserAddress(1, "xxxx", "1", "李老師", "010-56253825", "Y");UserAddress address2 = new UserAddress(2, "yyyy", "1", "王老師", "010-56253825", "N");if(Math.random()>0.5) {throw new RuntimeException();}return Arrays.asList(address1,address2);}}

??消費者方:

@Controller
public class OrderController {@AutowiredOrderService orderService;@ResponseBody@RequestMapping("/initOrder")public List<UserAddress> initOrder(@RequestParam("uid")String userId) {return orderService.initOrder(userId);}}
@Service
public class OrderServiceImpl implements OrderService {//@Autowired@Reference(loadbalance="random",timeout=1000) //dubbo直連UserService userService;@HystrixCommand(fallbackMethod="hello")@Overridepublic List<UserAddress> initOrder(String userId) {// TODO Auto-generated method stubSystem.out.println("用戶id:"+userId);//1、查詢用戶的收貨地址return userService.getUserAddressList(userId);}
}

??啟動Zookeeper和Dubbo-Admin,訪問Controller層的路徑:
在這里插入圖片描述
??登錄Dubbo Admin也可以看到:
在這里插入圖片描述在這里插入圖片描述

五、Dubbo配置的優先級別

總體原則
環境變量或啟動參數的優先級更高:

  • 如果通過系統屬性(如 -D 參數)或環境變量設置某些配置,它們會覆蓋 XML 或注解中的設置。

動態配置的優先級更高:

  • Dubbo Admin 提供的動態配置可以在運行時覆蓋靜態配置,優先級更高。

本地優先于遠程:

  • 如果本地和遠程注冊中心(如 Zookeeper)同時有配置,本地配置通常優先生效。

1. 方法級配置(Highest Priority)

  • 方法級配置對單個方法生效,優先級最高。
  • 主要用于對某些特殊方法的調用行為進行單獨優化。
<dubbo:reference id="demoService" interface="com.example.DemoService"><dubbo:method name="sayHello" timeout="3000" retries="2"/>
</dubbo:reference>

2. 接口級配置

  • 通過 <dubbo:reference><dubbo:service> 對整個接口的行為進行配置。
  • 優先級低于方法級配置,但高于全局配置。
<dubbo:reference id="demoService" interface="com.example.DemoService" timeout="5000" retries="3"/>

3. 消費者/提供者級配置

  • 分別通過 <dubbo:consumer><dubbo:provider> 標簽進行配置,針對消費者或提供者應用全局生效。
  • 優先級低于接口級配置。
<dubbo:consumer timeout="6000" retries="1"/>
<dubbo:provider timeout="4000"/>

4. 全局配置

  • 通過 <dubbo:application><dubbo:registry> 等標簽進行全局性配置。
  • 優先級最低,提供默認值或全局設置。
<dubbo:application name="demoApplication"/>
<dubbo:registry address="zookeeper://127.0.0.1:2181"/>

六、Dubbo超時時間和重試

??在Spring Boot項目中,設置超時時間和重試次數,可以通過在服務消費端的 @DubboReference 注解中設置,優先級高于配置文件中的全局配置。

	@Reference(loadbalance="random",timeout=1000,retries = 3) //dubbo直連UserService userService;

??可以在配置文件中全局設置:

dubbo:consumer:timeout: 5000  # 超時時間,單位為毫秒retries: 2  # 重試次數

??可以在配置文件中單個設置:

dubbo:consumer:services:com.example.MyService:retries: 1  # 針對某個服務的重試次數timeout: 3000  # 指定服務的超時時間

??上述兩段配置是放在消費者方的,如果消費者沒有設置,可以在生產者方設置:

dubbo:provider:timeout: 5000retries: 2

??如果需要更細粒度控制到接口中的方法級別,則可以:

dubbo:consumer:services:com.example.MyService:methods:- name: method1retries: 0  # method1 不重試- name: method2retries: 2  # method2 重試 2 次

??演示接口超時
在這里插入圖片描述在這里插入圖片描述??目前在頁面上是直接打印出了報錯信息,后續可以通過引入Hystrix引導到降級邏輯上。
在這里插入圖片描述

七、設置本地存根

??Dubbo 本地存根用于在消費端(Consumer)對服務進行代理或增強,常用于參數校驗、緩存、限流等場景。
??編寫本地存根方法,和接口放在同一個包下
在這里插入圖片描述

public class UserServiceStub implements UserService{private final UserService userService;public UserServiceStub(UserService userService) {this.userService = userService;}/*** 按照用戶id返回所有的收貨地址** @param userId* @return*/@Overridepublic List<UserAddress> getUserAddressList(String userId) {System.out.println("進入本地存根方法....");return userService.getUserAddressList(userId);}
}

??在消費者方的@Reference注解上加入stub = "存根類的全路徑",重新訪問接口:
在這里插入圖片描述

八、整合Hystrix

??在生產者方和消費者方同時引入依賴,并且在啟動類上加入@EnableHystrix

	<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-hystrix</artifactId></dependency>

??生產者方對外暴露的方法上加入@HystrixCommand注解:
在這里插入圖片描述
??消費者方同樣加上注解,并且指定觸發降級后的邏輯:@HystrixCommand(fallbackMethod="hello"),在本案例中,觸發降級之后,會調用hello方法。
在這里插入圖片描述??觸發降級策略:
在這里插入圖片描述

總結

??本篇介紹了Dubbo在SSM項目,以及Spring Boot項目中的集成使用,以及配置文件的優先級,超時時間和重試機制等。此外還有負載均衡策略,如何保證高可用,在官方文檔里都有提及,本篇不再贅述。
Dubbo官方文檔

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/62149.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/62149.shtml
英文地址,請注明出處:http://en.pswp.cn/web/62149.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ubuntu的matlab使用心得

1.讀取視頻 v VideoReader(2222.mp4);出問題&#xff0c;報錯&#xff1a; matlab 錯誤使用 VideoReader/initReader (第 734 行) 由于出現意外錯誤而無法讀取文件。原因: Unable to initialize the video properties 出錯 audiovideo.internal.IVideoReader (第 136 行) init…

消息中間件-Kafka1-實現原理

消息中間件-Kafka 一、kafka簡介 1、概念 Kafka是最初由Linkedin公司開發&#xff0c;是一個分布式、支持分區&#xff08;partition&#xff09;、多副本的&#xff08;replica&#xff09;&#xff0c;基于zookeeper協調的分布式消息系統&#xff0c;它的最大的特性就是可以…

如何利用“一鍵生成ppt”減輕工作壓力

隨著數字化的快速發展&#xff0c;PPT設計這一傳統任務也迎來了新的變化。過去&#xff0c;制作一個簡潔、專業的PPT需要花費大量時間與精力。但現在借助科技的力量&#xff0c;一鍵生成PPT的夢想成真了。從智能生成ppt到ai生成ppt的技術不斷進步&#xff0c;令我們能夠體驗到更…

創造未來:The Sandbox 創作者訓練營如何賦能全球創造者

創作者訓練營讓創造者有能力打造下一代數字體驗。通過促進合作和提供尖端工具&#xff0c;The Sandbox 計劃確保今天的元宇宙是由一個個創造者共同打造。 2024 年 5 月&#xff0c;The Sandbox 推出了「創作者訓練營」系列&#xff0c;旨在重新定義數字創作。「創作者訓練營」系…

Docker多架構鏡像構建踩坑記

背景 公司為了做信創項目的亮點&#xff0c;需要將現有的一套在X86上運行的應用系統遷移到ARM服務器上運行&#xff0c;整個項目通過后端Java&#xff0c;前端VUEJS開發通過CICD做成Docker鏡像在K8S里面運行。但是當前的CICD產品不支持ARM的鏡像構建&#xff0c;于是只能手工構…

python學opencv|讀取圖像(三)放大和縮小圖像

【1】引言 前序已經學習了常規的圖像讀取操作和圖像保存技巧&#xff0c;相關文章鏈接為&#xff1a; python學opencv|讀取圖像-CSDN博客 python學opencv|讀取圖像&#xff08;二&#xff09;保存彩色圖像-CSDN博客 今天我們更近一步&#xff0c;學習放大和縮小圖像的技巧&…

D86【python 接口自動化學習】- pytest基礎用法

day86 pytest配置testpaths 學習日期&#xff1a;20241202 學習目標&#xff1a;pytest基礎用法 -- pytest配置testpaths 學習筆記&#xff1a; pytest配置項 主目錄創建pytest.ini文件 [pytest] testpaths./testRule 然后Terminal里直接命令&#xff1a;pytest&#xff…

基于 Apache Dolphinscheduler3.1.9中的Task 處理流程解析

實現一個調度任務&#xff0c;可能很簡單。但是如何讓工作流下的任務跑得更好、更快、更穩定、更具有擴展性&#xff0c;同時可視化&#xff0c;是值得我們去思考得問題。 Apache DolphinScheduler是一個分布式和可擴展的開源工作流協調平臺&#xff0c;具有強大的DAG可視化界…

藍橋杯2117砍竹子(簡單易懂 包看包會版)

問題描述 這天, 小明在砍竹子, 他面前有 n 棵竹子排成一排, 一開始第 i 棵竹子的 高度為 hi?. 他覺得一棵一棵砍太慢了, 決定使用魔法來砍竹子。魔法可以對連續的一 段相同高度的竹子使用, 假設這一段竹子的高度為 H, 那么 用一次魔法可以 把這一段竹子的高度都變為 ?H2?…

如何進行 JavaScript 性能優化?

要進行 JavaScript 性能優化&#xff0c;我們可以從多個角度進行思考&#xff0c;主要包括減少頁面渲染時間、減少內存占用、優化代碼執行效率等。以下是優化的一些方法&#xff0c;并結合實際項目代碼示例講解。 目錄結構 減少 DOM 操作 緩存 DOM 元素批量更新 DOM 優化 Jav…

CTF-PWN: 全保護下格式化字符串利用 [第一屆“吾杯”網絡安全技能大賽 如果能重來] 賽后學習(不會)

通過網盤分享的文件&#xff1a;如果能重來.zip 鏈接: https://pan.baidu.com/s/1XKIJx32nWVcSpKiWFQGpYA?pwd1111 提取碼: 1111 --來自百度網盤超級會員v2的分享漏洞分析 格式化字符串漏洞,在printf(format); __int64 sub_13D7() {char format[56]; // [rsp10h] [rbp-40h]…

selenium-常見問題解決方案匯總

selenium-常見問題解決方案 selenium版本selenium代理本地瀏覽器頁面Selenium之多窗口句柄的切換 selenium版本 selenium版本為: 3.141.0 注&#xff1a;selenium4x跟selenium3x會有不同的使用方法&#xff0c; selenium代理本地瀏覽器頁面 利用 Selenium 庫實現對 Google C…

Flask使用長連接

Flask使用flask_socketio實現websocket Python中的單例模式 在HTTP通信中&#xff0c;連接復用&#xff08;Connection Reuse&#xff09;是一個重要的概念&#xff0c;它允許客戶端和服務器在同一個TCP連接上發送和接收多個HTTP請求/響應&#xff0c;而不是為每個新的請求/響…

雨晨 26100.2454 Windows 11 24H2 專業工作站 極簡純凈版

文件: 雨晨 26100.2454 Windows 11 24H2 專業工作站極簡 install.esd 大小: 1947043502 字節 修改時間: 2024年12月6日, 星期五, 16:38:37 MD5: 339B7FDCA0130D432A0E98957738A9DD SHA1: 2978AE0CEAF02E52EC4135200D4BDBC861E07BE8 CRC32: 8C329C89 簡述&#xff1a; 由YCDIS…

[docker中首次配置git環境與時間同步問題]

11月沒寫東西&#xff0c;12月初趕緊水一篇。 剛開始搭建docker服務器時&#xff0c;網上找一堆指令配置好git后&#xff0c;再次新建容器后忘記怎么配了&#xff0c;&#xff0c;這次記錄下。 一、git ssh指令法&#xff0c;該方法不用每次提交時輸入密碼 前期準備&#xff0…

MongoDB性能監控工具

mongostat mongostat是MongoDB自帶的監控工具&#xff0c;其可以提供數據庫節點或者整個集群當前的狀態視圖。該功能的設計非常類似于Linux系統中的vmstat命令&#xff0c;可以呈現出實時的狀態變化。不同的是&#xff0c;mongostat所監視的對象是數據庫進程。mongostat常用于…

linux下的python打包

linux下的python打包 一、pyinstaller 優點&#xff1a;打包簡單&#xff0c;將整個運行環境進行打包 缺點&#xff1a;打包文件大、臃腫、啟動慢 安裝pyinstaller包 pip install pyinstaller 打包一個文件 pyinstaller -D app.py會在當前路徑中生成build、dist文件夾還有…

Python模塊之random、hashlib、json、time等內置模塊語法學習

Python內置模塊語法學習 random、hashlib、json、time、datetime、os等內置模塊語法學習 模塊 簡單理解為就是一個.py后綴的一個文件 分為三種&#xff1a; 內置模塊&#xff1a;python自帶&#xff0c;可調用第三方模塊&#xff1a;別人設計的&#xff0c;可調用自定義模塊…

從ctfwiki開始的pwn之旅 5.ret2csu

ret2csu 原理 在 64 位程序中&#xff0c;函數的前 6 個參數是通過寄存器傳遞的&#xff0c;但是大多數時候&#xff0c;我們很難找到每一個寄存器對應的 gadgets。 這時候&#xff0c;我們可以利用 x64 下的 __libc_csu_init 中的 gadgets。這個函數是用來對 libc 進行初始…

Ceph對象存儲

Ceph對象存儲1.概念對象存儲&#xff08;Object Storage&#xff09;是一種用于存儲大量非結構化數據的架構模型它使用簡單的HTTP或HTTPS協議進行文件訪問&#xff0c;而不是傳統的文件系統API與傳統的文件系統存儲方式不同&#xff0c;對象存儲不是將數據存儲在目錄或文件夾中…