【微服务生态】Dubbo

文章目录

  • 一、概述
  • 二、Dubbo环境搭建-docker版
  • 三、Dubbo配置
  • 四、高可用
    • 4.1 zookeeper宕机与dubbo直连
    • 4.2 负载均衡
  • 五、服务限流、服务降级、服务容错
  • 六、Dubbo 对比 OpenFeign

一、概述

Dubbo 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。对标Spring Cloud 中的 OpenFeign但功能更丰富,含限流、降级、熔断,另外可搭配 Hystrix 使用。一般搭配注册中心 ZooKeeper 使用。Dubbo底层通信使用的是netty。介于目前Dubbo发展及使用情况,本章内容仅蜻蜓点水般介绍Dubbo及使用,并不深入研究,如需深入学习,请参考官网。

官网:http://dubbo.apache.org/

在这里插入图片描述

服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

二、Dubbo环境搭建-docker版

  1. 注册中心 ZooKeeper,docker启动:docker run zookeeper
  2. 编写 dubbo-admin配置文件 application.properties ,后续需使用,本人放在 /root/dockerData/dubbo/dubbo-admin/properties 目录
in.registry.address=zookeeper://192.168.115.129:2181
admin.config-center=zookeeper://192.168.115.129:2181
admin.root.user.name=root
admin.root.user.password=root
admin.check.signSecret=86295dd0c4ef69a1036b0b0c15158d77
  1. 启动 dubbo-admin:docker run -itd --net=host --name dubbo-admin -v /root/dockerData/dubbo/dubbo-admin/properties:/config apache/dubbo-admin 。官网:https://github.com/apache/dubbo-admin
  2. 参考官网搭建 dubbo 示例项目:https://cn.dubbo.apache.org/zh-cn/overview/quickstart/java/spring-boot/ ,动手实践(从零代码开发版)

这里提供一下 dubbo-spring-boot-demo 各工程代码:

父工程pom文件关键部分

<properties><dubbo.version>3.2.0-beta.4</dubbo.version><spring-boot.version>2.7.8</spring-boot.version><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencyManagement><dependencies><!-- Spring Boot --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><!-- Dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-bom</artifactId><version>${dubbo.version}</version><type>pom</type><scope>import</scope></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><version>${dubbo.version}</version><type>pom</type></dependency></dependencies>
</dependencyManagement><build><pluginManagement><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>${spring-boot.version}</version></plugin></plugins></pluginManagement>
</build>

dubbo-spring-boot-demo-interface

public interface DemoService {String sayHello(String name);
}

dubbo-spring-boot-demo-provider

pom文件关键部分

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-demo-interface</artifactId><version>${project.parent.version}</version></dependency><!-- dubbo --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-spring-boot-starter</artifactId></dependency><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo-dependencies-zookeeper-curator5</artifactId><type>pom</type><exclusions><exclusion><artifactId>slf4j-reload4j</artifactId><groupId>org.slf4j</groupId></exclusion></exclusions></dependency><!-- spring boot starter --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency>
</dependencies>

业务类

@DubboService
public class DemoServiceImpl implements DemoService {@Overridepublic String sayHello(String name) {return "Hello " + name;}
}

主启动类

@SpringBootApplication
@EnableDubbo
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}
}

配置文件:

dubbo:application:name: dubbo-springboot-demo-providerprotocol:name: dubboport: -1registry:address: zookeeper://${zookeeper.address:192.168.115.129}:2181

dubbo-spring-boot-demo-consumer

pom文件关键部分:同 dubbo-spring-boot-demo-provider

主启动类

@SpringBootApplication
@EnableDubbo
public class ConsumerApplication {public static void main(String[] args) {SpringApplication.run(ConsumerApplication.class, args);}
}

配置文件

dubbo:application:name: dubbo-springboot-demo-consumerprotocol:name: dubboport: -1registry:address: zookeeper://${zookeeper.address:192.168.115.129}:2181

业务类

