dubbo使用
2021-11-21 19:32:11 1 举报
AI智能生成
登录查看完整内容
负载均衡,容错,降级,本地存根,本地伪装
作者其他创作
大纲/内容
公共接口
依赖
配置
公共接口实现
provider
访问provider
consumer
基本使用
服务提供方@DubboService和消费端@DubboReference都可以配置LB策略,@DubboService可以配置权重
默认是这种
访问次数多时,分布均匀
可以按照权重设置随机概率,有利于调整提供者权重
权重随机Random
递增取余,存在慢的实例累积请求的问题
轮询RoundRobin
最少活跃调用数,相同的随机
可以使慢的提供者收到更少的请求
活跃数由各个消费端分别维护,为每个服务实例维护一个调用计数,每次调用前后加一减一
最少活跃数LeastActive
因为是哈希函数,相同的关键字总能映射到同一个服务实例
处于同一范围内的虚拟节点总是映射到同一实例,某一台实例宕机,它对应的虚拟节点分配给另一个实例,服务上线下线不会引起映射的剧烈变动
一致性哈希ConsistentHash
负载均衡
通过timeout设置超时,可以在消费端和服务端配置
默认0,不超时
服务超时
retries设置重试次数,默认2次,可以在消费端和服务端配置
服务重试
定义:对于整个集群来说,服务调用报错后采取的策略
故障切换,出现异常时重试其他服务实例
默认就是这种
通常用于幂等性操作,比如读操作
Failover Cluster
失败立即报错,只发起一次调用,不重试
用于非幂等性的写操作,比如新增记录
消费端和服务端都可以配:cluster = ClusterRules.FAIL_FAST
Failfast Cluster
出现异常时,直接忽略,只记录日志并返回空结果
Failsafe Cluster
Failback Cluster
同时给多个实例发送请求,只要有一个返回结果就算成功,并发数默认为2
用于实时性较高的读操作
并发数配置:parameters = {\"forks\
Forking Cluster
广播所有服务实例,逐个调用,只要一个失败则消费端报错
消费端配置才会生效
默认不管是否有实例报错,都会全部调用完,可以设置失败比例达到多少时,不再继续调用:parameters = {\"broadcast.fail.percent\
Broadcast Cluster
集群容错模式
定义:对于单个服务提供者来说,服务调用报错后采取的策略
集群容错是整个集群范围内的容错,服务降级是单个服务提供者报错后采取的后备策略
可以通过服务降级屏蔽某个临时出错的非关键服务
mock = \
fail:return 消费端会发起远程调用,调用失败再服务降级,用于容忍非关键服务不稳定时对调用方的影响
force:return 消费端不会发起远程调用,直接服务降级,用于屏蔽非关键服务不可用时对调用方的影响
服务降级
通常情况下,消费端只要通过接口发起远程调用,本地存根可以让消费端进行服务调用的前后做拦截增强处理,比如校验参数,记录日志等
消费端实现服务调用接口,并提供一个传入真正发起远程调用的代理对象的构造函数,在远程代理对象上配置@DubboReference(stub=\"服务接口消费端实现类全限定名\")
在服务调用接口同一包下定义xxxSub实现类,并在远程代理对象配置@DubboReference(stub=\"true\")
用法
本地存根
作用跟服务降级相似,不过mock改成了服务调用接口的具体实现类,可以mock复杂逻辑
用法跟本地存根类似,stub改成了mock,xxxSub改成了xxxMock
本地伪装
服务调用时传入一个回调对象,使服务端可以执行回调客户端,执行客户端逻辑
服务调用的接口方法参数中,添加回调对象,为接口方法指定第几个参数是回调参数,index从0开始:@DubboService(methods = @Method(name = \"sayHello\
消费端调用时除了回调对象,应再指定每次调用 的key,以便服务端回调时区分是哪一次调用的
参数回调
服务提供方的异步执行和调用方的异步发送是相互独立的,可以任意组合两种配置
作用:从dubbo线程切换到业务线程,避免了dubbo线程池过度占用,影响其他服务,提升系统响应
定义返回CompletableFuture的服务接口,通过CompletableFuture.supplyAsync实现了服务提供方的异步执行
使用RpcContext实现异步执行,直接返回null,在业务线程中asyncContext.write写入返回结果
异步执行用法
如果服务提供方提供了CompletableFuture的服务接口,future.whenComplete
如果只有同步的服务定义,可以用RpcContext或java8 default 接口方法
配置@Method(name = \"sayHelloWithAsyncContext\
RpcContext.asyncCall
java8 default 接口方法实现服务调用的异步 //重载一个带有CompletableFuture签名的方法 //必须重载不然会报Service not found
https://gitee.com/chenwenjie007/java-learn/blob/master/dubbo/dubbo-consumer/src/test/java/com/example/dubboconsumer/DubboConsumerApplicationTests.java#L52
示例代码
异步调用
异步执行、异步发送
是标准的java rest api,开源实现有Oracle的Jersey,RedHat的RestEasy,Apache的CXF和Wink,以及restlet等等
JAX-RS
dubbo rest是基于JAX-RS 2.0版本的
引入依赖
添加配置
定义接口和实现
解决RESTEASY003130: Class is not a root resource的问题:标注了@DubboService注解的类的接口要加@Path
dubbo rest服务端除了通过rest访问外,仍可以用dubbo客户端的方式调用,这时JAX-RS注解(@Path,@Post等)应该放在接口上,dubbo客户端通过@DubboReference引入远程代理对象访问,屏蔽了rest调用细节
dubbo客户端访问dubbo服务端
这种方式仍可以客户端自定义模拟的带JAX-RS注解的接口去调用,没有注册中心,需在@DubboReference中指定url,多个地址用逗号分割
dubbo客户端访问非dubbo服务端
rest
dubbo使用
0 条评论
回复 删除
下一页