Soul网关源码学习(3)- Dubbo代理的配置和测试

前言

在上一篇文章《Soul网关源码学习(2)- Http代理的配置和测试》中,我们学习了如何使用soul网关做Http代理,同时使用了Postman做了一些简单的批量测试。那么这一篇,我们开始学习如何使用soul去代理dubbo服务。

配置

网关服务配置

alibaba dubbo

首先查看一下soul网关服务(soul-bootstrap)的pom.xml文件,是否引入了下面的依赖,如果没有,则需要引入并且重新启动。

<!--soul alibaba dubbo 插件-->
<dependency>
    <groupId>org.dromara</groupId>
    <artifactId>soul-spring-boot-starter-plugin-alibaba-dubbo</artifactId>
     <version>${last.version}</version>
</dependency>
 <!--alibaba dubbo -->
 <!--dubbo版本换成和你需要被代理的dubbo服务一致的版本-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>dubbo</artifactId>
    <version>2.6.5</version>
</dependency>
<!-- 注册中心客户端-->
<!-- curator is zookeeper client-->
<!-- 注册中心的jar包换成你们使用的注册中心,如果你们使用的是nacos则引入nacos相应的jar包-->
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-client</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-framework</artifactId>
    <version>4.0.1</version>
</dependency>
<dependency>
    <groupId>org.apache.curator</groupId>
    <artifactId>curator-recipes</artifactId>
    <version>4.0.1</version>
</dependency>

apache dubbo

<!--soul apache dubbo 插件-->
 <dependency>
     <groupId>org.dromara</groupId>
     <artifactId>soul-spring-boot-starter-plugin-apache-dubbo</artifactId>
     <version>${last.version}</version>
 </dependency>
 <!--apache dubbo-->
 <!--dubbo版本换成和你需要被代理的dubbo服务一致的版本-->
 <dependency>
     <groupId>org.apache.dubbo</groupId>
     <artifactId>dubbo</artifactId>
     <version>2.7.5</version>
 </dependency>
<!-- 注册中心客户端-->
<!-- 注册中心的jar包换成你们使用的注册中心,这里使用的是nacaos,上面示例使用的是zookeeper-->
<dependency>
    <groupId>com.alibaba.nacos</groupId>
    <artifactId>nacos-client</artifactId>
    <version>1.1.4</version>
</dependency>

Dubbo服务配置

在被代理的dubbo服务中添加依赖

  • alibaba dubbo

    • spring boot
      <dependency>
          <groupId>org.dromara</groupId>
          <artifactId>soul-spring-boot-starter-client-alibaba-dubbo</artifactId>
          <version>${last.version}</version>
      </dependency>
      
    • spring
      <dependency>
          <groupId>org.dromara</groupId>
          <artifactId>soul-client-alibaba-dubbo</artifactId>
          <version>${last.version}</version>
      </dependency>
      
  • apache dubbo

    • spring boot
      <dependency>
          <groupId>org.dromara</groupId>
          <artifactId>soul-spring-boot-starter-client-apache-dubbo</artifactId>
          <version>${last.version}</version>
      </dependency>
      
    • spring
      <dependency>
          <groupId>org.dromara</groupId>
          <artifactId>soul-client-apache-dubbo</artifactId>
          <version>${last.version}</version>
      </dependency>
      

被代理dubbo服务添加配置

  • spring boot
    application.yaml文件配置:
    soul:
      dubbo:
        adminUrl: http://localhost:9095
        contextPath: /dubbo
        appName: dubbo
       # adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加 http://
       # contextPath: 为你的这个项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
       # appName:你的应用名称,不配置的话,会默认取 dubbo配置中application 中的名称
    
  • spring
    bean定义的xml文件中新增如下 :
    <bean id ="alibabaDubboServiceBeanPostProcessor" class ="org.dromara.soul.client.alibaba.dubbo.AlibabaDubboServiceBeanPostProcessor">
         <constructor-arg  ref="dubboConfig"/>
    </bean>
    
    <bean id="dubboConfig" class="org.dromara.soul.client.dubbo.common.config.DubboConfig">
         <property name="adminUrl" value="http://localhost:9095"/>
         <property name="contextPath" value="/你的contextPath"/>
         <property name="appName" value="你的名字"/>
    </bean>
    

接口注册到网关

