Dubbo
2022/3/19 6:29:44
本文主要是介绍Dubbo,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Dubbo
目录- Dubbo
- 一、Dubbo概述
- 1. 架构分类
- 2. Dubbo简介
- 3. RPC概述
- 二、Dubbo使用方式
- 1. Provider和Consumer执行流程
- 三、Dubbo服务管理中心
- 1. 服务管理中心概述
- 2. 服务管理中心使用方式
- 四、Dubbo统计中心
- 1. 统计中心概述
- 2. 统计中心使用方式
- 五、Dubbo配置
- 1. 启动检查机制
- 2. 超时机制
- 3. 重试机制
- 4. 多版本
- 5. 本地存根
- 6. 负载均衡
- 7. 高可用
- 8. 服务降级
- 六、Dubbo案例
- 1. 项目模块化
- 2. 项目启动方式
- 一、Dubbo概述
一、Dubbo概述
1. 架构分类
-
单一应用架构:将所有项目模块部署到一台Web服务器中,减少了部署节点和成本
缺点:项目模块耦合严重,不易开发和维护
性能由ORM框架决定
-
垂直应用架构:大模块按照MVC分层模式,进行拆分成多个互不相关的小模块,并且每个小模块都有独立的服务器
缺点:Service层中所有服务模块在一台服务器上,服务模块无法单独使用;业务模块过多时一台服务器响应前端较慢
性能由Web层框架(Spring MVC)决定
-
分布式服务架构:将Service层的多个服务模块拆分部署到服务中心上多个独立的应用服务器上;前端的请求发来时进行服务远程调用
缺点:需要增加服务器成本,同时服务器资源需要优化调配(减少资源浪费)
性能由RPC(Remote Procedure Call)框架决定
-
流动计算架构:增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率
性能由提高机器利用率的资源调度和治理中心SOA(Service Oriented Architecture)决定
2. Dubbo简介
- Dubbo是分布式服务框架,致力于提高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案
- Dubbo底层通信框架使用Netty(基于TCP协议的Socket)
- 节点角色
- Provider:服务的提供方
- Consumer
- Registry:注册中心用于服务注册和发现,一般使用ZooKeeper作为Dubbo注册中心
- Monitor:监控中心(服务管理中心和统计中心)
- Container:服务运行的容器
3. RPC概述
-
RPC是一种进程间的通信方式
-
RPC基本的通信原理是将对象序列化/反序列化处理通过Socket在客户端和服务端之间进行通信
RPC核心模块实现:Socket、序列化,另外对象需要通过动态代理生成的代理对象
二、Dubbo使用方式
1. Provider和Consumer执行流程
-
在Provider中通过Spring配置文件实现了将指定的Service接口实现类放入到ZooKeeper中
-
Consumer中的Controller中通过
@Reference
在ZooKeeper中找到要注入的接口代理对象,注入到Controller中用于调用对应的方法
三、Dubbo服务管理中心
1. 服务管理中心概述
- 服务管理中心是Dubbo提供的一个Web项目
- 作用:用于监控服务的状态:注册情况、是否正常运行或掉线
2. 服务管理中心使用方式
- 修改配置文件中ZooKeeper IP地址,打jar包运行,访问localhost下配置中的端口号即可
- 启动Provider后可在管理中心直接查看到,启动Consumer后需要发送请求Consumer处理后才可在管理中心查看到
四、Dubbo统计中心
1. 统计中心概述
- 记录服务被调用多少次等其他功能
2. 统计中心使用方式
- 统计数据不是实时的,需要等待一段时间再进行查看
五、Dubbo配置
1. 启动检查机制
-
实现方式:在Consumer的Spring配置文件中可以配置启动检查ZooKeeper上的服务是否可用
配置后默认开启日志,同时需要配置log4j
2. 超时机制
-
为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间
-
实现方式:在Provider/Consumer的Spring配置文件中配置指定的超时时间(单位ms),客户端超过设定时间后报timeout
在Provider配置后,Consumer不配置则会使用Provider的配置值
3. 重试机制
-
实现方式:在Provider/Consumer的Spring配置文件中可以指定方法的重试次数
幂等方法适合重试,非幂等方法不适合重试
4. 多版本
-
一个接口,在Provider上有多个(版本的)实现类,在Consumer上可以使用指定版本的方式引入
-
实现方式:在Provider上Spring配置文件中
<dubbo:service>
配置服务方法接口、对应的实现类、定义的版本号;在Consumer上Spring配置文件中<dubbo:reference>
配置指定接口、id、指定使用的版本号若指定接口的实现类只有一个,可以直接在Controller中的成员变量上使用
@Reference
,若使用配置文件引入实现类的代理对象,则使用@Autowired
防止冲突Consumer上版本号使用
*
代表使用一个Provider上定义的随机版本
5. 本地存根
- 在Consumer上直接实现业务功能,不用再远程调用Provider
- 使用场景:例如简单的参数验证
- 实现方式:在Consumer上创建接口实现类,其中定义一个该接口类型的成员变量和对应的构造方法,在该类的业务方法中调用这个成员变量
6. 负载均衡
-
Dubbo采用的负载均衡策略
- 权重
- 轮询+权重
- 最短延迟
- 一致性hash
-
实现方式:
-
准备:更改端口号分别启动多个Provider,一个或多个Consumer
-
在Consumer上Spring配置文件中
<dubbo:reference>
配置loadbalance字段值也可以不配置loadbalance字段值,在Dubbo服务管理中心的服务治理下配置权重值
-
7. 高可用
- 注册中心全部宕掉后,服务提供者和服务消费者仍能通过本地缓存通讯
- 实现方式:默认被动实现
8. 服务降级
-
根据实际的情况和流量,对一些服务有策略地停止或换种简单的方式处理,从而释放服务器的资源来保证核心业务的正常运行,
是防止分布式服务发生雪崩效应
雪崩效应:当一个请求发生超时,一直等待着服务响应,那么在高并发情况下,很多请求都是因为这样一直等着响应,直到服务资源耗尽产生宕机,而宕机之后会导致分布式其他服务调用该宕机的服务也会出现资源耗尽宕机,这样将导致整个分布式服务都瘫痪
-
实现方式:在Dubbo服务管理中心配置对应服务的屏蔽和容错
两种方式都是最终消费方会向前端请求返回null值,屏蔽是调用服务方法后直接返回,容错是调用服务方法失败后返回null值
六、Dubbo案例
1. 项目模块化
-
实体类、Dao层、Service层、Web层分别作为单独的项目,最终聚合在一起
-
parent项目和child项目依赖关系
-
实体类:
- entity项目(实体类):继承parent项目,不依赖其他项目
-
Dao层:
- dao项目(接口+映射配置文件):继承parent项目,依赖entity项目
-
Service层:
-
interface项目(接口):继承parent项目,依赖dao和entity项目
-
service项目(实现类):继承parent项目,依赖dao和interface项目
需要注入Dao层接口代理对象+实现Service层接口
需要将通过实现类生成的Bean存入容器中,并在ZooKeeper注册中心上注册
-
-
Web层:
-
web项目:继承parent项目,依赖entity和interface项目
在ZooKeeper注册中心上进行服务发现并需要注入Service层接口对应的代理对象并+使用实体类成员变量与请求内容做映射
-
-
2. 项目启动方式
-
准备阶段:在maven中install完成安装parent项目(注释Tomcat插件中的executions标签:package完成后不自动运行)
修改dao项目文件后需要重新install完成dao项目
-
启动生产者:package完成service项目(package前需要先启用ZooKeeper注册中心)
service项目pom中配置了Tomcat在package后启动
-
启动消费者:package完成web项目
web项目pom中配置了Tomcat在package后启动
这篇关于Dubbo的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-04-26敏捷开发:想要快速交付就必须舍弃产品质量?
- 2024-04-26静态代码分析的这些好处,我竟然都不知道?
- 2024-04-26你在测试金字塔的哪一层?(下)
- 2024-04-26快刀斩乱麻,DevOps让代码评审也自动起来
- 2024-04-262024年最好用的10款ER图神器!
- 2024-04-2203-为啥大模型LLM还没能完全替代你?
- 2024-04-2101-大语言模型发展
- 2024-04-17基于SpringWeb MultipartFile文件上传、下载功能
- 2024-04-14个人开发者,Spring Boot 项目如何部署
- 2024-04-14RAG应用开发实战02-相似性检索的关键 - Embedding