今天浏览了一下 soul 的文档,结合前两天运行案例的经历,个人觉得整个项目的内容太多,甚至很多功能在平时的工作里面都没有接触过,因此是不可能对所有的模块都去分析的,一旦这样做了,不但自己会很痛苦,也不可能会有太多的收获。
项目本身有很多值得我学习的地方,但是如果想在一个月里去学习所有的模块,这不现实,也会因为内容太多浅浅尝辄止。
因此,我打算更改之前的打算,先专注于一个方向去学习。
在之前的文章中已经了解到 soul-examples-http 模块会暴露 HTTP api 服务注册到 soul-admin,后者会存储到数据库,同时通过 websocket 推送到 soul 网关,这样就可以通过 soul 网关去代理原本 soul-examples-http 模块提供的服务了。
我觉得光是这个 HTTP 接口的网关代理过程就已经值得我好好学习了,因此之后的内容将专注于这个,直到能真正的理解之后,才会去学习其他诸如 dubbo 服务的网关代理。
soul 配置
首先从 soul 的配置开始说起吧,假如现在有一个 Spring Boot 项目对外提供了 HTTP 接口服务,需要接入 soul 网关。
那么首先就需要引入依赖,这个依赖是为了让我们的项目接入 soul 网关,原理就是通过配置 soul 网关的 soul-admin 地址,然后借助依赖提供的注解「@SoulSpringMvcClient」去扫描需要注册的 HTTP 服务,然后通过 HTTP 的方式提交给 soul-admin。
<dependency>
<groupId>org.dromara</groupId>
<artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
<version>${soul.version}</version>
</dependency>
对应的配置内容也很简单。
soul:
http:
# soul-admin 地址
adminUrl: http://localhost:9095
# 项目的端口号
port: ${server.port}
# 代理路由的前缀
contextPath: /http
appName: http
# 是否代理全部服务
full: false
接下来就是需要用代码去设置想要给 soul 网关代理的 HTTP 服务了。
上面已经提到了「@SoulSpringMvcClient」注解,在 HTTP 接口的类上或者接口方法上添加,就会把相应的接口服务注册到 soul 网关,从而让 soul 网关实现代理。
这个注解也很简单。
- path 参数表示代理的接口 uri
- ruleName 表示规则名称
- desc 表示接口的描述信息
- rpcType 表示代理的类型
registerMetaData 表示注册的元数据,http 服务用不上
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE, ElementType.METHOD})
public @interface SoulSpringMvcClient {
String path();
String ruleName() default "";
String desc() default "";
String rpcType() default "http";
boolean enabled() default true;
boolean registerMetaData() default false;
}
那么这个被 soul 网关代理的 HTTP 服务的 Controller 类就类似这样。 ```java @RestController @SoulSpringMvcClient(path = “/user/*”) public class UserController {
@GetMapping(value = “/user/{id}”) public Object getUserById(@PathVariable(value = “id”) Long id) {
User info = new User();
info.setId(id);
info.setName("name" + id);
return info;
}
@GetMapping(value = “/user/list”) public Object getUserList() {
List<User> list = new ArrayList<>();
for (int i = 0; i < 3; i++) {
User info = new User();
info.setId(Long.valueOf(i));
info.setName("name" + i);
list.add(info);
};
return list;
} }
``` 可以看出跟普通的 Controller 一样,就在类上添加了 @SoulSpringMvcClient(path = “/user/*”) 这样一行代码。
然后从启动日志上就可以看到这样的日志,表示这个类的接口已经注册到了 soul 网关上。
通过 soul-admin 也可以看到类似这样的记录。这里被代理地址多了一个 http 的前缀,这就表示选择器,也就是之前在配置文件里面配置的 context-path 的值。
从上面的截图上可以看到原本的接口服务地址如下:
代理之后多了一个 http 的前缀,也就表示代理之后的地址是:
最后我们分别访问下这几个接口测试下代理是否成功。
得到的结果完全一致,也就表示我们已经把自己的服务接入到了 soul 网关里面了。
到了这里,虽然已经实现了我们想要的接口代理功能,但是相信也会有很多疑问。
- 比如接口服务是怎么注册到 soul 网关上的
- soul-admin 里面的「选择器」、「规则」又表示什么东西
- 以及配置 soul 网关的地址明明只是 端口为 9095 的 soul-admin,为啥最后代理的端口是 9195?
这些会在下篇文章里通过源码去解读整个接口注册的过程。