@Component
public class Task implements CommandLineRunner {@DubboReferenceprivate DemoService demoService;@Overridepublic void run(String... args) throws Exception {String result = demoService.sayHello("world");System.out.println("Receive result ======> " + result);new Thread(()-> {while (true) {try {Thread.sleep(1000);System.out.println(new Date() + " Receive result ======> " + demoService.sayHello("world"));} catch (InterruptedException e) {e.printStackTrace();Thread.currentThread().interrupt();}}}).start();}
}

三、Dubbo配置

可参考配置手册:https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/

这里仅提供部分常用配置:

  1. 重试次数:用于幂等接口(查询、修改、删除,重复调用不影响的接口),不能用于非幂等接口(新增)
  2. 超时时间:由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时)。为避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间

上面设置分别可通过 @DubboReference 注解的 retriestimeout 属性进行设置,如果需要进行全局配置,可参考配置手册

四、高可用

4.1 zookeeper宕机与dubbo直连

现象:zookeeper注册中心宕机,还可以消费dubbo暴露的服务

原因:

  • 监控中心宕掉不影响使用,只是丢失部分采样数据
  • 数据库宕掉后,注册中心仍能通过缓存提供服务列表查询,但不能注册新服务
  • 注册中心对等集群,任意一台宕掉后,将自动切换到另一台
  • 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
  • 服务提供者无状态,任意一台宕掉后,不影响使用
  • 服务提供者全部宕掉后,服务消费者应用将无法使用,并无限次重连等待服务提供者恢复

dubbo直连:通过 @DubboReferenceurl 属性可以设置直接调用服务接口的访问url,无需通过注册中心访问服务

4.2 负载均衡

可通过 @DubboReferenceloadbalance 属性设置负载均衡策略,可选值

  • random:随机,默认
  • roundrobin:轮询;
  • leastactive:最少活跃调用;
  • consistenthash:哈希一致 (2.1.0以上版本);
  • shortestresponse:最短响应 (2.7.7以上版本);

多个注解的 stub 属性:缺省代理类,设为true,表示使用缺省代理类名,即:接口名 + Stub后缀,服务接口客户端本地代理类名,用于在客户端执行本地逻辑,如本地缓存等,该本地代理类的构造函数必须允许传入远程代理对象,构造函数如:public XxxServiceStub(XxxService xxxService)

五、服务限流、服务降级、服务容错

@DubboReferencemock 属性设置,当 mock="return null" 时,即当服务提供者出现异常(宕机或者业务异常),则返回null给服务消费者

另外 @DubboReference 中提供了一些限流,集群容错的配置,可直接看下面官网,这里不再详述

https://cn.dubbo.apache.org/zh-cn/overview/mannual/java-sdk/reference-manual/config/properties/#reference

另外,Dubbo 还可结合其他如 Hystrix 框架,进行服务服务治理。

六、Dubbo 对比 OpenFeign

  • 通信协议:Dubbo使用自定义的RPC协议进行通信,而Feign使用HTTP协议进行通信

    Dubbo提供了更多的协议支持,包括Dubbo协议、HTTP协议、Hessian协议、Thrift协议等,而OpenFeign仅支持HTTP协议

  • 服务调用方式:Dubbo采用的是服务间直接的点对点调用方式,而Feign则是通过服务提供方的统一API网关进行服务调用

  • 服务治理:Dubbo提供了更多的负载均衡策略、容错策略和注册中心支持,而OpenFeign则需要依赖于其他组件来实现这些功能

  • 同步/异步调用:Dubbo支持同步和异步调用,而Feign主要支持同步调用

  • Dubbo的性能更高,但使用起来相对复杂,需要进行一定的配置和学习,而OpenFeign则更加简单易用

总的来说,Dubbo适用于复杂的分布式系统,提供了更多的功能和灵活性,但使用和配置相对较为复杂。而Feign更适合轻量级的微服务架构,使用简单且易于上手。选择使用哪种框架需要考虑具体的项目需求和实际情况。

