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.xsd
		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
		http://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.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd
		http://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
	@Override
	public List<UserAddress> getUserAddressList(String userId) {
		// TODO Auto-generated method stub
		System.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 {
	
	@Autowired
	OrderService 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")
	@Override
	public List<UserAddress> initOrder(String userId) {
		// TODO Auto-generated method stub
		System.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: 5000
    retries: 2

  如果需要更细粒度控制到接口中的方法级别,则可以:

dubbo:
  consumer:
    services:
      com.example.MyService:
        methods:
          - name: method1
            retries: 0  # method1 不重试
          - name: method2
            retries: 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
     */
    @Override
    public 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官方文档

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/930802.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法 五大算法

文章目录 1&#xff0c;时间复杂度与空间复杂度 2&#xff0c;插入排序 3&#xff0c;希尔排序 4&#xff0c;选择排序 1&#xff0c;单趟排序 2&#xff0c;选择排序PLUS版本 5&#xff0c;冒泡排序 6&#xff0c;快速排序 1&#xff0c;hoare版本 2&#xff0c;挖坑法 前言 …

子类有多个父类的情况下Super不支持指定父类来调用方法

1、Super使用方法 super()函数在Python中用于调用父类的方法。它返回一个代理对象&#xff0c;可以通过该对象调用父类的方法。 要使用super()方法&#xff0c;需要在子类的方法中调用super()&#xff0c;并指定子类本身以及方法的名称。这样就可以在子类中调用父类的方法。 …

Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…

python学opencv|读取视频(一)灰度视频制作和保存

【1】引言 上一次课学习了用opencv读取图像&#xff0c;掌握了三个函数&#xff1a;cv.imread()、cv.imshow()、cv.imwrite() 相关链接如下&#xff1a; python学opencv|读取图像-CSDN博客 这次课我们继续&#xff0c;来学习用opencv读取视频。 【2】学习资源 首先是官网…

buuctf:被嗅探的流量

解压后用wireshark查看 flag{da73d88936010da1eeeb36e945ec4b97}

数据清洗代码:缺失值,异常值,离群值Matlab处理

目录 基本介绍程序设计参考资料基本介绍 一、过程概述 本过程适用于处理SCADA系统采集到的数据,以及具有类似需求的数据集。处理步骤包括缺失值处理、异常值处理和离群值处理,旨在提升数据质量,增强数据的相关性,同时保持数据的原始特征和随机性。 二、缺失值处理 对于SC…

深入浅出:Go语言中的错误处理

深入浅出&#xff1a;Go语言中的错误处理 引言 在任何编程语言中&#xff0c;错误处理都是一个至关重要的方面。它不仅影响程序的稳定性和可靠性&#xff0c;还决定了用户体验的质量。Go语言以其简洁明了的语法和强大的并发模型而著称&#xff0c;但其错误处理机制同样值得关…

青海摇摇了3天,技术退步明显.......

最近快手上的青海摇招聘活动非常火热&#xff0c;我已经在思考是否备战张诗尧的秋招活动。开个玩笑正片开始&#xff1a; 先说一下自己的情况&#xff0c;大专生&#xff0c;20年通过校招进入杭州某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c…

【计算机网络】 —— 数据链路层(壹)

文章目录 前言 一、概述 1. 基本概念 2. 数据链路层的三个主要问题 二、封装成帧 1. 概念 2. 帧头、帧尾的作用 3. 透明传输 4. 提高效率 三、差错检测 1. 概念 2. 奇偶校验 3. 循环冗余校验CRC 1. 步骤 2. 生成多项式 3. 例题 4. 总结 四、可靠传输 1. 基本…

敏捷开发之路

1. 引言 最近有个企业软件开发项目&#xff0c;用户要求采用敏捷开发的方法实施项目。以前也参加过敏捷方法的培训&#xff0c;结合最近找的敏捷开发材料&#xff0c;形成了下面的敏捷实施过程内容。 以下采用了QAD量化敏捷开发方法&#xff0c;关于此方法详细参考内容见最后…

Linux-音频应用编程

ALPHA I.MX6U 开发板支持音频&#xff0c;板上搭载了音频编解码芯片 WM8960&#xff0c;支持播放以及录音功能&#xff01;本章我们来学习 Linux 下的音频应用编程&#xff0c;音频应用编程相比于前面几个章节所介绍的内容、其难度有所上升&#xff0c;但是笔者仅向大家介绍 Li…

电影院订票选座小程序+ssm

题目&#xff1a;电影院订票选座小程序的设计与实现 摘 要 由于APP软件在开发以及运营上面所需成本较高&#xff0c;而用户手机需要安装各种APP软件&#xff0c;因此占用用户过多的手机存储空间&#xff0c;导致用户手机运行缓慢&#xff0c;体验度比较差&#xff0c;进而导致…

【网络】网络基础知识(协议、mac、ip、套接字)

文章目录 1. 计算机网络的背景2. 认识网络协议2.1 协议分层2.2 OS与网络的关系 3. 网络传输基本流程3.1 局域网通信流程3.2 跨网络通信流程 4. Socket 编程预备4.1 理解源IP地址和目的IP地址4.2 端口号与Socket4.3传输层的典型代表4.4 网络字节序 5. socket 编程接口5.1 介绍5.…

Kubernetes(K8S) + Harbor + Ingress 部署 SpringBoot + Vue 前后端分离项目

文章目录 1、环境准备2、搭建 K8S3、搭建 Harbor4、搭建 MySQL5、构建 SpringBoot 项目镜像6、构建 Vue.js 项目镜像7、部署项目 7.1、配置 NameSpace7.2、配置 Deployment、Service7.3、配置 Ingress-Nginx7.4、访问测试 1、环境准备 本次整体项目部署使用的是阿里云ECS服…

自回归模型(AR )

最近看到一些模型使用了自回归方法&#xff0c;这里就学习一下整理一下相关内容方便以后查阅。 自回归模型&#xff08;AR &#xff09; 自回归模型&#xff08;AR &#xff09;AR 模型的引入AR 模型的定义参数的估计方法模型阶数选择平稳性与因果性条件自相关与偏自相关函数优…

学习Python的笔记--面向对象-继承

1、概念 多个类之间的所属关系&#xff0c;即子类默认继承父类的所有属性和方法。 注&#xff1a;所有类默认继承object类&#xff0c;object类是顶级类或基类&#xff1b; 其他子类叫做派生类。 #父类A class A(object):def __init__(self):self.num1def info_print(self)…

2024数字科技生态大会 | 紫光展锐携手中国电信助力数字科技高质量发展

2024年12月3日至5日&#xff0c;中国电信2024数字科技生态大会在广州举行&#xff0c;通过主题峰会、多场分论坛、重要签约及合作发布等环节&#xff0c;与合作伙伴共绘数字科技发展新愿景。紫光展锐作为中国电信的战略合作伙伴受邀参会&#xff0c;全面呈现了技术、产品创新进…

基于STM32的智慧宿舍系统(DAY5)_光照传感器、MQ2、电流传感器、紫外线传感器

注意上述右图的配置需要根据我们实际所使用的通道来&#xff0c;239.5这个是采样时间&#xff0c;根据需要调整&#xff0c;然后我们打到DMA配置项&#xff0c;如下图 这个地方只有DMA模式需要调整&#xff0c;完成上述配置后我们就可以生成代码了&#xff0c;然后我们按照如下…

NDK编译(使用Android.mk)C/C++程序和库

1、编译可执行目标文件 1.1、编写源代码 源代码可以是c或cpp文件&#xff0c;但一定要包含main函数&#xff0c;否则会报错。例如&#xff1a; //test.c #include <stdio.h> int main() {printf("Hello,NDK!"); } 1.2 编写Android.mk文件 编写Android.mk文…

使用Excel 对S型曲线加减速算法进行仿真

项目场景&#xff1a; 项目场景&#xff1a;代码中写了S型加减速算法&#xff0c;相查看生成的加减速数组&#xff0c;直观的展示出来&#xff0c;USB通信一次64字节&#xff0c;对于我几个个32位的频率值不太方便&#xff0c;于是采用Excel进行仿真。 代码中如何生成S加减速曲…