dubbo 微服务框架
dubbo 注解配置:
@Service //Service注解暴露服务
@Configuration // javaconfig形式配置公共模块
@DubboComponentScan // 指定dubbo扫描路径
@Reference //注解引用
启动时检查服务可用性:
<dubbo:reference check //设定特定服务启动检查
<dubbo:consumer check //设定所有服务启动检查
<dubbo:registry check //设定注册中心启动检查
集群容错:
<dubbo:service retries <dubbo:reference retries <dubbo:method retries
failover:失败自动切换,重试其它服务器
failfast:快速失败,只发起一次调用,失败立即报错,非幂等操作
failsafe:失败安全,忽略异常,
failback:失败自动恢复,后台记录失败请求,定时重发,
forking:同时调用多个服务器,只要一个返回成功即可,应用于实时性高的操作
broadcast:广播所有服务器,逐个调用,任意一台报错,则报错,服务更新提供者缓存应用
负载均衡:
服务端 服务端方法级 客户端 客户端方法级
random:按权重设置随机概率,碰撞概率
roundrobin:公约后的权重设置轮训概率,慢提供者积累请求问题。
leastactive:慢的提供者收到更少的请求
consistenthash:相同参数请求发送到同一提供者,
缺省只对第一个参数 Hash,如果要修改,请配置 <dubbo:parameter key="hash.arguments" value="0,1" />
缺省用 160 份虚拟节点,如果要修改,请配置 <dubbo:parameter key="hash.nodes" value="320" />
线程派发策略:
all:所有消息都派发到线程池
direct:所有消息不派发线程池,直接在io线程操作
message:只请求响应派发到线程池
execution:只请求消息派发线程池
connection:除连接断开消息,其它派发到线程池
线程池:
fixed:固定大小
cached:空闲一分钟删除,需要重建
limited:可伸缩,只增长不减少,应对大流量
直连:<dubbo:reference id="xxxService" interface="com.alibaba.xxx.XxxService" url="dubbo://localhost:20890" />
只订阅:
可以让服务提供者开发方,只订阅服务(开发的服务可能依赖其它服务),而不注册正在开发的服务(服务检测影响),通过直连测试正在开发的服务。
<dubbo:registry address="10.20.153.10:9090" register="false" />
只注册
如果有两个镜像环境,两个注册中心,有一个服务只在其中一个注册中心有部署,另一个注册中心还没来得及部署,而两个注册中心的其它应用都需要依赖此服务。这个时候,可以让服务提供者方只注册服务到另一注册中心,而不从另一注册中心订阅服务。
禁用订阅配置
<dubbo:registry id="hzRegistry" address="10.20.153.10:9090" />
<dubbo:registry id="qdRegistry" address="10.20.141.150:9090" subscribe="false" />
人工管理上下线:
<dubbo:registry address="10.20.141.150:9090" dynamic="false" />
多协议
Dubbo 允许配置多协议,在不同服务上支持不同协议或者同一服务上同时支持多种协议。
不同服务不同协议
不同服务在性能上适用不同协议进行传输,比如大数据用短连接协议,小数据大并发用长连接协议
多协议暴露服务
多注册中心注册
Dubbo 支持同一服务向多注册中心同时注册,或者不同服务分别注册到不同的注册中心上去,甚至可以同时引用注册在不同注册中心上的同名服务。另外,注册中心是支持自定义扩展的
多版本
当一个接口实现,出现不兼容升级时,可以用版本号过渡,版本号不同的服务相互间不引用。
可以按照以下的步骤进行版本迁移:
在低压力时间段,先升级一半提供者为新版本
再将所有消费者升级为新版本
然后将剩下的一半提供者升级为新版本
分组聚合
按组合并返回结果 1,比如菜单服务,接口一样,但有多种实现,用group区分,现在消费方需从每种group中调用一次返回结果,合并结果返回,这样就可以实现聚合菜单项。
结构缓存:
lru:缓存清理策略
threadlocal:线程缓存
jcache:桥接其它缓存实现
回声测试:
回声测试用于检测服务是否可用,回声测试按照正常请求流程执行,能够测试整个调用是否通畅,可用于监控。
所有服务自动实现 EchoService 接口,只需将任意服务引用强制转型为 EchoService,即可使用。
RpcContext:threadlocal的临时状态记录器。存储当前调用所需的环境信息。
隐式参数
可以通过 RpcContext 上的 setAttachment 和 getAttachment 在服务消费方和提供方之间进行参数的隐式传递
并发控制:限制方法的并发执行数 executes
连接控制:限制服务器端接受的连接 accepts 区别executes,一个连接可能很多种执行方法的方案
延迟连接用于减少长连接数。当有调用发起时,再创建长连接 lazy
<dubbo:protocol name="dubbo" lazy="true" />
注意:该配置只对使用长连接的 dubbo 协议生效
粘滞连接
粘滞连接用于有状态服务,尽可能让客户端总是向同一提供者发起调用,除非该提供者挂了,再连另一台。
粘滞连接将自动开启延迟连接,以减少长连接数。
<dubbo:protocol name="dubbo" sticky="true" />
服务降级:mock
mock=force:return+null 表示消费方对该服务的方法调用都直接返回 null 值,不发起远程调用。用来屏蔽不重要服务不可用时对调用方的影响。
mock=fail:return+null 表示消费方对该服务的方法调用在失败后,再返回 null 值,不抛异常。用来容忍不重要服务不稳定时对调用方的影响。
优雅停机:kill pid; JDK 的 ShutdownHook
服务提供方
停止时,先标记为不接收新请求,新请求过来时直接报错,让客户端重试其它机器。
然后,检测线程池中的线程是否正在运行,如果有,等待所有线程执行完成,除非超时,则强制关闭。
服务消费方
停止时,不再发起新的调用请求,所有新的调用在客户端即报错。
然后,检测有没有请求的响应还没有返回,等待响应返回,除非超时,则强制关闭。
缺省端口设置:
dubbo: 20880
rmi: 1099
http, hessian, webservice: 80
memcached: 11211
redis: 6379
服务容器:
dubbo服务容器是一个standlone启动程序,因为后台服务不需要web容器的功能,所以不需要tomcat等来启动。
简单的Main方法启动,加载spring容器,用于暴露服务。
服务容器的加载内容可以配置扩展:java 命令的 -D 参数或者 dubbo.properties 中。
spring容器:自动加载 META-INF/spring 目录下的所有 Spring 配置。
配置 spring 配置加载位置:
dubbo.spring.config=classpath*:META-INF/spring/*.xml
jetty容器:启动一个内嵌jetty,用于汇报状态
dubbo.jetty.port=8080:配置 jetty 启动端口
dubbo.jetty.directory=/foo/bar:配置可通过 jetty 直接访问的目录,用于存放静态文件
dubbo.jetty.page=log,status,system:配置显示的页面,缺省加载所有页面
容器启动
缺省只加载 spring:
java com.alibaba.dubbo.container.Main
通过 main 函数参数传入要加载的容器:
java com.alibaba.dubbo.container.Main spring jetty log4j
通过 JVM 启动参数传入要加载的容器:
java com.alibaba.dubbo.container.Main -Ddubbo.container=spring,jetty,log4j
通过 classpath 下的 dubbo.properties 配置传入要加载的容器
dubbo.container=spring,jetty,log4j
线程栈自动dump:
当业务线程池满时,我们需要知道线程都在等待哪些资源、条件、以及找到系统的瓶颈、异常点。dubbo通过jstack自动导出线程堆栈来保留现场。
默认策略:
导出路径,user.home标识的用户主目录
导出间隔,最短间隔允许每隔10分钟导出一次
reference:配置listener
com.alibaba.dubbo.rpc.InvokerListener
serialization:serialization string 可选 dubbo协议缺省为hessian2,rmi协议缺省为java,http协议缺省为json 性能调优 协议序列化方式,当协议支持多种序列化方式时使用,比如:dubbo协议的dubbo,hessian2,java,compactedjava,以及http协议的json等
缓存:
<dubbo:registry address="multicast://224.0.0.0:1234" file="cache/dubbo.cache"/>
这个文件会缓存注册中心的列表和服务提供者列表。有了这项配置后,当应用重启过程中,Dubbo 注册中心不可用时则应用会从这个缓存文件读取服务提供者列表的信息,进一步保证应用可靠性。
redis:注册中心
<dubbo:registry id="remoteregister" address="redis://127.0.0.1:6379"
dubbo协议:
缺省协议,使用基于 mina 1.1.7 和 hessian 3.2.1 的 tbremoting 交互。
连接个数:单连接
连接方式:长连接
传输协议:TCP
传输方式:NIO 异步传输
序列化:Hessian 二进制序列化
适用范围:传入传出参数数据包较小(建议小于100K),消费者比提供者个数多,单一消费者无法压满提供者,尽量不要用 dubbo 协议传输大文件或超大字符串。
适用场景:常规远程服务方法调用
referred:
https://github.com/windwant/dubbo-service-demo.git
https://github.com/windwant/spring-dubbo-service.git