一、网关作用
nginx结构图
就是一个微服务的统一入口,网关会根据路径进行分配,发送给不同的模块
1.1 概述
1.2 常见的API网关实现方式
Kong
基于Nginx+Lua开发,性能高,稳定,有多个可用的插件(限流、鉴权等等)可以开箱即用。
问题:只支持Http协议;二次开发,自由扩展困难;提供管理API,缺乏更易用的管控、配置方式。
Zuul
Netflix开源,功能丰富,使用JAVA开发,易于二次开发;需要运行在web容器中,如Tomcat。
问题:缺乏管控,无法动态配置;依赖组件较多;处理Http请求依赖的是Web容器,性能不如Nginx;
Traefik
Go语言开发;轻量易用;提供大多数的功能:服务路由,负载均衡等等;提供WebUI
问题:二进制文件部署,二次开发难度大;UI更多的是监控,缺乏配置、管理能力;
Spring Cloud Gateway
SpringCloud提供的网关服务,SpringCloud官方提供
Nginx+lua实现
使用Nginx的反向代理和负载均衡可实现对api服务器的负载均衡及高可用
问题:自注册的问题和网关本身的扩展性
二、网关实现
2.1 基于nginx的网关实现

根据你不同的项目定义不同的路径规则
2.2 微服务网关Zuul
网关也再建一个module,端口为9091
2.2.1 添加依赖
2.2.2 启动类
2.2.3 配置文件
2.2.3.1 不挂eureka
跟nginx一样,配置路由规则,跟反向代理一样
2.2.3.2 挂eureka
Zuul支持与Eureka整合开发,根据ServiceID自动的从注册中心中获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例的时候不用修改Zuul的路由配置。
- Zuul整合了Eureka,可以不写任何路由,有默认配置,直接使用
- url可省略
加了euraka,路由id就是服务名字,拿到服务名字就拿到了url,url可省略。所以刚才路由id怎么写都行,但在url省略不写的情况下路由id必须和eureka注册的服务名一致,不能乱写
- path关键字可省略
直接写到服务名的后面
2.3 网关过滤器
2.3.1 概念
Zuul它包含了两个核心功能:对请求的路由和过滤。
其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。其实,路由功能在真正运行时,它的路由映射和请求转发同样也由几个不同的过滤器完成的。所以,过滤器可以说是Zuul实现API网关功能最为核心的部件,每一个进入Zuul的HTTP请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。
Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可
以通过配置 urlPatterns 来拦截对应的请求。
Zuul 中的过滤器总共有 4 种类型,且每种类型都有对应的使用场景。
PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。
ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。
POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP
Header:收集统计信息和指标、将响应从微服务发送给客户端等。
ERROR:在其他阶段发生错误时执行该过滤器
2.3.2 测试代码
普通的登录判断(token)就在网关里面做,认证可以单独建一个模块来做
让有的判断在网关里做,否则每个判断都要在微服务里做,要麻烦些

return true才会执行run,false都不会执行run方法
2.3.3 单点登录sso
- 认证机制
记住密码实现:

- token就是服务器存在客户端浏览器中的一个数据,cookie也是
二者有什么区别?
- cookie:
服务器写在客户端的cookie是根据网络协议进行传输,下一次你去请求服务器,cookie的信息会自动跟着传输过去
有致命危险:csrf跨站伪造

- Token
支持跨域访问,我们走网关,在网关里验证,就解决了跨域
不依赖cookie,跟请求头一起发送,token到了服务器以后有验证代码。
移动端开发不支持cookie,只能依赖token来实现
我们会把token存在高版本浏览器的localStorage中,不存在cookkie中,它会默认5M空间,比session的4k要大得多,且是永久存储,手动删除才算过期
每次请求都会带着token去(将token加到请求头中传到服务器),在服务端进行验证,是否有效,就像一个凭证一样,就知道你有没有登录。
2.4 token
2.4.1 添加依赖
2.4.1 JWT工具类
放在公共模块中,因为哪个模块都有可能去调用
- 盐
一个模块中都用一个盐,不同项目可以换
-
签发人
-
过期时间
- 生成token,加密的时候放入自己的额外信息(uname),到时候都取得到

- 验证token
盐值不能变,只要不报异常就是验证成功
- 获取自定义信息
- token有效,我们有时做过期时间,也要判断是否过期
三、登录认证模块(controller)
3.1 添加依赖
3.2 配置文件
3.3 启动类
3.3 controller
测试的时候zuul都返回false,要不会拦截,看不到效果

3.4 前端页面
token删除
3.5 没有登录的用户不能进首页
shouldFilter()类似于shiro里有些页面和请求要直接放行,其他请求要拦截,是一个大关口
认证请求都不要拦
token要发送请求时加上Headers参数,把token带过来,然后用request取出来
前端页面,加请求头,把token加进去
3.6 Hbuilder
改页面路径
3.7 跨域配置(网关模块)
弄一个配置类,注一个bean
注意跨域配置类和@crossorigin注解有冲突,把它注释掉