Dubbo
Dubbo是一款高性能Java RPC框架。采用全Spring配置方式,透明化接入应用。Spring只需加载Dubbo配置即可。(也可以通过api方式进行调用)。(服务接口单独打jar,供服务提供方和服务消费方共享)
三大核心能力
- 面向接口的远程调用
- 智能容错和负载均衡
- 服务自动注册和发现
Dubbo结构
- Provider,暴露服务的服务提供方。
- Consumer,调用远程服务的服务消费方。
- Registry,服务注册与发现的注册中心。(仅负责地址注册与查找,不转发请求,压力小)
- Montior,统计服务的调用次数和调用时间的监控中心。
- Container,服务运行容器。
- 服务容器负责启动、加载、运行服务提供者
- 服务提供者在启动时,向注册中心注册自己提供的服务
- 服务消费者在启动时,向注册中心订阅自己所需的服务
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送消息给消费者
- 服务消费者,从提供者地址列表中,基于负载均衡算法,选一台提供者进行调用,如果调用是失败,再选一台
- 服务提供者和消费者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
- 注册中心,服务提供者,服务消费者三者之间均为长连接,监控中心除外
- 注册中心通过长连接感知服务提供者的存在,服务提供者宕机,注册中心将立即推送事件通知消费者
- 注册中心和监控中心全部宕机,不影响已运行的提供者和消费者,消费者在本地缓存了提供者列表
- 注册中心和监控中心都是可选的,服务消费者可以直连服务提供者
特性
- 面向接口代理的高性能RPC调用(服务以接口为粒度,为开发者屏蔽远程调用底层细节)
- 服务自动注册与发现(支持多种注册中心服务,服务实例上下线感知)
- 智能负载均衡(内置多种负载均衡策略,可感知节点状况)
- 可视化的服务治理与运维(提供丰富服务治理、运维工具)
服务提供方
服务提供方通过配置声明、暴露服务。
需要的属性有
- 服务注册中心 <dubbo:registry address="">(将服务地址暴露到服务注册中心)
- 提供方应用信息 <dubbo:application name="">(用于计算依赖关系)
- 配置暴露到协议以及端口 <dubbo:protocol name="" port="">
- 声明要暴露的服务接口 <dubbo:service interface="" ref="">
服务消费方
通过spring配置引用远程服务
- 服务注册中心 <dubbo:registry address="">(发现服务注册地址)
- 消费方应用信息 <dubbo:application name="">(用于计算依赖关系)
- 生成远程服务代理,可以和本地bean一样去使用 <dubbo:reference id="" interface="">
配置覆盖
以timeout(超时)为例(建议由服务提供方配置超时)
- 方法级优先,接口级次之,全局配置再次之。
- 如果级别一样,则消费方优先,提供方次之。
动态配置中心
- 外部化配置。启动配置的集中式存储 (简单理解为dubbo.properties的外部化存储)。
- 服务治理。服务治理规则的存储与通知。
<dubbo:config-center address="zookeeper://127.0.0.1:2181"/>
外部配置拥有最高优先级,会覆盖本地配置
zookeeper,默认所有的配置都在 /dubbo/config 节点下
/dubbo/config/dubbo 全局配置
/dubbo/config/application 应用配置
启动时检查
通过配置check="true",不可用时会抛出异常,阻止spring初始化完成
集群容错
当集群调用失败时,dubbo提供了多种容错方案,缺省为重试
- Failover Cluster 失败自动切换,重试其他服务器(重试会带来更长延迟),可设置重试次数(不包含第一次),通常用于读操作
- Failfast Cluster 快速失败,只发器一次调用,失败立即报错。通常用于非幂等性的写操作,比如新增
- Failsafe Cluster 失败安全,出现异常时,直接忽略。通常用于学入审计日志等操作
- Failback Cluster 失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作
- Forking Cluster 并行调用多个服务器,只要一个成功即返回。会消费更多服务资源。可通过fork来设置最大并行数
- Broadcast Cluster 广播调用所有提供者,任意一台报错则报错。通常用于通知所有提供者更新缓存或日志等本地信息
负载均衡
缺省为随机调用
- Random LoadBalance 随机,可按照权重设置随机概率
- RoundRobin LoadBalance 轮询,按公约后等权重设置轮询比
- LeastActive LoadBalance 最少活跃调用数,相同活跃数随机,使慢的提供者收到更少的请求
- ConsistentHash LoadBalance 一致性hash,相同参数的请求总是发到同一提供者。当某一台提供者挂时,原本发往该提供者的请求,基于虚拟节点,平摊到其他提供者。
服务降级
为什么进行服务降级?
在微服务架构中,服务调用可能会遇到以下两种情况:
- 多个服务之间调用由于服务未启动或网络延时、不通,导致远程调用失败
- 服务请求量过大,需要停止部分服务以保证核心业务的正常运行
当重试多次后,服务功能还是异常,就直接进行降级
dubbo提供了mock配置,可以很好的实现dubbo服务降级
1、在远程调用异常时,服务端直接返回一个固定字符串
<dubbo:reference id="xxxService" interface="com.x..service.xxxxService" check="false" mock="return 123456..." />
使用此种方式配置,可以避免由于服务调用不了而出现异常
2、可以在dubbo-admin中进行配置
3、自定义mock业务处理类,需实现RPC接口,xxxServiceMock,如果调用失败会调用自定义的mock实现
具体实施
- 页面拒绝服务(页面提示由于服务器繁忙,暂停服务,然后跳转到一个静态页面)
- 服务接口拒绝服务
- 延迟处理(将数据记录到队列或日志,服务恢复后执行)
- 触发原因不太一样,服务熔断一般是某个服务(下游服务)故障引起,而服务降级一般是从整体负荷考虑;
- 管理目标的层次不太一样,熔断其实是一个框架级的处理,每个微服务都需要(无层级之分),而降级一般需要对业务有层级之分(比如降级一般是从最外围服务开始)
服务熔断,当服务不可用达到一定阀值,就会进行熔断,直接返回某个内容
服务降级,当请求过多,将一些边缘服务进行降级,直接返回内容
服务限流
为了防止某个消费者的QPS或者所有消费者的QPS总和突然飘升而导致重要服务时效,系统对访问流量进行了控制,这种对集群的保护措施称为服务限流。
限流方式可以分为两大类:
- 直接限流:通过对连接数量直接进行限制来达到限流目的
- 间接限流:通过对一些非连接数量设置来达到限流目的
直接限流
1、executes直接限流(服务提供者)【方法并行数】
可以设置接口级别或方法级别,限制其并发执行数
<dubbo:service interface="com.foo.BarService" executes="10" />
2、accptes限流(服务提供者)【协议连接数】
用于指定协议的连接数量进行限制
3、actives限流(提供者和消费者都可以进行设定)【长链接,短链接数】
<dubbo:service interface="com.foo.BarService" actives="10" />
- 长连接:表示当前长连接最多可以处理的请求个数。与长连接的数量没有关系
- 短连接:表示当前服务可以同时处理的短连接数量
4、connections(限流提供者和消费者都可以进行设定)【长链接,短链接数】
间接限流
1、延迟连接(消费端设置,只有真正调用提供者使,才建立连接)
2、粘性连接
3、负载均衡配置(处理快的电脑接受更多的请求)
服务链路跟踪
分布式系统由大量的服务组成,服务之间调用关系,随着系统的增长,不清晰,所以需要服务链路图
查看每个接口每天被调用的次数,了解系统压力后再进行扩容和优化
https://www.cnblogs.com/wx170119/p/10232141.html
线程模型
I/O线程,配置在netty连接点的用于处理网络数据的线程。dubbo默认采用的是长连接的方式,即一个consumer和一个provider之间只会建立一条链接。I/O线程的工作就是编码和解码
如果事件处理的逻辑能快速完成,则直接在I/O线程上处理会更快,因为减少了线程池的调度
但如果处理慢,就派发到线程池。
http://dubbo.apache.org/zh-cn/docs/user/demos/thread-model.html
直连提供者
在开发及测试环境下,经常需要绕过注册中心来连接指定的服务提供方(点对点连接)
多协议
dubbo配置允许多协议,在不同服务上支持不同协议或者同以服务上支持多种协议。比如:大数据用短链接协议,小数据大并发用长连接协议。
多注册中心
Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务
服务分组
当一个接口有多种实现时,可以用group区分
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用
主要性能
消费者异步调用,提供者异步执行,从而快速响应
事件通知,在调用接口前,后,异常时进行通知
并发控制,服务器端接口下的每个方法并发执行不能超过10个线程
可以