文章目录
前言
在上一篇文章《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与其他网关最不一样的地方,是其提供了很多微服务网关的企业级功能,比如负载均衡的权重设置,流量控制,防火墙,权限认证等等,这里暂时只是演示了其最基本的使用功能,这些核心的功能都会在后面有详细的介绍。