soul网关源码学习11-http代理解析(上)

soul网关源码学习11-http代理解析(上)

前言

soul作为一款高性能网关,可以转发各种类型的接口,如http,dubbo,springcloud,sofa等,那么它是通过怎么样的方式来进行转发呢?如何动态的上下线接口呢?如何保证接口一直能处于服务状态呢?

下面顺着上面几个问题,以http接口为例子,解析代码。

一、启动项目

  • 启动admin项目
    在这里插入图片描述
  • 启动bootstrap项目
    在这里插入图片描述
  • 启动http-example项目
    在这里插入图片描述

二、源码解析

启动完这三个项目之后思考一下,既然是http接口要接入网关,猜测会有一个把接口注册到网关的动作,这个动作应该是在http接口这个项目启动的时候做的。通过控制台看一下http-example项目的日志,o.d.s.client.common.utils.RegisterUtils : http client register success,直接就可以从RegisterUtils这个工具类入手。

  • 找到这个工具类,看一下是哪里调用的,由于我们用的http服务,所以应该是SpringMvcClientBeanPostProcessor这里面调用的。
    在这里插入图片描述
  • 找到SpringMvcClientBeanPostProcessor这个类,先不急着看里面有什么东西,先看一下是哪里调用的。
    在这里插入图片描述
  • 找到这个配置类SoulSpringMvcClientConfiguration,可以看出这里面加载了两个bean,下面仔细看一下这两个bean加载过程做了什么,直接打上两个断点,重启http-example
    在这里插入图片描述
  • 断点先到SpringMvcClientBeanPostProcessor,直接进入类里面。
    在这里插入图片描述
  • 构造方法做了一下初始化的东西,创建了一个线程池。
    在这里插入图片描述
  • 然后注意一下SpringMvcClientBeanPostProcessor这个类,实现了BeanPostProcessor接口,所以它会在加载bean之后执行postProcessAfterInitialization方法,打上断点。debug往下走,进来这里。
    在这里插入图片描述
  • 这里注意一下这个full字段,在配置文件里面配置的,我们现在配的是false,所以debug直接往下走。
soul:
  http:
    adminUrl: http://localhost:9095
    port: 8188
    contextPath: /http
    appName: http
    full: false
  • 往下走可以看到这里扫描了ControllerRestControllerRequestMapping这几个注解,这里可以看到有很多bean扫描到的这几个类型的注解都是null,所以断点直接打到里面去。在这里插入图片描述
  • 继续往下执行,可以看到扫描到了上面的那几个注解的其中一个,然后再进一步扫描SoulSpringMvcClient注解,这个注解应该就是表示这个接口要被soul网关代理了。
    在这里插入图片描述
  • 往下走,走到线程池这里来,这个地址是admin的一个接口地址,进去RegisterUtilsdoRegister方法里面做了什么。
    在这里插入图片描述
  • 通过http请求调了admin注册api的接口。
    在这里插入图片描述
  • 继续往下,通过反射拿到bean所有的方法,然后再判断方法有没有SoulSpringMvcClient注解,有的话由soul网关代理,下面也是同样的操作,通过http请求调用admin的接口。
  • 在这里插入图片描述
  • 断点继续往下走,来到ContextRegisterListener这里。
    在这里插入图片描述
  • 进入里面,看它的构造方法,对参数做了校验,然后做了初始化的操作。注意看一下这个类实现了ApplicationListener接口,所以在onApplicationEvent方法打上断点。
    在这里插入图片描述
  • 往下走,进到这个onApplicationEvent方法里面,注意看一下事件类型ContextRefreshedEvent,这个表示spring容器加载完毕之后触发监听的。而且这个监听有可能是会被触发多次的,为了防止触发多次,前面加了个判断。
  • 继续往下走,因为我们full字段配置了false,所以直接结束了。
    在这里插入图片描述
  • 整个过程加载完毕,下面把full字段配置成true,看一下有哪些不同的地方。
soul:
  http:
    adminUrl: http://localhost:9095
    port: 8188
    contextPath: /http
    appName: http
    full: true
  • 改完之后重启http-example,同样的断点,这里只看有区别的地方。执行到这里的时候由于full是true,所以直接返回bean,不扫描注解。
    在这里插入图片描述
  • 执行到这里的时候,会去注册所有的接口。

在这里插入图片描述

  • 看一下buildJsonParams方法,全路径匹配。
    在这里插入图片描述
  • 走到这里,整个http服务注册客户端的流程就走完了。

三、总结

整个注册的过程就是围绕着spring的加载流程,再配合反射,扫描注解等,去找到需要代理的接口,然后通过http请求的方式发送数据到admin,下一讲继续看admin接收到数据之后做了哪些操作。

http代理解析(下)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值