网关如何通报信息给微服务
https://i-blog.csdnimg.cn/direct/706713d637a4431f92f015e26e44645b.png前情回顾
上篇我们已经完成了网关对全部微服务请求的拦截以及JWT的登录校验。
客户端和微服务之间的桥梁--网关(身份校验)https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/143425484
标题引入
现在的标题是在一些微服务业务中,需要用到用户信息,但是并没有,不能仅仅只是简单的校验,还要把信息通报过去。如何通过网关通报给微服务。
思路
网关过滤器中把用户信息写在请求头中发送过去,微服务可以通过注解@RequestHeader再从请求头中获取信息。
衍生标题的思路:对于一个服务中N个业务都需要用到户信息,可以用拦截器把用户信息保存到 ThreadLocal ,避免增加重复的逻辑。
对于N个服务,可以把拦截器写在服务外的公共模块,作为依靠引入使用,避免 重复的定义拦截器。
思路实现
构建新的exchange对象
使用mutate(使改变)方法创建一个新的构造器对exchange对象举行复制并重构,然后修改一些请求头信息,生成一个新的exchange对象,放行的时间,将这个新的对象上下文通报就可以了。
https://i-blog.csdnimg.cn/direct/da97d854ff8c4f228f9af2998bc87318.png
构造器对request请求举行构建,builder请求构建器,向请求头添加了一个新的头信息“user”
定义外部公共模块,编写MVC拦截器
微服务只要引入这个公共模块依靠,拦截器即可生效。此拦截器不举行拦截,仅仅只做将用户信息保存到ThreadLocal的操纵
https://i-blog.csdnimg.cn/direct/0a94a7911c7e4bb5b215578500260916.png
注:此时拦截器以及配置类是定义在公共模板中的,和微服务不在一个包,是扫描不到配置的
使用springboot的自动装配
使在差别包下的配置类生效:将配置类记载在META-INF/spring.factories中,当应用启动时,会实验加载此文件。
https://i-blog.csdnimg.cn/direct/67f08dd0bba44de69ea8e3dda4409818.png
此时启动网关会报错
Failed to process import candidates for configuration class ; nested exception is java.io.FileNotFoundException: class
由于网关也引用了公共模块,也就有了拦截器的MVC配置类。而网关和SpringMVC的架构,目标是不一样的,网关非阻塞式I/O,MVC阻塞式I/O,一起用就产生了冲突。
解决:只让此配置类在微服务中生效,使用条件自动装配,微服务都用到了MVC,而MVC的核心API是DispatcherServlet,以是条件就是它。
@ConditionalOnClass: 当某个类在类路径中存在时才装配对应的 bean,即在加载META-INF/spring.factories 前举行条件检查,决定要不要加载某个配置。
以是:只有当类路径中存在DispatcherServlet时,才会加载此配置类,以确保当前应用是一个MVC应用
再启动网关,成功启动。
https://i-blog.csdnimg.cn/direct/34b7912bda0249cda548fd023d037f08.png
至此,微服务就可以从ThreadLocal中获取到用户信息了。
预知后事如何,请看下集。
微服务之间的消息通报https://csdnimg.cn/release/blog_editor_html/release2.3.7/ckeditor/plugins/CsdnLink/icons/icon-default.png?t=O83Ahttps://mp.csdn.net/mp_blog/creation/editor/143435763
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页:
[1]