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. 在Mac OS环境下安装MySQL服务

    在Mac OS环境下安装MySQL服务 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 我之前介绍过window环境下安装mysql服务,以及在Linux环境下安装mysql服务,今 ...

  2. java io系列12之 BufferedInputStream(缓冲输入流)的认知、源码和示例

    本章内容包括3个部分:BufferedInputStream介绍,BufferedInputStream源码,以及BufferedInputStream使用示例. 转载请注明出处:http://www ...

  3. hostnamectl 修改 CentOS7 主机名

    hostnamectl 控制主机名 # 显示状态 hostnamectl Static hostname: centos Icon name: computer-vm Chassis: vm Mach ...

  4. HDU - 6357 Hills And Valleys(DP)

    http://acm.hdu.edu.cn/showproblem.php?pid=6357 题意 给一个数值范围为0-9的a数组,可以选择翻转一个区间,问非严格最长上升子序列,以及翻转的区间. 分析 ...

  5. 插入排序_JAVA

    public class Main { public static void main(String[] args) { int[] A = { 6, 4, 3, 5, 6, 2 }; for (in ...

  6. Hadoop生态组件的WebUI地址

    ================================Impala 相关================================ Impala的常用端口: jdbc/ODBC 端口: ...

  7. IIS7.5配置过程

    1.Windows功能,注意选择应用程序开发功能,否则不能使用经典模式. 2.Cmd运行(使用.netframework4.0)C:\Windows\Microsoft.NET\Framework\V ...

  8. Gossip

    http://www.cnblogs.com/xingzc/p/6165084.html 敬请期待...

  9. Frameset 框架

      <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="index.aspx.c ...

  10. Debian Security Advisory(Debian安全报告) DSA-4405-1 openjpeg2

    package :openjpeg2 相关CVE ID: CVE-2017-17480 CVE-2018-5785 CVE-2018-6616 CVE-2018-14423 CVE-2018-1808 ...