dubbo的本地存根的原理是:远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,那么就在服务消费者这一端提供了一个Stub类,然后当消费者调用provider方提供的dubbo服务时,客户端生成 Proxy 实例,这个Proxy实例就是我们正常调用dubbo远程服务要生成的代理实例,然后消费者这方会把 Proxy 通过构造函数传给 消费者方的Stub ,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy。会通过代理类去完成这个调用,这样在Stub类中,就可以做一些额外的事,来对服务的调用过程进行优化或者容错的处理。附图:

实现步骤:

 1. 定义一个服务接口和服务实现类

public interface UserInterface {

       public User getUserById(Integer id) ;

}
public class UserService implements UserInterface {

    public User getUserById(Integer id) {
User user = new User() ;
user.setId(id);
user.setName("hu");
return user;
} }

2. 服务分布配置

<dubbo:service  interface="org.huxin.dubbo.test.user.service.UserInterface" ref="userService" protocol="dubbo"    retries="0"/>

    <bean id="userService" class="org.huxin.dubbo.test.user.service.impl.UserService" />

3.服务消费者的Stub类

public class UserServiceStub implements UserInterface {

    //必须定义这个接口,以便接收dubbo在调用远程服务生成的服务代理类
private UserInterface userLocalService ; //这个构造函数必须要提供,dubbo框架会在消费者这一方调用这个方法
public UserServiceStub(UserInterface userLocalService ) {
this.userLocalService = userLocalService ;
} public User getUserById(Integer id) {

        User user = null ;
        try {
          if (id == 1) {
            user = this.userLocalService.getUserById(id) ;
          }else {
            user = new User();
            user.setName("系统用户");
          }
        }catch(Exception e) {
          user = new User();
          user.setName("异常用户");
        }

return user ;

    }
}

4. 服务消费方的配置

 <dubbo:reference id="userService" interface="org.huxin.dubbo.test.user.service.UserInterface"
stub="org.huxin.dubbo.test.UserServiceStub" protocol="dubbo"/>

5.测试代码

@Test
public void testGetUserById(){
Integer id = 2 ;
UserInterface userService = context.getBean(UserInterface.class) ;
User user = userService.getUserById( id) ;
System.out.println(user.getName()); }

  

总结:上述代码当调用服务出错时,消费方会返回“异常用户”,起到了容错的作用。

dubbo的本地存根(Stub)的更多相关文章

  1. dubbo之本地存根

    本地存根 远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 ...

  2. dubbo的本地存根

    在消费者创建存根类 修改消费者XML 也可以修改消费者注解

  3. Dubbo本地存根

    在远程调用服务提供者的实现之前,如果需要做一些参数验证.缓存.判断.小功能等等,满足要求再调用服务提供者的远程服务,则我们可以通过编写一个本地存根来实现这种功能. (1).在公共项目中或服务消费者项目 ...

  4. Dubbo本地存根是什么,Dubbo本地伪装又是什么?

    真正的大师永远怀着一颗学徒的心 哈喽!大家好,我是小奇,一位程序员界的学徒 小奇打算以轻松幽默的对话方式来分享一些技术,如果你觉得通过小奇的文章学到了东西,那就给小奇一个赞吧 前言 书接上回,昨天打了 ...

  5. dubbo之本地伪装

    本地伪装 本地伪装 1 通常用于服务降级,比如某验权服务,当服务提供方全部挂掉后,客户端不抛出异常,而是通过 Mock 数据返回授权失败. 在 spring 配置文件中按以下方式配置: <dub ...

  6. dubbo之本地调用

    本地调用 本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链. 配置 定义 injvm 协议 <du ...

  7. dubbo解决本地开发直连

    问题: 在如今的分布式项目开发中,zookeeper + dubbo是最常见的,通常的使用是用zookeeper做注册中心,dubbo做rpc,然后服务部署就可以实现相互之间的远程通信.所以开发项目时 ...

  8. Dubbo学习笔记-RPC扩展和本地Mock

    1.Dubbo介绍 Dubbo,一个是一款高性能Java RPC框架.私以为有中文官方文档,就不再重复介绍了 2.RPC扩展-本地存根stub RPC扩展功能:提前效验参数,缓存调用结果,日志记录等等 ...

  9. dubbo的常用配置(基于注解)

    之前记录了基于springboot的dubbo入门案例,今天在此基础上记录dubbo官网介绍的常用属性配置,dubbo读取我们配置的属性时是有优先级的,优先级如下图: 如图所示,优先级的属性依次为虚拟 ...

随机推荐

  1. MyBatis-Plugins 的创建流程与执行顺序

    一.插件的解析,所有插件都会被添加到 InterceptorChain 类中,用于后续处理 org.apache.ibatis.builder.xml.XMLConfigBuilder private ...

  2. C#设计模式(11)——装饰者模式

    1.装饰者模式介绍 装饰者顾名思义就是对一个类添加一些额外的装饰(功能).我们想给一个对象添加一些额外的功能又不改变对象内方法的签名怎么做呢?最常用的方法就是继承了,子类继承父类,然后重写父类的方法. ...

  3. ipython介绍及使用

    1. IPython介绍 ipython是一个python的交互式shell,比默认的python shell好用得多,支持变量自动补全,自动缩进,支持bash shell命令,内置了许多很有用的功能 ...

  4. CNPM

    cnpm 代替 npm npm install -g cnpm --registry=https://registry.npm.taobao.org Reference 淘宝 NPM 镜像

  5. OPCServer:使用Matrikon OPC Server Simulation

    实验用模拟OPCServer 旧版(50M):Matrikon OPC Server Simulation(v1.5.0.0),百度网盘,密码: mcur 新版(157M):Matrikon OPC ...

  6. jQuery使用(五):DOM操作之插入和删除元素

    插入: insertBofore() before() insertAfter() after() appendTo() append() prependTo() prepen() 删除: remov ...

  7. MyEclipse做的项目改成eclipse能用的

    转至:https://blog.csdn.net/cymlancy/article/details/67634531 首先导入一个从Myeclipse导出的项目 Myeclipse项目和Eclipse ...

  8. python学习路线--从入门到入土

    入门技术博客 进阶自己挑选 入门基础 Python入门相对容易又可以干很多事(网站,运维,数据,爬虫等),是一门方便的工具语言.2016年TIOBE排名显示Python已经名列第四,成为脚本语言之首. ...

  9. Set实现数组去重

    ES6 提供了新的数据结构 Set 它类似于数组,但是成员的值都是唯一的,没有重复的值 (set本身是一个构造函数,用来生成 Set 数据结构)   使用Set实现数组去重要简单很多.   第一种数组 ...

  10. CSS魔法(五)项目实战

    三大标签--title.description.keyword   淘宝网 <title>淘宝网 - 淘!我喜欢</title> <meta name="spm ...