一、RPC原理介绍
RPC(Remote Procedure Call Protocol)- 远程过程调用协议,一个通俗的描述是:客户端在不知道调用细节的情况下,调用存在于远程计算机上的某个对象,就像调用本地应用程序中的对象一样。比较正式的描述是:一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
1、这个过程用一张图描述如上,调用方与服务方的处理步骤都是非常清晰的。 这个过程存在最大的问题是什么呢?
回答:调用方太麻烦了,每次都要关注很多底层细节
( 1 )入参到字节流的转化,即序列化应用层协议细节
( 2 ) socket 发送,即网络传输协议细节
( 3 ) socket 接受
( 4 )字节流到出参的转化,即反序列化应用层协议细节
2、能不能调用层不关注这个细节呢?能不能降低各类复杂性?
RPC 框架要向调用方屏蔽各种复杂性,要向服务提供方也屏蔽各类复杂性 :
( 1 )调用方感觉就像调用本地函数一样
( 2 )服务提供方感觉就像实现一个本地函数一样来实现服务
所以整个 RPC 框架又分为 client 部分与 server 部分,负责把整个非( 1 )( 2 )的各类复杂性屏蔽,这些复杂性就是 RPC 框架的职责
再细化一些, client 端又包含:序列化、反序列化、连接池管理、负载均衡、故障转移、队列管理,超时管理、异步管理等等等等职责。
server 端包含:服务端组件、服务端收发包队列、 io 线程、工作线程、序列化反序列化、上下文管理器、超时管理、异步回调等等等等职责
二、Dubbo架构介绍
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器
架构图:
节点角色说明
节点 角色说明
Provider 暴露服务的服务提供方
Consumer 调用远程服务的服务消费方
Registry 服务注册与发现的注册中心
Monitor 统计服务的调用次数和调用时间的监控中心
Container 服务运行容器
0、服务容器负责启动,加载,运行服务提供者。
1、服务提供者在启动时,向注册中心注册自己提供的服务。
2、服务消费者在启动时,向注册中心订阅自己所需的服务。
3、注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送 变更数据给消费者。
4、服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如 果调用失败,再选另一台调用
5、服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数 据到监控中心
三、Java Sampler
核心步骤:
public Arguments getDefaultParameters();设置可用参数及的默认值;
public void setupTest(JavaSamplerContext arg0):每个线程测试前执行一次,做一些初始化工作;
public SampleResult runTest(JavaSamplerContext arg0):开始测试,从arg0参数可以获得参数值,这是测试主体,runTest()方法返回一个SampleResult测试结果;
public void teardownTest(JavaSamplerContext arg0):测试结束时调用
四、Java-dubbo sampler开发步骤
1、测试dubbo协议,就是要模拟消费端
2、拿到服务端的interface、method
3、java sampler脚本
A、getDefaultParameters() 设置参数及默认值
B、setupTest() dubbo连接初始化
C、runTest() 发送请求,需要做Jmeter设置:起止时间、requestdata、responsedata,responsecode、responsemessage
D、调试
4、打jar包java sampler,放到apache-jmeter-3.1\lib\ext下面
5、开始创建脚本