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.mzph.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;对象存储不是将数据存储在目录或文件夹中…