Zuul之身份认证
微服务架构所面临的问题?
1)针对某个功能,客户端在微服务架构的情况下需要请求多个模块接口
2)针对于身份认证、日志、流量控制等公共模块每个微服务都需要做一遍,不利于业务与非业务的拆分
Zuul可以做什么
1)客户端只需要知道网关而不需要知道具体模块的地址,所有服务由网关对外提供
2)身份认证类的东西单独抽象出来,业务模块只做业务
3)易于监控。可在微服务网关收集监控数据并将其推送到外部系统进行分析。
Zuul如何进行身份认证?
1)filterType生命周期介绍图
2) 如何对请求参数授权、验签和解密?
通过继承ZuulFilter指定filterType为pre, RequestContext.getCurrentContext()获取当前请求的上下文,并获取到对应的请求参数,通过请求的appKey和对应的方法判断用户是否有访问该服务的权限、请求次数等。根据参数进行验签和解密,将解密后的参数重写请求上下文HttpServletRequestWrapper,再通过routing发送到对应的springcloud服务中,在服务方中获取到的请求参数是明文,服务方无需关注调用方请求信息的解密操作。因后续需要再次获取到部分调用方基础信息,需将请求的入参存放到request的Attribute里面。前置处理部分代码如下
3) 如何对返回结果加密和加签?
可以通过继承ZuulFilter指定filterType为post
通过获取request里面的request.getAttribute(“”)获取到调用方的基础信息,根据这些信息把微服务返回的body进行加签和加密,返回至调用方。
部分代码如下: