1.Dubbo介绍

Dubbo,一个是一款高性能Java RPC框架.私以为有中文官方文档,就不再重复介绍了

2.RPC扩展-本地存根stub

RPC扩展功能:提前效验参数,缓存调用结果,日志记录等等,可以使用AOP织入这些扩展功能,但Dubbo提供了更灵活简单的实现-本地存根stub。

3.本地Mock-本地伪装mock

RPC在服务异常时,请求返回mock的(假)数据,而不是简单的抛出异常,达到服务降级和本地mock的效果.只有在服务抛出异常时才会调用。

4.调用流程

  1. 服务消费者发起调用
  2. 如果服务消费者端存在本地存根 Stub 的话,会先执行本地存根
  3. 本地存根 Stub 持有远程服务的 Proxy 对象,Stub 在执行的时候,会先执行自己的逻辑 (before),然后通过 Proxy 发起远程调用,最后在返回过程之前也会执行自己的逻辑 (after-returning)
  4. 如果远程服务的 Proxy 对象在执行过程中抛出了 exception,会执行服务消费端的本地伪装 Mock 的逻辑 (after-throwing),返回容错数据,从而达到服务降级的目的

5.本地存根实例

定义一个demo接口

public interface DemoService {
String sayHello(String name);
}

根据约定大于配置原则,实现一个demo的stub实例

// 类名约定为 继承接口+Stub
public class DemoServiceStub implements DemoService {
private static Logger logger = LoggerFactory.getLogger(DemoServiceStub.class); private final DemoService demoService; // 本地存根的实现需要提供一个拷贝构造方法,方便框架将远程调用的 Proxy 对象注入进来
public DemoServiceStub(DemoService demoService) {
this.demoService = demoService;
} // 本地存根需要提供服务接口中所有方法的实现。在本例中,需要实现 sayHello 方法
@Override
public String sayHello(String name) {
// 进行预处理部分
logger.info("before 执行远程服务, 入参: " + name);
try {
// 执行原函数功能,重要!!!
String result = demoService.sayHello(name);
// 执行函数后续部分,这里也可以完成缓存的操作
logger.info("after 执行远程服务, 出参: " + result);
return result;
} catch (Exception e) {
// 异常处理部分
logger.warn("执行失败! ", e);
return null;
}
}
}

在prvider.xml中将服务暴露出去

# resources\spring\mock-consumer.xml
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="mock-demo-consumer"/>
<dubbo:registry address="zookeeper://101.201.232.80:2181"/>
<dubbo:metadata-report address="zookeeper://101.201.232.80:2181" /> <!-- 用dubbo协议在本地20880端口通讯 -->
<dubbo:protocol name="dubbo" port="20880"/> <!-- 和本地bean一样实现服务 -->
<bean id="demoService" class="mock.impl.DemoServiceImpl"/> <!-- 暴露接口类名遵循约定 -->
<dubbo:reference id="demoService" check="false" interface="mock.api.DemoService" stub="true"/>
<!-- 类名不遵循约定,则指定全类名 -->
<!-- <dubbo:reference id="demoService" check="false" interface="mock.api.DemoService" stub="mock.api.DemoServiceStub"/> --> </beans>

6.本地伪装实例

dubbo默认为1000ms会抛超时异常,我们就让线程sleep 5000ms来人为触发

改造demo实现类如下,取消try则返回 hello + name,否则触发mock,返回 mock + name

public class DemoServiceImpl implements DemoService {

    @Override
public String sayHello(String name) {
try {
// 默认为1s无响应则抛超时异常,此处睡眠5s,使其抛出异常
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return "hello " + name;
}
}

根据约定大于配置原则,实现一个demo的mock实例

// 类名:demo接口+Mock
public class DemoServiceMock implements DemoService {
// 原服务抛出异常,则执行对应函数
@Override
public String sayHello(String name) {
return "mock " + name;
}
}

消费者xml需要稍微改造

# resources\spring\mock-consumer.xml
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd"> <!-- 消费方应用名,用于计算依赖关系,不是匹配条件,不要与提供方一样 -->
<dubbo:application name="mock-demo-consumer"/> <!--使用multicast广播注册中心暴露发现服务地址 30s耗时-->
<dubbo:registry timeout="30000" address="zookeeper://127.0.0.1:2181"/> <!-- 生成远程服务代理,可以和本地bean一样使用demoService 注意mock=true-->
<dubbo:reference id="demoService" check="false" interface="mock.api.DemoService"
mock="true"/> </beans>

7.参考

  1. 本地存根Stub:https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-stub
  2. 本地伪装Mock:https://github.com/apache/dubbo-samples/tree/master/java/dubbo-samples-mock
  3. beiwei30:http://dubbo.apache.org/zh-cn/blog/dubbo-stub-mock.html

Dubbo学习笔记-RPC扩展和本地Mock的更多相关文章

  1. Dubbo学习笔记6:Dubbo增强SPI与SPI中扩展点自动包装的实现原理

