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

前言

在上一篇文章《Soul网关源码学习(1)- Soul的简单介绍和编译》中,我们简单的了解了Soul网关的一些特点,同时下载了Soul的源码并且进行了编译,最后启动了网关的服务端和控制台,那这一节开始我们就开始对Soul的使用进行介绍和测试。

配置

确保网关服务引入了Http的相关依赖

也就是上一篇文章中启动的Soul-bootstrap模块,如果没有添加,请添加下面的依赖并且重启网关服务。

<!--if you use http proxy start this-->
 <dependency>
     <groupId>org.dromara</groupId>
     <artifactId>soul-spring-boot-starter-plugin-divide</artifactId>
      <version>${last.version}</version>
 </dependency>

 <dependency>
     <groupId>org.dromara</groupId>
     <artifactId>soul-spring-boot-starter-plugin-httpclient</artifactId>
      <version>${last.version}</version>
 </dependency>

控制台中确保divide插件开启

在这里插入图片描述

被代理服务的配置-Spring系列

SpringMvc

  • pom.xml中引入依赖:
    <dependency>
        <groupId>org.dromara</groupId>
        <artifactId>soul-client-springmvc</artifactId>
        <version>${last.version}</version>
    </dependency>
    
  • bean定义的xml文件中新增如下:
    <bean id ="springMvcClientBeanPostProcessor" class ="org.dromara.soul.client.springmvc.init.SpringMvcClientBeanPostProcessor">
         <constructor-arg  ref="soulSpringMvcConfig"/>
    </bean>
    
    <bean id="soulSpringMvcConfig" class="org.dromara.soul.client.springmvc.config.SoulSpringMvcConfig">
         <property name="adminUrl" value="http://localhost:9095"/>
         <property name="port" value="你的端口"/>
         <property name="contextPath" value="/你的contextPath"/>
         <property name="appName" value="你的名字"/>
         <property name="full" value="false"/>
    </bean>
    

SpringBoot

  • pom.xml中引入依赖:
    <dependency>
        <groupId>org.dromara</groupId>
        <artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
        <version>${last.version}</version>
    </dependency>
    
  • 在yml中新增如下配置 :
    soul:
      http:
        adminUrl: http://localhost:9095
        port: 你本项目的启动端口
        contextPath: /http
        appName: http
        full: false  
    # adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加http://
    # port: 你本项目的启动端口
    # contextPath: 为你的这个mvc项目在soul网关的路由前缀,这个你应该懂意思把? 比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
    # appName:你的应用名称,不配置的话,会默认取 `spring.application.name` 的值
    # full: 设置true 代表代理你的整个服务,false表示代理你其中某几个controller
    

controller 添加@SoulSpringMvcClient 注解

你可以把注解加到 Controller 类上面, 里面的path属性则为前缀,如果含有 /** 代表你的整个接口需要被网关代理。这个可以参考测试工程:examples/soul-examples-http。
org.dromara.soul.examples.http.controller.HttpTestController:

@RestController
@RequestMapping("/test")
//HttpTestController 下的所有接口都被代理
@SoulSpringMvcClient(path = "/test/**")
public class HttpTestController {
    
    

    @PostMapping("/payment")
    public UserDTO post(@RequestBody final UserDTO userDTO) {
    
    
        return userDTO;
    }
    
    @GetMapping("/findByUserId")
    public UserDTO findByUserId(@RequestParam("userId") final String userId) {
    
    
        UserDTO userDTO = new UserDTO();
        userDTO.setUserId(userId);
        userDTO.setUserName("hello world");
        return userDTO;
    }
}
@RestController
@RequestMapping("/order")
//前缀后面为空,只有@SoulSpringMvcClient接口才会被代理
//"/save"接口会被代理,而"/findById"则不会
@SoulSpringMvcClient(path = "/order")
public class OrderController {
    
    

    @PostMapping("/save")
    @SoulSpringMvcClient(path = "/save")
    public OrderDTO save(@RequestBody final OrderDTO orderDTO) {
    
    
        orderDTO.setName("hello world save order");
        return orderDTO;
    }

    @GetMapping("/findById")
    public OrderDTO findById(@RequestParam("id") final String id) {
    
    
        OrderDTO orderDTO = new OrderDTO();
        orderDTO.setId(id);
        orderDTO.setName("hello world findById");
        return orderDTO;
    }
}

被代理服务的配置-其他语言,非springMvc体系

  • 首先在 soul-admin 找到 divide插件,进行选择器,和规则的添加,进行流量的匹配筛选。
  • 您也可以自定义开发属于你的 http-client,参考 多语言Http客户端开发。

以上两部分内容会在后面的章节进行详细的介绍,包括源码分析,目前先暂时跳过。

Http代理测试

我们可以直接使用soul源码下的examples/soul-examples-http模块来作为Http代理测试的源服务器。
首先我们参考上面Spring-boot的使用配置,检查项目soul-examples-http的配置,确认无误后,直接启动服务:
在这里插入图片描述
接着,我们登录控制台,点击PluginList -> divide,我们可看到所有接口路径都已经上传到了控制台。
在这里插入图片描述

单个Http服务测试

上面的服务启动成功后,打开文件 org.dromara.soul.examples.http.controller.HttpTestController,我们主要对下面这个接口进行测试。

注意:下面代码的接口"/findById"添加了@SoulSpringMvcClient 注解(和上面配置的举例不一样),会被soul网关代理。

@RestController
@RequestMapping("/order")
@SoulSpringMvcClient(path = "/order")
public class OrderController {
    
    
	...
    @GetMapping("/findById")
    @SoulSpringMvcClient(path = "/findById", desc = "Find by id")
    public OrderDTO findById(@RequestParam("id") final String id) {
    
    
        OrderDTO orderDTO = new OrderDTO();
        orderDTO.setId(id);
        orderDTO.setName("hello world findById");
        return orderDTO;
    }
    ...
}

先通过Postman进行一个简单的Http测试
首先测试一下http源服务器是否是通的:
在这里插入图片描述
源Http服务是可以访问的,接着我们准备使用网关访问。

soul:
  http:
    contextPath: /http

根据yaml配置,我们访问的网关端口后面需要添加"/http"。
在这里插入图片描述
网关代理测试成功。

通过Postman进行批量测试并且断言返回值

接下来我们再对网关进行一个简单的压测,主要是测试其正确性。
断言脚本:在这里插入图片描述
Postman runner批量测试100次:
在这里插入图片描述
测试结果:
在这里插入图片描述

测试负载均衡

修改soul-examples-http配置文件的端口,启动第二个http服务实例,端口8189
在这里插入图片描述
再次运行上面Postman的Runner 用例,这一次我们直接观看soul服务端的日志记录:
在这里插入图片描述
可以发现同一个接口分别随机被8819和8818代理了。

结语

本篇文章中,我们学习了如何配置和使用soul来进行Http服务器的代理,同时通过soul源码下的测试用例对Http代理进行了一下简单的压测。其实soul与其他网关最不一样的地方,是其提供了很多微服务网关的企业级功能,比如负载均衡的权重设置,流量控制,防火墙,权限认证等等,这里暂时只是演示了其最基本的使用功能,这些核心的功能都会在后面有详细的介绍。

猜你喜欢

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