为什么需要API网关
服务端有很多个微服务,服务之间还可能存在相互调用的关系。如果全部对外暴露,不安全,而且客户端调用的时候也比较麻烦。
解决方法就是使用服务网关zuul。网关作为所有外部请求的统一入口,外界的系统调用api接口的时候,都是调用服务网关的接口。
使用api网关的好处
防止内部敏感信息泄露:外界系统不需要知道多个微服务之间的调用关系,这样也可以保护内部服务的接口,防止外界系统直接调用一些接口,导致一些敏感信息泄露。
zuul还可以做权限认证,防止非法的请求访问api接口。
zuul的工作原理
在微服务架构中,后端服务往往不直接开放给调用端,而是通过一个 API网关根据请求的 url ,路由到相应的服务
zuul是通过Servlet来实现的,通过自定义的ZuulServlet来对ZuulFilter进行初始化,控制这些ZuulFilter的执行顺序,
zuul的核心是一系列的过滤器,zuul可以在HTTP请求的发起和返回响应期间执行一系列的过滤器。zuul包含四种过滤器:
- Pre Filter前置过滤器:它是在请求过滤到具体的服务之前执行的,可以在前置过滤器上做权限验证。
- Routing Filter路由过滤器:负责把请求转发到具体的微服务上,执行具体的业务逻辑。
- POST Filter后置过滤器:当微服务服务处理完之后,把结果交给后置过滤器处理,这里可以做统计和监控。
- Error Filter错误过滤器,当其他过滤器发生错误的时候,执行这个错误过滤器。
请求的声明周期
一个zuul请求的具体流程是:当一个客户端Request请求到达Zuul服务网关,网关首先进入前置过滤器,进行权限校验和其他操作,然后交给路由过滤器,由路由过滤器转发给对应的微服务进行业务处理,处理完的结果交给后置过滤器,做一些统计的工作,最后把Response结果返回给客户端。
zuul的权限校验
首先在pom.xml
文件中引入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-zuul</artifactId>
</dependency>
然后在启动类ApiGatewayApplication
上添加注解@EnableZuulProxy
,
区分卖家和买家
对于user模块:包含买家登录和卖家登录
买家登录不使用传统的账号和密码登录,而是使用第三方授权返回的一个用户唯一标识openid进行登录,假如唯一标识是abc,登录之后返回的时候,会在cookie里面设置openid=abc。
卖家登录和买家登录类似,openid假如是openid=xyz,不过返回的时候设置的东西多一些,在cookie里面设置token=UUID,这个UUID是java代码后端生成的,还在redis里面设置key=UUID和value=openid,这样可以区别。
注意spignboot的版本2.0.0.M3,springcloud的版本是Finchley.M2