本次的文章我们将继续讨论 soul 的 divide 插件,也就是 http 服务的代理
在自己的 Spring Boot 项目中引入 soul
首先在 pom.xml 文件中引入如下依赖
<dependency><groupId>org.dromara</groupId><artifactId>soul-spring-boot-starter-client-springmvc</artifactId><version>${soul.version}</version>
</dependency>
在 yml 文件中引入如下配置
soul:http:adminUrl: http://localhost:9095port: 8188contextPath: /httpappName: httpfull: false# adminUrl: 为你启动的soul-admin 项目的ip + 端口,注意要加http://
# port: 你本项目的启动端口
# contextPath: 为你的这个mvc项目在soul网关的路由前缀,比如/order ,/product 等等,网关会根据你的这个前缀来进行路由.
# appName:你的应用名称,不配置的话,会默认取 `spring.application.name` 的值
# full: 设置true 代表代理你的整个服务,false表示代理你其中某几个controller
接下来,在 controller 层上面添加注解 @SoulSpringMvcClient ,可以注解在方法或者类上,
可以使用 path 参数进行前缀的配置,比如 example-http 模块中的如下示例:
@RestController
@RequestMapping("/test")
@SoulSpringMvcClient(path = "/test/**")
public class HttpTestController {
}
会将此类下的所有接口都交由 soul 代理,而如果写成
@RestController
@RequestMapping("/order")
@SoulSpringMvcClient(path = "/order")
public class OrderController {
@PostMapping("/save")@SoulSpringMvcClient(path = "/save" , desc = "Save order")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;}
}
则只会代理 save 接口,而不代理 findById 接口。
负载均衡策略
我们修改一下端口再启动一个 web 服务,如果使用 IDEA 的话,注意先在设置中开启相应的支持,如下图:
将新的端口配置到选择器中
接下来我们先来测试轮询的策略
在其中一个规则中修改负载均衡策略为roundRobin
请求几次后观察控制台,可以看到两个端口会被均匀的分配流量
再将负载均衡策略改为 random 并同样进行几次请求,注意,此时我们选择器中配置了两个端口的权重相同,均为 50,可以观察到如下结果
流量并未每次都均匀的分配,但是总体呈现权重相同的效果
接下来修改一下权重
再进行试验,可以看到8188端口的流量变多了