Spring Cloud Alibaba 2022版本取消了对 Dubbo 的集成,这是因为 Spring Cloud Alibaba 团队认为 Dubbo 和 Spring Cloud 的设计理念有所不同,无法完全融合。同时,Dubbo 作为一个独立的 RPC 框架,已经有了很成熟的技术和社区,可以独立地和 Spring Cloud 集成使用。因此,取消了对 Dubbo 的集成,也可以让 Spring Cloud Alibaba 团队更加专注于自己的设计和实现。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

总结Rabbitmq的六种模式

RabbitMQ六种工作模式 RabbitMQ是由erlang语言开发&#xff0c;基于AMQP&#xff08;Advanced Message Queue 高级消息队列协议&#xff09;协议实现的消息队列&#xff0c;它是一种应用程序之间的通信方法&#xff0c;消息队列在分布式系统开发中应用非常广泛。 RabbitMQ有六…

9.vue学习笔记(组件传递Props校验+组件事件-组件传递数据+组件事件-配合“v-model”使用)

文章目录 1.组件传递Props校验1.1.默认值1.2.必选项1.3.注意事项&#xff1a;props 是只读的 2.组件事件-组件传递数据2.1.温馨提示&#xff1a;组件之间传递数据的方案 3.组件事件-配合“v-model”使用 1.组件传递Props校验 Vue组件可以更细致地声明对传入的 props 的校验要求…

顺序表经典算法及其相关思考

27. 移除元素 - 力扣&#xff08;LeetCode&#xff09; 思路一 利用顺序表中的SLDestroy函数的思想&#xff0c;遇到等于val值的就挪动 思路二 双指针法&#xff1a;不停的将和val不相等的数字往前放。此时的des更像一个空数组&#xff0c;里面存放的都是和val不相等、能够存…

【人工智能学习思维脉络导图】

曾梦想执剑走天涯&#xff0c;我是程序猿【AK】 目录 知识图谱1. 基础知识2.人工智能核心概念3.实践与应用4.持续学习与进展5.挑战与自我提升6.人脉网络 知识图谱 人工智能学习思维脉络导图 1. 基础知识 计算机科学基础数学基础&#xff08;线性代数、微积分、概率论和统计学…

先进语言模型带来的变革与潜力

用户可以通过询问或交互方式与GPT-4这样的先进语言模型互动&#xff0c;开启通往知识宝库的大门&#xff0c;即时访问人类历史积累的知识、经验与智慧。像GPT-4这样的先进语言模型&#xff0c;能够将人类历史上积累的海量知识和经验整合并加以利用。通过深度学习和大规模数据训…

第十四章[面向对象]:14.5:访问限制/属性

一,动态添加属性/方法 1,动态添加实例属性和实例方法 from types import MethodTypeclass Student:passs = Student()# 动态添加属性 s.name = Tom print(s.name) print(s.__dict__)# 定义一个函数作为实例方法 def set_age(self, age):self.age = age# 动态添加方法 s.set_…

Nginx基础入门

一、Nginx的优势 nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个SMTP&#xff08;邮局&#xff09;服务器。 Nginx的web优势&#xff1a;IO多路复用&#xff0c;时分多路复用&#xff0c;频分多路复用 高并发&#xff0c;IO多路复用&#xff0c;epoll&#xf…

【MySQL】学习连接查询和案例演示

&#x1f308;个人主页: Aileen_0v0 &#x1f525;热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​&#x1f4ab;个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-KOxr1rwR9cQTlydJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…

OD(8)之Mermaid流程图(flowcharts)使用详解

OD(8)之Mermaid流程图(flowcharts)使用详解 Author: Once Day Date: 2024年2月20日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Linux实践记录_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool‍…

聊一聊bpmn-js中的依赖注入框架didi

最近在用bpmn-js来进行flowable流程图的开发工作,不可避免地希望对其运行机制做一个大致的了解,在使用bpmn-js的过程中,bpmn-js基于diagram-js实现的插件式开发方式引起了我的兴趣。于是通过查阅源码希望对齐进一步了解发现:diagram-js是基于一个叫didi的实现的依赖注入功能…