    在Dubbo整体架构分析中介绍了Dubbo中除了Service和Config层为API外,其他各层均为SPI,为SPI意味着下面各层都是组件化可以被替换的,也就是扩展性比较强,这也是Dubbo比较好的 ...

  2. swift学习笔记4——扩展、协议

    之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...

  3. Dubbo学习笔记0:RPC框架Dubbo介绍

    整体来说,一个公司业务系统的演进流程基本都是从单体应用到多应用.在单体应用时,不同业务模块相互调用直接在本地JVM进程内就可以完成,而变为多个应用时,相互之间进行通信就不能简单的进行本地调用了,因为不 ...

  4. Dubbo 学习笔记

    分布式基础理论 1. 什么是分布式系统? 分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个系统 2. 应用架构演变 单一应用架构 当网站流量很小时,只需一个应用,将所有功能都部署在一起 ...

  5. 阿里巴巴分布式服务框架dubbo学习笔记

    Dubbo是什么? Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案.简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的 ...

  6. Spring Cloud失散多年的哥哥Dubbo学习笔记

    Spring Cloud失散多年的哥哥Dubbo 随着互联网项目用户量的急剧增长,访问并发良突然暴增,将一个应用使用多个独立的工程共同实现的系统架构,称为SOA系统架构,各个工程可以允许在不同的机器上 ...

  7. Dubbo学习笔记(二) Dubbo的基本配置

    Check启动检查 根据之前的学习,我们简单理解的Dubbo远程调用的基本流程,服务提供者注册到注册中心,然后服务消费者通过监听注册中心达到远程调用的目的,那么如果注册中心中没有消费者对应的接口会怎么 ...

  8. Dubbo学习笔记10:Dubbo服务消费方启动流程源码分析

    同理我们看下服务消费端启动流程时序图: 在<Dubbo整体架构分析>一文中,我们提到服务消费方需要使用ReferenceConfig API来消费服务,具体是调用代码(1)get()方法来 ...

  9. Dubbo学习笔记9:Dubbo服务提供方启动流程源码分析

    首先我们通过一个时序图,直观看下Dubbo服务提供方启动的流程: 在<Dubbo整体框架分析>一文中我们提到,服务提供方需要使用ServiceConfig API发布服务,具体是调用代码( ...

随机推荐

  1. Spring Cloud系列-Zuul网关集成JWT身份验证

    前言 这两三年项目中一直在使用比较流行的spring cloud框架,也算有一定积累,打算有时间就整理一些干货与大家分享. 本次分享zuul网关集成jwt身份验证 业务背景 项目开发少不了身份认证,j ...

  2. 启动项目报错:org.apache.catalina.LifecycleException: Failed to start component

    原因 环境异常重启,项目java进程未关闭,原项目的端口依旧在占用. 一般为8080端口被占用 解决方法 以下两种方法都可以解决,原理相同(结束异常进程) 1. 简单粗暴: 打开任务管理器找到java ...

  3. shell脚本编程基础--文本比较

    1.概述 允许测试Linux文件系统上文件的目录和状态. 2.详解 2.1 检查目录 -d测试会检查指定的目录是否存在于系统中.当我们打算将文件写入目录或是准备切换到该目录时,先进行测试是比较好的做法 ...

  4. C#中的Stopwatch类简单使用

    Stopwatch实例可以度量一个间隔的运行时间, 或度量多个间隔内所用时间的总和. 命名空间System.Diagnostics. 简单使用 using System; using System.D ...

  5. 基于VMware Workstation下Windows server的搭建

    网络安全学习内容 一.VMware安装Windows系统   1.1安装配置虚拟机 需要提前准备的东西: 配置网络实验室的IP: 为了满足实验中一些需要用到网络的需求,学校为我们提供了每个人学号密码的 ...

  6. 放大镜效果 --- enlarge.js

    html页面: 注释:遮罩层的大小取决于   ===>layerwidth/layerheight = largewidth/largeheight  enlarge.js页面 /*   jqu ...

  7. Java修炼——面向对象的三大特征_多态_多态的三个必要条件

    多态指的是同一个方法调用,由于对象不同可能会有不同的行为,现实生活中,同一个方法,具体实现会完全不同. 多态的要点: 1.多态是方法的多态,不是属性的多态(多态与属性无关) 2.多态的存在有三个必要条 ...

  8. win7系统的用户去掉用户账户控制 提升管理员

    可以在组策略中进行设置 —— “以管理员身份运行”方式打开命令提示符(CMD)后键入 gpedit.msc 打开组策略后作如下更改:<br/>在“计算机配置”-“Windows 配置”-“ ...

  9. LightOJ1284 Lights inside 3D Grid (概率DP)

    You are given a 3D grid, which has dimensions X, Y and Z. Each of the X x Y x Z cells contains a lig ...

  10. BZOJ 1051: [HAOI2006]受欢迎的牛(SCC)

    1051: [HAOI2006]受欢迎的牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 8172  Solved: 4470[Submit][Sta ...