关闭

dubbo学习七--参数回调,本地存根,延迟暴露,并发控制

1842人阅读 评论(0) 收藏 举报
分类:

参数回调

参数回调方式与调用本地callback或Listener相同,只需要在Spring的配置文件中声明哪个参数是callback类型即可,dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。


(1)共享服务接口

服务接口示例:

CallbackService.java

package com.callback;

 

public interface CallbackService {

    void addListener(String key, CallbackListener listener);

}


CallbackListener.java

package com.callback;

 

public interface CallbackListener {

    void changed(String msg);

}


(2)服务提供者


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" />

Or:

<dubbo:service interface="com.foo.BarService" stub="com.foo.BarServiceStub" />


api.jar:

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" />

Or:

<dubbo:service interface="com.foo.BarService" mock="com.foo.BarServiceMock" />

api.jar:

com.foo.BarService

com.foo.BarServiceMock // 在API旁边放一个Mock实现,它实现BarService接口,并有一个无参构造函数

package com.foo

public class BarServiceMock implements BarService {

 

    public String sayHello(String name) {

        // 你可以伪造容错数据,此方法只在出现RpcException时被执行

        return "容错数据";

    }

}

如果服务的消费方经常需要try-catch捕获异常,如:

Offer offer = null;

try {

    offer = offerService.findOffer(offerId);

} catch (RpcException e) {

   logger.error(e);

}

请考虑改为Mock实现,并在Mock中return null。

如果只是想简单的忽略异常,在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" />

限制com.foo.BarService的sayHello方法,服务器端并发执行(或占用线程池线程数)不能超过10个:

<dubbo:service interface="com.foo.BarService">

    <dubbo:method name="sayHello" executes="10" />

</dubbo:service>

限制com.foo.BarService的每个方法,每客户端并发执行(或占用连接的请求数)不能超过10个:

<dubbo:service interface="com.foo.BarService" actives="10" />

Or:

<dubbo:reference interface="com.foo.BarService" actives="10" />

限制com.foo.BarService的sayHello方法,每客户端并发执行(或占用连接的请求数)不能超过10个:

<dubbo:service interface="com.foo.BarService">

    <dubbo:method name="sayHello" actives="10" />

</dubbo:service>

Or:

<dubbo:reference interface="com.foo.BarService">

    <dubbo:method name="sayHello" actives="10" />

</dubbo:service>

如果<dubbo:service>和<dubbo:reference>都配了actives,<dubbo:reference>优先




1
0
查看评论

dubbo源码分析-回调的实现

这里dubbo的官方文档有一个回调的
  • u2244118984
  • u2244118984
  • 2014-11-06 15:55
  • 2743

Dubbo参数回调

dubbo参数回调,参数回调方式与调用本地的callback或listener相同,只需要在spring的配置文件中声明哪个参数时callback类型即可,dubbo将基于长连接生成反向代理,这样就可以从服务器端调用客户端逻辑。 消费者提供者:package com.yncp.dubbo.enti...
  • u010317829
  • u010317829
  • 2016-08-08 14:57
  • 997

dubbo异步调用三种方式

异步通讯对于服务端响应时间较长的方法是必须的,能够有效地利用客户端的资源,在dubbo中,消费端通过 async="true"标识。     具体有三种方式: 1、NIO future主动获取结果,返回结果放在RpcContext中 ...
  • treeclimber
  • treeclimber
  • 2017-12-25 09:31
  • 232

使用dubbo的一些积累

问题: 1、项目名称最好不要有provider consumer之类的信息,一个项目可以是服务提供者也可以同时是消费者 name application string 必填   服务治理 当...
  • waterCabin
  • waterCabin
  • 2015-11-13 16:17
  • 6001

Dubbo基本原理机制

分布式服务框架: –高性能和透明化的RPC远程服务调用方案 –SOA服务治理方案 -Apache MINA 框架基于Reactor模型通信框架,基于tcp长连接 Dubbo缺省协议采用单一长连接和NIO异步通讯,适合于小数据量大并发的服务调用,以及服务消费者机器数远大于服务提供者机器数的...
  • paul_wei2008
  • paul_wei2008
  • 2014-02-17 21:37
  • 36832

dubbo示例(下)

http://alibaba.github.io/dubbo-doc-static/Examples-zh.htm 本地调用 (+) (#) 本地调用,使用了Injvm协议,是一个伪协议,它不开启端口,不发起远程调用,只在JVM内直接关联,但执行Dubbo的Filter链。 ...
  • bluetjs
  • bluetjs
  • 2016-10-29 18:33
  • 538

Dubbo事件通知

原文地址:http://dubbo.io/User+Guide-zh.htm#UserGuide-zh-事件通知 事件通知 在调用之前,调用之后,出现异常时,会触发oninvoke, onreturn, onthrow三个事件,可以配置当事件发生时,通知哪个类的哪个方法。 ...
  • tanga842428
  • tanga842428
  • 2016-09-25 11:50
  • 1264

Dubbo Stub 操作实例

提供者实现: 接口:  IStubTestService    对应的stub实现:   IStubTestServiceStub 服务类:  StubTestServiceImpl package com.jgq.dub...
  • jurken
  • jurken
  • 2015-12-25 09:58
  • 2066

Dubbo之旅--结果缓存

在上篇文章中我们队Dubbo的扩展进行了一些基本了解.这些扩展能够很好的帮助我们在实际的项目中发挥作用,接下来对于dubbo的一些高级特征,针对特殊情况而进行的处理进行进一步的介绍,这里我们要说的是结果缓存.         ...
  • jnqqls
  • jnqqls
  • 2015-06-29 22:44
  • 9608

dubbo学习六--泛化,回声测试,上下文信息,隐式传参,异步调用,本地调用

泛化引用   GenericService barService = (GenericService) applicationContext.getBean("barService"); Object result = barService...
  • CHS007chs
  • CHS007chs
  • 2017-01-03 11:18
  • 2589
    个人资料
    • 访问:577804次
    • 积分:9748
    • 等级:
    • 排名:第2161名
    • 原创:225篇
    • 转载:908篇
    • 译文:17篇
    • 评论:33条
    最新评论