C#通过泛型方法的重载分别调用主窗体和提示窗体

目录 一、涉及到的知识点 1.泛型方法的重载 2.使用泛型更好地实现通用化 二、示例&#xff1a;泛型方法及其重载 1.源码 2. 生成效果 实际开发项目时&#xff0c;有时会因为调用窗体或提示窗体过多&#xff0c;而难于管理&#xff0c;这时&#xff0c;可以通过泛型方法的…

【力扣hot100】刷题笔记Day8

前言 到了大章节【链表】了&#xff0c;争取两三天给它搞定&#xff01;&#xff01; 160. 相交链表 - 力扣&#xff08;LeetCode&#xff09;】 双指针 参考题解&#xff0c;相比于求长度右对齐再一起出发的方法简洁多了 class Solution:def getIntersectionNode(self, head…

基于FPGA的二维DCT变换和逆变换verilog实现,包含testbench

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 数据导入到matlab显示图像 2.算法运行软件版本 vivado2019.2 matlab2022a 3.部分核心程序 timescale 1ns / 1ps // // Company: // Engineer:…

win32 汇编读文件

做了2个小程序&#xff0c;没有读成功&#xff1b;文件打开了&#xff1b; .386.model flat, stdcalloption casemap :noneinclude windows.inc include user32.inc includelib user32.lib include kernel32.inc includelib kernel32.lib include Comdlg32.inc includelib …

2024-02-21 学习笔记(DETR)

自动多模态检测验证效果不佳&#xff08;过检太多&#xff09;后&#xff0c;节后开始尝试DETR路线。 基本梳理了下DETR发展和验证的脉络&#xff0c;先进行相应指定场景的效果验证。 关于DETR系列的介绍&#xff0c;B站上比较多&#xff0c;迪哥的都讲的比较细。 推荐大佬的…

如何在java中使用 Excel 动态函数生成依赖列表

前言 在Excel 中&#xff0c;依赖列表或级联下拉列表表示两个或多个列表&#xff0c;其中一个列表的项根据另一个列表而变化。依赖列表通常用于Excel的业务报告&#xff0c;例如学术记分卡中的【班级-学生】列表、区域销售报告中的【区域-国家/地区】列表、人口仪表板中的【年…

[计网底层小探索]:实现并部署多线程并发Tcp服务器框架(基于生产者消费者模型的线程池结构)

文章目录 一.网络层与传输层协议sockaddr结构体继承体系(Linux体系)贯穿计算机系统的网络通信架构图示: 二.实现并部署多线程并发Tcp服务器框架线程池模块序列化反序列化工具模块通信信道建立模块服务器主体模块任务回调模块(根据具体应用场景可重构)Tips:DebugC代码过程中遇到…

el-table同时固定左列和右列时,出现错误情况

最近遇到一个问题,就是需求是要求表格同时固定序号列和操作列,我们用的是饿了么组件库的el-table,如下图,出现了错误情况: 解决方法就是使用doLayout方法: 如果使用了keep-alive,可以在activated里执行doLayout方法: activated() {this.$nextTick(() => {this.$ref…

【Crypto | CTF】BUUCTF RSA2

天命&#xff1a;密码学越来越难了&#xff0c;看别人笔记都不知道写啥 天命&#xff1a;莫慌&#xff0c;虽然我不会推演法&#xff0c;但我可以用归纳法 虽然我不知道解题的推演&#xff0c;但我可以背公式啊哈哈哈 虽然我不会这题&#xff0c;但是我也能做出来 公式我不知…

机器学习基本概念(李宏毅课程)

目录 一、概念:1、机器学习概念:2、深度学习概念&#xff1a; 二、深度学习中f(.)的输入和输出&#xff1a;1、输入&#xff1a;2、输出&#xff1a; 三、三种机器学习任务&#xff1a;1、Regression回归任务介绍&#xff1a;2、Classification分类任务介绍&#xff1a;3、Stru…