文章目录
Dubbo
什么Dubbo框架?
Apache Dubbo 是一个高可用的,基于Java的开源RPC框架。
Dubbo框架不仅仅是具备RPC访问功能,还包含服务治理功能(其他方式管理服务信息)。
发展史
Dubbo是最开始是阿里巴巴内部使用的RPC框架。
2011年对外提供。
2012年停止更新。
2017年开始继续更新。
2019年捐献给Apache,由Apache维护2.7以上版本
架构原理
虚线
虚线表示异步,实线表示同步。
异步不阻塞线程性能搞,同步阻塞线程必须等待响应结果才能继续执行,相对性能低
Provider
提供者。编写持久成,业务层和事务代码
Container
Spring容器,Dubbo完全基于Spring实现的
Registry
注册中心。放置所有Provider对外提供的信息。包含Provider的ip,访问端口,访问遵守的协议,对外提供的接口,接口中有那些方法等相关信息
Consumer
消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以包括页面等)。调用远程服务实现中的方法。
Monitor
监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发给Monitor,由Monitor进行统计
执行流程
- start: 启动Spring容器时会把Provider启动
- register: 把Provider相关信息注册到Registry里
- subscribe: Consumer从Registry中订阅Provider的信息
- notify: 通知给Consumer
- invoke: Consumer根据Registry通知的信息进行调用Provider中方法
- count: Consumer和Provider把调用次数信息异步发送给Monitor进行统计
Dubbo支持协议
-
Dubbo协议(官方推荐)
基于TCP创建的,可复用的长连接协议
优点:
采用NIO复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,性能较好(推荐使用) 协议的默认端口是:20880。(端口是服务端Provider占用的)
缺点:
大文件上传时,可能出现问题(不使用Dubbo实现文件传输)
-
RMI(Remote Method Invocation)协议
优点: JDK自带。
缺点: 偶尔连接失败。
-
Hessian协议
优点: 可与原生Hessian互操作,基于HTTP协议,有HTTP大多数特性
缺点: 需hessian.jar支持,http短连接的开销大,每次请求需要大量时间在握手和挥手上,不能复用
适用于并发高,传输数据量小的场景
Dubbo支持注册中心
-
Zookeeper(官方推荐)
优点: 支持分布式.很多周边产品.
缺点: 受限于Zookeeper软件的稳定性.Zookeeper专门分布式辅助软件,稳定较优
-
Nacos
缺点:重量级,需要独立安装
优点:阿里自身注册中心,无缝集成。除此还支持配置中心等
-
Multicast
优点: 去中心化,不需要单独安装软件,不需要注册,没有注册中心
缺点: 2.2.1 Provider、Consumer和Registry不能跨机房(路由)
-
Redis
优点: 支持集群,性能高
缺点: 要求服务器时间同步.否则可能出现集群失败问题
-
Simple
优点: 标准RPC服务.没有兼容问题
缺点: 不支持集群.
负载均衡
集群:一个内容,部署多次,形成的整体称为集群。集群中每个个体应该部署到不同的服务器上。
伪集群:集群中内容部署到同一台服务器上,通过不同端口区分不同个体。
负载均衡是在集群前提下,当访问整个集群时,集群中每个节点被访问次数或频率的规则。
Dubbo 内置了四个负载均衡策略。默认为Random
负载均衡策略的决定规则:
1、Provider方默认负载均衡策略是Random,随机策略。
2、Consumer方默认负载均衡策略不设定,使用Provider提供的负载均衡策略。
3、如果双方都设置了负载均衡策略,使用Consumer的负载均衡策略,因为局部优先,Provider是给所有的Consumer提供服务的,负载均衡策略也是给所有的Consumer提供的默认策略。Consumer的负载均衡策略只局限在当前消费端,是一个局部策略。
Random
随机。随机访问集群中节点。访问概率和权重有关。
RoundRobin(推荐)
轮询。访问频率和权重有关。
权重(weight):占有比例。集群中每个项目部署的服务器的性能可能是不同,性能好的服务器权重应该高一些。
LeastActive
活跃数相同的随机,不同的活跃数高的放前面。
ConsistentHash
一致性Hash。相同参数请求总是发到一个提供者。
负载均衡的配置
方式一:
@Service | @DubboService 注解中属性 loadbalance。代表为Provider集群定义负载均衡策略
默认是random
方式二:
@Reference | @DubboReference 注解中属性 loadbalance。代表为Consumer定义调用Provider负载均衡策略,默认无策略,采用Provider提供的负载均衡策略
方式三:
在配置文件中配置.
与注解配置区别:文件配置当前应用全局,注解是当前类对应Provider或Consumer配置
dubbo:
application:
name: dubbo-provider
registry:
address: zookeeper://192.168.32.128:2181
protocol:
port: 20884
provider:
# 配置当前应用中所有Provider的默认负载均衡策略,如果注解定义了其他负载均衡策略,局部优先
loadbalance: random
consumer:
# 配置当前应用中所有Consumer的默认负载均衡策略
loadbalance: random
常用注解
@EnableDubbo
使用Dubbo。启动类,必须要有@EnableDubbo注解,否则Dubbo不生效。
@DubboService
从2.7.7版本开始,Dubbo的**@Service注解过时,提供新注解@DubboService**
注解功能:在Spring容器启动的时候,创建bean对象。并拼接一个URL保存到指定的注册中心
Dubbo自定义了注解Service,用于服务注册过程,注意导包,不要和Spring的Service注解混淆功能和Dubbo的Service注解完全一致
DubboService属性:
loadbalance
负载均衡策略
当前服务采用的负载均衡算法, loadbalance。代表,为Provider集群定义负载均衡策略
示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)
group
分组
默认环境中,Dubbo的Provider是不分组的
示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)
可以指定服务分组。目的,多客户端并行生效;多服务端分组管理。,商业开发中,服务都需要分组。
当服务端将Provider分组后,消费端的Consumer必须要定位的分组,否则会抛出异常,IllegalStateException, 检查Provider状态发生异常。
version
版本
默认环境中,Dubbo的Provider是没有版本
示例:@DubboService(loadbalance = “roundrobin”, group = “firstGroup”, version = “1.0.1”)
可以设定版本,目的是多个版本并行提供服务,商业开发中,服务需要版本。代表服务的升级,迭代。
当服务端Provider定义版本后,消费端引用的consumer必须指定要定位的版本。否则抛出异常: IllegalStateException, 检查Provider状态发生异常。
@DubboReference
在2.7.7以前版本,使用**@Reference注解, 2.7.7使用@DubboReference**注解
注解功能:访问注册中心,获取URI统一资源路径,并创建代理对象。
DubboReference属性:
-
loadbalance
负载均衡策略当前服务采用的负载均衡算法,示例:@Reference(loadbalance = “roundrobin”)
loadbalance。代表,为集群定义负载均衡策略
-
group
分组
默认环境中,Dubbo的Provider是不分组的
示例:@DubboReference(group = “firstGroup”, version = “1.0.1”)
可以指定服务分组。目的,多客户端并行生效;多服务端分组管理。,商业开发中,服务都需要分组。
当服务端将Provider分组后,消费端的Consumer必须要定位的分组,否则会抛出异常,IllegalStateException, 检查Provider状态发生异常。
version
版本
默认环境中,Dubbo的Provider是没有版本
示例:@DubboReference(group = “userGroup”, version = “1.0”)
可以设定版本,目的是多个版本并行提供服务,商业开发中,服务需要版本。代表服务的升级,迭代。
当服务端Provider定义版本后,消费端引用的consumer必须指定要定位的版本。否则抛出异常: IllegalStateException, 检查Provider状态发生异常。
Dubbo文件配置
dubbo:
application:
name: first-dubbo-consumer
registry:
address: zookeeper://192.168.1.179:2181
timeout: 10000
provider:
loadbalance: random # 配置当前应用中所有的Provider的默认负载均衡策略。如果注解定义其他负载均衡策略,局部优先。
consumer:
loadbalance: roundrobin # 配置当前应用中所有的Consumer的默认负载均衡策略。
# 幂等性操作(多次访问对结果无影响),可以配置>0。在非幂等性操作(多次访问对,结果由影响,如增删改操作),配置为0。
# 设计服务的时候,一般,会读写分离。
retries: 2 # 重试次数,默认为2。Provider因网络问题,无响应,消费端自动重新请求。
dubbo:
registry:
address: zookeeper://192.168.1.179:2181
timeout: 10000 #连接多长时间超时
application:
name: first-dubbo-provider # 定义一个服务的名称。如果多个启动的服务进程命名一致,自动组成集群。
protocol:
name: dubbo # 协议,默认dubbo。 注意,两个配置的默认值是配套的。不要只为一个配置做新的赋值
port: 20881 # 端口,默认20880
provider:
# payload指请求容量和响应容量的限制,默认限制为8M,8388608字节
# 也就是,请求头+请求体容量必须小于8M。响应头+响应体容量必须小于8M。
# 只能在配置文件中进行配置,只要配置了,请求和响应的容量同步变更。
payload: 83886080