一、Dubbo介绍
**节点角色**
Provider: 暴露服务的服务提供方
Consumer: 调用远程服务的服务消费方
Registry: 服务注册与发现的注册中心
Monitor: 统计服务的调用次数和调用时间的监控中心
调用流程
服务容器负责启动,加载,运行服务提供者
服务提供者在启动时,向注册中心注册自己提供的服务
服务消费者在启动时,向注册中心订阅自己所需的服务
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
二、dubbo接口怎么测
**1.使用工具-jmeter**
1)依赖jar包:放置位置 apache-jmeter-5.0\lib\ext
下载地址:https://github.com/thubbo/jmeter-plugins-for-apache-dubbo/releases/tag/2.7.8
2)解决响应数据中中文显示乱码问题
打开安装路径\bin\jmeter.properties文件,找到配置:
#The encoding to be used if none is provided (default ISO-8859-1)
#sampleresult.default.encoding=ISO-8859-1
把注释删掉,编码改成utf-8格式
The encoding to be used if none is provided (default utf-8) sampleresult.default.encoding=utf-8
3)重启Jmeter打开
- dubbo参数设置
先启动jmeter添加dubbo sample
**参数设置:**
1)填写zookeeper地址,填完zk地址之后,点击Get Provider List 按钮,会自动检索出全部的Interfaces;选择被测接口,会自动填充下面的Interface Settings
2)Consumer Settings:填写版本号和分组
3)Interface:即要测试的服务路径+接口名
4)Method:方法名
5)param:填写参数类型和对应的参数
各参数说明如下:
Protocol:注册协议,包括zookeeper、multicast、Redis、simple;
Address:注册地址,dubbo服务的IP+Port:
①、当使用zk,address填入zk地址,集群地址使用","分隔;
②、使用dubbo直连,address填写直连地址和服务端口;
Protocol:使用的dubbo协议,包括dubbo、rmi、hessian、webservice、memcached、redis,根据自己的协议类型选择对应的选项即可;
Timeout:请求超时时间,单位ms,根据dubbo具体配置填写;
Version:版本,dubbo不同版本之间差异较大,不同版本之间不能互相调用,这里指定dubbo版本,是为了方便识别和说明;
Retries:异常重试次数(类似这种分布式服务通信框架,大多都有重试机制,是为了保证事务成功率);
Cluster:集群类型,包括failover、failfast、failsafe、failback、failking;
Group:组类型,如果有的话,根据配置填写即可;
Connections:连接数,同上,根据配置填写;
Async:服务处理类型,包括sync(同步)、async(异步),根据配置填写;
Loadbalance:负载均衡策略,包括random(随机)、roundrobin(轮询)、leastactive(最少活跃数)、consistenthash(一致性哈希);
Interface:接口名(因为dubbo服务大多是开发根据规范自行命名的,因此这里需要填写完整的接口名+包名);
Method:当前接口下的方法名,按照开发提供的API文档填写即可;
Args:接口报文,根据API文档填写,如上图所示,添加输入行,输入对应的参数类型和值即可(参数类型和值如何定义填写,请参考上面的链接);
①、paramType:参数支持任何类型,包装类直接使用java.lang下的包装类,小类型使用:int、float、shot、double、long、byte、boolean、char,自定义类使用类完全名称;
②、paramValue:基础包装类和基础小类型直接使用值,例如:int为1,boolean为true等,自定义类与List或者Map等使用json格式数据;
为了在JMeter Dubbo调用时添加JWT认证信息,可以按照以下步骤进行操作:
1. 在JMeter中打开Dubbo Sampler,选择需要进行JWT认证的请求。
2. 在请求的参数列表中添加一个名为“token”的参数,将JWT token作为参数值。
3. 在Dubbo Sampler的“Advanced”选项卡中,找到“Dubbo Attachments”一栏,添加一个键为“jwt”的附件,将JWT token作为值。
4. 在Dubbo服务提供者端,添加一个拦截器,在Dubbo服务方法执行之前进行JWT认证,如果认证通过,则在Dubbo上下文中添加JWT认证信息。示例代码如下:
public class JwtAuthenticationFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String token = RpcContext.getContext().getAttachment("jwt");
if (token != null && JwtUtils.verifyToken(token)) {
// 认证通过,将认证信息添加到Dubbo上下文中
RpcContext.getContext().setAttachment("jwt", token);
return invoker.invoke(invocation);
} else {
// 认证失败,返回错误信息
return new RpcResult(new AuthenticationException("JWT authentication failed"));
}
}
}
5. 在Dubbo服务消费者端,添加一个拦截器,在Dubbo调用之前将JWT token添加到Dubbo上下文中。示例代码如下:
public class JwtAttachmentFilter implements Filter {
@Override
public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
String token = Thread.currentThread().getName();
if (token != null && !token.isEmpty()) {
RpcContext.getContext().setAttachment("jwt", token);
}
return invoker.invoke(invocation);
}
}
6. 运行JMeter测试计划,Dubbo调用时将自动添加JWT认证信息。