dubbo学习七--参数回调,本地存根,延迟暴露,并发控制
2017-01-03 13:43
260 查看
参数回调
参数回调方式与调用本地callback或Listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。
(1)共享服务接口
服务接口示例:
CallbackService.java
CallbackListener.java
(2)服务提供者
CallbackServiceImpl.java
本地存根
远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有时候想在客户端也执行部分逻辑,此进需要在API中带上Stub,客户端生成Proxy,把Proxy通过构造函数传递给Stub,然后把Stub暴露给用户,Stub可以决定要不要去调用 Proxy。
![](http://img.blog.csdn.net/20170103132633519?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvQ0hTMDA3Y2hz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Or:
api.jar:
本地伪装
Mock通常用于服务降级,比如某难权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。
Mock是Stub的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要出现RpcException时进行容错,而在出现业务异常时不需要容错,如果用Stub,可能就需要捕获并依赖RpcException类。而用Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行。
Or:
api.jar:
如果服务的消费方经常需要try-catch捕获异常,如:
请考虑改为Mock实现,并在Mock中return null。
如果只是想简单的忽略异常,在2.0.11以上版本可用:
延迟暴露
如果你的服务warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。
<dubbo:servicedelay="5000"/>
并发控制
限制com.foo.BarService的每个方法,服务器端并发执行(或占用线程池线程数)不能超过10个:
限制com.foo.BarService的sayHello方法,服务器端并发执行(或占用线程池线程数)不能超过10个:
限制com.foo.BarService的每个方法,每客户端并发执行(或占用连接的请求数)不能超过10个:
Or:
限制com.foo.BarService的sayHello方法,每客户端并发执行(或占用连接的请求数)不能超过10个:
Or:
如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>优先
参数回调方式与调用本地callback或Listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。
(1)共享服务接口
服务接口示例:
CallbackService.java
package com.callback; public interface CallbackService { void addListener(String key, CallbackListener listener); } |
package com.callback; public interface CallbackListener { void changed(String msg); } |
CallbackServiceImpl.java
package com.callback.impl; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; import com.callback.CallbackListener; import com.callback.CallbackService; public class CallbackServiceImpl implements CallbackService { private final Map<String, CallbackListener> listeners = new ConcurrentHashMap<String, CallbackListener>(); public CallbackServiceImpl() { Thread t = new Thread(new Runnable() { public void run() { while(true) { try { for(Map.Entry<String, CallbackListener> entry : listeners.entrySet()){ try { entry.getValue().changed(getChanged(entry.getKey())); } catch (Throwable t) { listeners.remove(entry.getKey()); } } Thread.sleep(5000); // 定时触发变更通知 } catch (Throwable t) { // 防御容错 t.printStackTrace(); } } } }); t.setDaemon(true); t.start(); } public void addListener(String key, CallbackListener listener) { listeners.put(key, listener); listener.changed(getChanged(key)); // 发送变更通知 } private String getChanged(String key) { return "Changed: " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()); } } |
远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有时候想在客户端也执行部分逻辑,此进需要在API中带上Stub,客户端生成Proxy,把Proxy通过构造函数传递给Stub,然后把Stub暴露给用户,Stub可以决定要不要去调用 Proxy。
<dubbo:service interface="com.foo.BarService" stub="true" /> |
<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" /> |
com.foo.BarService com.foo.BarServiceStub // 在API旁边放一个Stub实现,它实现BarService接口,并有一个传入远程BarService实例的构造函数 |
package com.foo public class BarServiceStub implements BarService { private final BarService barService; // 构造函数传入真正的远程代理对象 public (BarService barService) { this.barService = barService; } public String sayHello(String name) { // 此代码在客户端执行 // 你可以在客户端做ThreadLocal本地缓存,或预先验证参数是否合法,等等 try { return barService.sayHello(name); } catch (Exception e) { // 你可以容错,可以做任何AOP拦截事项 return "容错数据"; } } } |
Mock通常用于服务降级,比如某难权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过Mock数据返回授权失败。
Mock是Stub的一个子集,便于服务提供方在客户端执行容错逻辑,因经常需要出现RpcException时进行容错,而在出现业务异常时不需要容错,如果用Stub,可能就需要捕获并依赖RpcException类。而用Mock就可以不依赖RpcException,因为它的约定就是只有出现RpcException时才执行。
<dubbo:service interface="com.foo.BarService" mock="true" /> |
<dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" /> |
com.foo.BarService com.foo.BarServiceMock // 在API旁边放一个Mock实现,它实现BarService接口,并有一个无参构造函数 |
package com.foo public class BarServiceMock implements BarService { public String sayHello(String name) { // 你可以伪造容错数据,此方法只在出现RpcException时被执行 return "容错数据"; } } |
Offer offer = null; try { offer = offerService.findOffer(offerId); } catch (RpcException e) { logger.error(e); } |
如果只是想简单的忽略异常,在2.0.11以上版本可用:
<dubbo:service interface="com.foo.BarService" mock="return null" /> |
如果你的服务warmup时间,比如初始化缓存,等待相关资源就位等,可以使用delay进行延迟暴露。
<dubbo:servicedelay="5000"/>
并发控制
限制com.foo.BarService的每个方法,服务器端并发执行(或占用线程池线程数)不能超过10个:
<dubbo:service interface="com.foo.BarService" executes="10" /> |
<dubbo:service interface="com.foo.BarService"> <dubbo:method name="sayHello" executes="10" /> </dubbo:service> |
<dubbo:service interface="com.foo.BarService" actives="10" /> |
<dubbo:reference interface="com.foo.BarService" actives="10" /> |
<dubbo:service interface="com.foo.BarService"> <dubbo:method name="sayHello" actives="10" /> </dubbo:service> |
<dubbo:reference interface="com.foo.BarService"> <dubbo:method name="sayHello" actives="10" /> </dubbo:service> |
相关文章推荐
- 14.dubbo本地存根、本地伪装、延迟暴露、并发控制、连接控制
- 淘宝SOA框架dubbo学习(4)--参数验证
- 淘宝SOA框架dubbo学习(2)--本地伪集群测试Demo
- dubbo的本地存根(Stub)
- Dubbo 源码学习(五)dubbo暴露服务的过程
- lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数
- jQuery:基础学习(5)工具,事件对象,延迟对象,回调,正则
- dubbo之本地存根
- dubbo源码学习(五)dubbo暴露服务的过程
- dubbo学习五--服务分组,多版本,参数验证,结果缓存
- dubbo 延迟暴露
- Dubbo -- 系统学习 笔记 -- 示例 -- 参数验证
- dubbo学习 (3) 启动时检查参数
- dubbo 使用 学习四(springmvc+spring+dubbo+zookeeper本地伪集群)
- 深入dubbo内核(3):本地服务暴露
- dubbo源码解析(六) dubbo服务发布过程及本地暴露
- Dubbo接口延迟暴露(等spring初始化)的配置方法
- dubbo学习六--泛化,回声测试,上下文信息,隐式传参,异步调用,本地调用
- Dubbo参数回调
- lua学习笔记 3 android调用Lua。Lua脚本使用LoadLib回调Java,并传多个参数