Dubbo
Dubbo 解决了各服务间通信问题,是分布式服务的解决方案之一。从单一应用架构到流动计算架构的演 变,分布式服务是重中之重。随着服务被拆分越来越细,服务间的信息交互是一大痛点。 Dubbo 通过 注册中心解决多服务间通讯的障碍,进行 Dubbo 测试的关键是:创建 Dubbo 的客户端(消费者),使 该客户端与服务端(生产者)正常通信。客户端通过断言函数执行结果,完成 Dubbo 服务测试。
节点角色说明
调用关系说明
服务容器负责启动,加载,运行服务提供者。
服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者在启动时,向注册中心订阅自己所需的服务。
注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消 费者。
服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败, 再选另一台调用。
服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中 心。
把上述关系简化,其中服务提供者是 QA 需要测试的对象。QA 需要搭符合注册中心的服务消费者,利 用服务消费者对服务提供者进行测试:
问题关键在于如何搭建服务消费者,不同注册中心提供不同的搭建方案,比如:
Nacos 注册中心
Zookeeper 注册中心
Multicast 注册中心
Redis 注册中心
Simple 注册中心
有些公司内部会开发自己的注册中心,各位自行查找参考手册,下面以 Zookeeper 为例,简述配置过 程,详细内容可参考 Zookeeper 官网, Zookeeper 通过配置文件配置注册中心的信息,比如:
# The number of milliseconds of each ticktickTime=2000# The number of ticks that the initial # synchronization phase can takeinitLimit=10# The number of ticks that can pass between # sending a request and getting an acknowledgementsyncLimit=5# the directory where the snapshot is stored.# do not use /tmp for storage, /tmp here is just # example sakes.dataDir=/tmp/zookeeper# the port at which the clients will connectclientPort=2181
复制代码
通过终端启动 Zookeeper 注册中心服务,下面是在 2181 端口启动单节点注册中心服务的提示信息:
sudo ./zkServer.sh status/usr/bin/javaZooKeeper JMX enabled by defaultUsing config: /usr/local/zookeeper/apache-zookeeper-3.6.2-bin/bin/../conf/zoo.cfgClient port found: 2181. Client address: localhost. Client SSL: false.Mode: standalone
复制代码
服务消费者可以通过 Spring Boot 项目进行搭建,编写项目的 application.yaml 文件配置 Zookeeper 注 册中心服务地址即可完成订阅。以下是服务消费者样例, 通过 demoService.sayHello("mercyblitz") 调用服务提供者的函数,函数的返回结果即是调用结果:
@EnableAutoConfigurationpublic class DubboAutoConfigurationConsumerBootstrap { private final Logger logger = LoggerFactory.getLogger(getClass()); @DubboReference(version = "1.0.0", url = "dubbo://127.0.0.1:12345") private DemoService demoService; public static void main(String[] args) { SpringApplication.run(DubboAutoConfigurationConsumerBootstrap.class).close(); } @Bean public ApplicationRunner runner() { return args -> { logger.info(demoService.sayHello("mercyblitz")); }; }}
复制代码
可以看出,上述 demoService.sayHello("mercyblitz") 的调用过程与一般接口测试无区别, QA 利用服务消费者访问服务提供者,配合 Junit 对执行结果进行断言即可。
搜索微信公众号:TestingStudio 霍格沃兹的干货都很硬核
评论