dubbo的本地存根(Stub)

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) {
        if (id == 1) {
            return this.userLocalService.getUserById(id) ;
        }else {
            User 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());  

	}

  

原文地址:https://www.cnblogs.com/hzhuxin/p/8250602.html

时间: 2024-07-30 08:04:35

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

dubbo之本地存根

本地存根 远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub ,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy. 在 spring 配置文件中按以下方式配置: <dubbo:service interface="com.foo.

本地存根

远程服务后,客户端通常只剩下接口,而实现全在服务器端,但提供方有些时候想在客户端也执行部分逻辑,比如:做 ThreadLocal 缓存,提前验证参数,调用失败后伪造容错数据等等,此时就需要在 API 中带上 Stub,客户端生成 Proxy 实例,会把 Proxy 通过构造函数传给 Stub ,然后把 Stub 暴露给用户,Stub 可以决定要不要去调 Proxy.Stub 必须有可传入 Proxy 的构造函数. 本地存根执行方法 public class UserServiceStub imp

dubbo源码阅读-ProxyFactory(十一)之StubProxyFactoryWrapper本地存根

说明 Wrapper调用时机可以看:https://www.cnblogs.com/LQBlog/p/12470179.html#autoid-2-0-0 /** * StubProxyFactoryWrapper */ public class StubProxyFactoryWrapper implements ProxyFactory { private static final Logger LOGGER = LoggerFactory.getLogger(StubProxyFactor

dubbo之本地调用

本地调用 本地调用使用了 injvm 协议,是一个伪协议,它不开启端口,不发起远程调用,只在 JVM 内直接关联,但执行 Dubbo 的 Filter 链. 配置 定义 injvm 协议 <dubbo:protocol name="injvm" /> 设置默认协议 <dubbo:provider protocol="injvm" /> 设置服务协议 <dubbo:service protocol="injvm" /&

Dubbo 系列(07-5)集群容错 - Mock

Dubbo 系列(07-5)集群容错 - Mock [toc] Spring Cloud Alibaba 系列目录 - Dubbo 篇 1. 背景介绍 相关文档推荐: Dubbo 实战 - 服务降级 Dubbo 实战 - 本地伪装 Dubbo 实战 - 本地存根 Dubbo 的集群容错中默认会组装 MockClusterWrapper,它实现了 Dubbo 的服务降级和本地伪装. 1.1 服务降级 服务降级配置方式,更多参考官网 Dubbo 实战 - 服务降级 <dubbo:reference

RMI 系列(02)源码分析

目录 RMI 系列(02)源码分析 1. 架构 2. 服务注册 2.1 服务发布整体流程 2.2 服务暴露入口 exportObject 2.3 生成本地存根 2.4 服务监听 2.5 ObjectTable 注册与查找 2.6 服务绑定 2.7 总结 3. 服务发现 3.1 注册中心 Stub 3.2 普通服务 Stub RMI 系列(02)源码分析 1. 架构 RMI 中有三个重要的角色:注册中心(Registry).客户端(Client).服务端(Server). 图1 RMI 架构图 在

【免费下载】全套最新 023Dubbo 视频教程+教学资料+学习课件+源代码+软件开发工具

023Dubbo视频教程 网盘地址: 链接:https://pan.baidu.com/s/148Uj4l6zH828eVraLh9gsQ 提取码:dm3z 加公众号 获取更多新教程 教程目录大纲 ./023Dubbo ├── 课件.资料.zip └── 视频 ├── 01.Dubbo概念分布式系统定义.avi ├── 02.Dubbo概念应用的架构演变.avi ├── 03.Dubbo概念RPC简介.avi ├── 04.Dubbo概念简介.avi ├── 05.Dubbo概念设计架构.avi

Dubbo如何支持本地调用?InJvm方式解析

Dubbo是一个远程调用的框架,对于一个服务提供者,暴露了一个接口供外部消费者调用,那么对于提供者自己是否可以调用这个接口,需要什么特殊处理吗? 这篇文章就分享下Dubbo关于本地调用的实现机制,以及如何开启和关闭本地调用. injvm支持本地调用 使用 Dubbo 本地调用不需做特殊配置,按正常 Dubbo 服务暴露服务即可.任一服务在暴露远程服务的同时,也会同时以 injvm 的协议暴露本地服务.injvm 是一个伪协议,不会像其他协议那样对外开启端口,只用于本地调用的目的. InjvmPr

初识Dubbo 系列之5-Dubbo 成熟度

成熟度 功能成熟度 Feature特征 Maturity成熟度 Strength强度 Problem问题 Advise建议 User用户 并发控制 Tested 并发控制   试用   连接控制 Tested 连接数控制   试用   直连提供者 Tested 点对点直连服务提供方,用于測试   測试环境使用 Alibaba 分组聚合 Tested 分组聚合返回值,用于菜单聚合等服务 特殊场景使用 可用于生产环境   參数验证 Tested 參数验证.JSR303验证框架集成 对性能有影响 试用