今天浏览了一下 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。

  1. <dependency>
  2. <groupId>org.dromara</groupId>
  3. <artifactId>soul-spring-boot-starter-client-springmvc</artifactId>
  4. <version>${soul.version}</version>
  5. </dependency>

对应的配置内容也很简单。

  1. soul:
  2. http:
  3. # soul-admin 地址
  4. adminUrl: http://localhost:9095
  5. # 项目的端口号
  6. port: ${server.port}
  7. # 代理路由的前缀
  8. contextPath: /http
  9. appName: http
  10. # 是否代理全部服务
  11. full: false

接下来就是需要用代码去设置想要给 soul 网关代理的 HTTP 服务了。

上面已经提到了「@SoulSpringMvcClient」注解,在 HTTP 接口的类上或者接口方法上添加,就会把相应的接口服务注册到 soul 网关,从而让 soul 网关实现代理。

这个注解也很简单。

  • path 参数表示代理的接口 uri
  • ruleName 表示规则名称
  • desc 表示接口的描述信息
  • rpcType 表示代理的类型
  • registerMetaData 表示注册的元数据,http 服务用不上

    1. @Retention(RetentionPolicy.RUNTIME)
    2. @Target({ElementType.TYPE, ElementType.METHOD})
    3. public @interface SoulSpringMvcClient {
    4. String path();
    5. String ruleName() default "";
    6. String desc() default "";
    7. String rpcType() default "http";
    8. boolean enabled() default true;
    9. boolean registerMetaData() default false;
    10. }

    那么这个被 soul 网关代理的 HTTP 服务的 Controller 类就类似这样。 ```java @RestController @SoulSpringMvcClient(path = “/user/*”) public class UserController {

    @GetMapping(value = “/user/{id}”) public Object getUserById(@PathVariable(value = “id”) Long id) {

    1. User info = new User();
    2. info.setId(id);
    3. info.setName("name" + id);
    4. return info;

    }

    @GetMapping(value = “/user/list”) public Object getUserList() {

    1. List<User> list = new ArrayList<>();
    2. for (int i = 0; i < 3; i++) {
    3. User info = new User();
    4. info.setId(Long.valueOf(i));
    5. info.setName("name" + i);
    6. list.add(info);
    7. };
    8. return list;

    } }

``` 可以看出跟普通的 Controller 一样,就在类上添加了 @SoulSpringMvcClient(path = “/user/*”) 这样一行代码。

然后从启动日志上就可以看到这样的日志,表示这个类的接口已经注册到了 soul 网关上。
image.png
通过 soul-admin 也可以看到类似这样的记录。这里被代理地址多了一个 http 的前缀,这就表示选择器,也就是之前在配置文件里面配置的 context-path 的值。
image.png
从上面的截图上可以看到原本的接口服务地址如下:

代理之后多了一个 http 的前缀,也就表示代理之后的地址是:

最后我们分别访问下这几个接口测试下代理是否成功。
image.png
image.png
image.png
image.png
得到的结果完全一致,也就表示我们已经把自己的服务接入到了 soul 网关里面了。

到了这里,虽然已经实现了我们想要的接口代理功能,但是相信也会有很多疑问。

  • 比如接口服务是怎么注册到 soul 网关上的
  • soul-admin 里面的「选择器」、「规则」又表示什么东西
  • 以及配置 soul 网关的地址明明只是 端口为 9095 的 soul-admin,为啥最后代理的端口是 9195?

这些会在下篇文章里通过源码去解读整个接口注册的过程。