上一篇文章《Spring Cloud微服务项目模板系列(二)添加sentinel限流降级服务》我们把sentinel给引入进来了,这篇文章我们给微服务添加网关-spring cloud gateway。加上此模块之后,我们所有的其他服务都全部通过gateway进行访问,而无法直接访问其他的小服务。还是一样,代码放在最后,这里介绍在spring cloud里面介绍几个重点。
添加token的验证filter
正常的服务我们除了排除的服务之外,其他的服务都需要对token进行验证,所以这里我们有一个AuthorizeFilter来处理这个模块,如图下:
详细的逻辑看代码即可。
添加request和response日志打印filter
在gateway里面由于所有的接口都从这里走,因此这里可以统一拦截request和response,我们在这里添加了打印request的url,请求参数,response的返回参数,详情见ReuqestPraramsPrint这个模块。
自定义gateway的异常处理
在spring cloud gateway里面,这里主要是做路由的转发,那么比如下游的服务不存在,或者下游的服务连接出现异常,那么gateway就会报错,这里的报错json信息是spring cloud gateway自带的,但是在生产上,我们希望和日常的接口返回格式保持一致,这样子前端就不需要做过多的判断,统一格式进行处理即可。所以这里我们添加了一个AbstractErrorWebExceptionHandler类,详情见:
这个类的说明可以参考这篇文章《微服务实战spring cloud alibaba(十七)spring cloud gateway自定义404返回信息》。
集成日志链路
这里的话我们使用日志的方式来做整个微服务的链路,详细的可以参考这篇文章《微服务实战spring cloud alibaba(十五)全局链路日志追踪》。
添加spring boot子项目的全局异常
还有一点,我们这里添加了处理spring boot的全局异常,详情见:GlobalExceptionHandler
gateway转发uid
在真实的业务中,我们所有的spring boot子模块项目都是在内网里面,外网是无法直接进行访问的,因此对于我们来说,我们经常会做用户行为分析,所以在gateway里面我们根据用户登录的token,反解出uid,然后把uid添加到request header中转发给子服务,子服务里面直接可以从request header头里面获取到用户的uid,直接做业务处理。
以上就是本次添加spring cloud gateway模块的几个比较重要的点。最后按照惯例,附上本案例的源码,登录后即可下载。
备注:
1、这里的话我们把spring cloud的版本升级了一下,因此这里的版本和之前的两篇文章版本有一些出入,需要核对下。
还没有评论,来说两句吧...