在你的dubbo服务实现类方法上加上 @SoulDubboClient 注解,表示该接口方法注册到soul网关。然后启动被代理的服务,输出日志 dubbo client register success 则大功告成,你的dubbo接口已经发布到 soul网关。文章接下来会通过soul源码下的测试用例 soul-test-dubbo 进行演示。

dubbo代理测试

启动服务

和上一篇文章一样,我们还是使用soul源码下自带的测试用例进行测试。打开soul源码,找到子模块 soul-examples-dubbo,在该子模块下有两个测试服务,一个是基于 alibaba-dubbo,另外一个是基于 apache-dubbo。这里我使用apache-dubbo作为测试用例。
首先打开 soul-examples-apache-dubbo-service/pom.xml 文件,检查依赖和配置是否符合上一个条目中所说明的。如果确认无误后,先在你本地启动一个zookeeper实例,然后再启动dubbo服务。
在这里插入图片描述
接着,我们登录控制台,点击PluginList -> dubbo,我们可以查看所有注册到网关的dubbo服务接口。
在这里插入图片描述
打开dubbo插件

控制台 -> System Manager -> Plugin,确保你的dubbo插件是打开的,同时另外几个协议的插件是关闭的。
在这里插入图片描述

在进行测试之前,先来了解一下客户端应该如何通过soul访问dubbo服务。

  • 简单来说就是通过Http对外提供你的dubbo服务。
  • soul网关需要有一个路由前缀,这个路由前缀就是你接入项目进行配置 contextPath,这里是"/dubbo"
    soul:
      dubbo:
        contextPath: /dubbo
    
  • 参数传递:
    • 通过 http get 方法访问网关,例如:localhost:9195/dubbo/findById?id=2
    • 通过 http post 方式访问网关,通过body,json类型传递。
    • 默认是单个JavaBean参数
    • 多参数需要在soul网关服务的yaml配置文件中添加:
      soul:
        dubbo:
          parameter: multi
      

一个简单的测试

在了解了我们应该如何通过soul访问dubbo服务后,就可以开始测试了。我们先来小试牛刀,打开postman,使用 http get 方法访问dubbo服务。
在这里插入图片描述
通过上面的图片可以看到,我们成功通过 http get 方法访问了dubbo服务。

“批量+断言+多参数”测试

那接下我们加大点测试力度,使用postman批量测试+断言来测试dubbo的多参数接口。
首先我们先来检查一下soul网关的 yaml 配置文件是否添加了多参数配置。如果没有,需要添加上面提到的多参数配置,并且重新启动soul网关。

接下来看一下我们的 Test Case:

  • 多参数dubbo服务接口:
    @Override
    @SoulDubboClient(path = "/findByIdsAndName")
    public DubboTest findByIdsAndName(List<Integer> ids, String name) {
          
          
        DubboTest test = new DubboTest();
        test.setId(ids.toString());
        test.setName("hello world soul apache dubbo param findByIdsAndName :" + name);
        return test;
    }
    
  • postman Request
    url: localhost:9195/dubbo/findByIdsAndName
    post body:
    {
          
          "ids":{
          
          {
          
          ids}},"name":"{
          
          {name}}"}
    
    请求变量:
    var ids = data.ids;
    var name = data.name;
    
    批量变量值:
    [
        {
          
          "name":"ww","ids":"[11,232,443,5,45,6]"},
        {
          
          "name":"sdfsd","ids":"[1]"},
        {
          
          "name":"rr","ids":"[3,4,5,6,7]"}
    ]
    
    断言脚本:
    pm.test("Status code is 200", function () {
          
          
        //返回是否成功
        pm.response.to.have.status(200);
    });
    pm.test("Your test name", function () {
          
          
        var jsonData = pm.response.json();
        //返回包含参数name
        pm.expect(jsonData.data.name).to.include(pm.variables.get("name"));
        //返回的id和请求的ids相同
        var rspId = jsonData.data.id.split(" ").join("");
        var reqIds = pm.variables.get("ids").split(" ").join("");
        pm.expect(rspId).to.eql(reqIds);
    });
    
  • 启动postman runner 并发执行100个请求
    在这里插入图片描述
    测试结果:
    在这里插入图片描述
    从上面的图可以看到,测试全部通过,响应的延迟大概在3ms左右。

结语

本篇文章中,我们学习了如何使用soul来代理Dubbo服务,同时通过soul源码下的测试用例对Dubbo代理进行了一下简单的压测,后面会继续介绍如何使用soul代理sofa和springCloud。

猜你喜欢

转载自blog.csdn.net/u012180773/article/details/112726076