SpringCloud-5-Zuul网关

一、网关作用

nginx结构图

SpringCloud-5-Zuul网关

就是一个微服务的统一入口,网关会根据路径进行分配,发送给不同的模块

1.1 概述

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

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的网关实现

SpringCloud-5-Zuul网关

根据你不同的项目定义不同的路径规则

SpringCloud-5-Zuul网关

2.2 微服务网关Zuul

网关也再建一个module,端口为9091

2.2.1 添加依赖

SpringCloud-5-Zuul网关

2.2.2 启动类

SpringCloud-5-Zuul网关

2.2.3 配置文件

2.2.3.1 不挂eureka

跟nginx一样,配置路由规则,跟反向代理一样

SpringCloud-5-Zuul网关

2.2.3.2 挂eureka

Zuul支持与Eureka整合开发,根据ServiceID自动的从注册中心中获取服务地址并转发请求,这样做的好处不仅可以通过单个端点来访问应用的所有服务,而且在添加或移除服务实例的时候不用修改Zuul的路由配置。

  1. Zuul整合了Eureka,可以不写任何路由,有默认配置,直接使用

SpringCloud-5-Zuul网关

  1. url可省略

加了euraka,路由id就是服务名字,拿到服务名字就拿到了url,url可省略。所以刚才路由id怎么写都行,但在url省略不写的情况下路由id必须和eureka注册的服务名一致,不能乱写

SpringCloud-5-Zuul网关

  1. path关键字可省略

直接写到服务名的后面

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

2.3 网关过滤器

2.3.1 概念

Zuul它包含了两个核心功能:对请求的路由和过滤。

其中路由功能负责将外部请求转发到具体的微服务实例上,是实现外部访问统一入口的基础;而过滤器功能则负责对请求的处理过程进行干预,是实现请求校验、服务聚合等功能的基础。其实,路由功能在真正运行时,它的路由映射和请求转发同样也由几个不同的过滤器完成的。所以,过滤器可以说是Zuul实现API网关功能最为核心的部件,每一个进入Zuul的HTTP请求都会经过一系列的过滤器处理链得到请求响应并返回给客户端。

Zuul 中的过滤器跟我们之前使用的 javax.servlet.Filter 不一样,javax.servlet.Filter 只有一种类型,可

以通过配置 urlPatterns 来拦截对应的请求。

Zuul 中的过滤器总共有 4 种类型,且每种类型都有对应的使用场景。

SpringCloud-5-Zuul网关

PRE:这种过滤器在请求被路由之前调用。我们可利用这种过滤器实现身份验证、在集群中选择请求的微服务、记录调试信息等。

ROUTING:这种过滤器将请求路由到微服务。这种过滤器用于构建发送给微服务的请求,并使用Apache HttpClient或Netfilx Ribbon请求微服务。

POST:这种过滤器在路由到微服务以后执行。这种过滤器可用来为响应添加标准的HTTP

Header:收集统计信息和指标、将响应从微服务发送给客户端等。

ERROR:在其他阶段发生错误时执行该过滤器

2.3.2 测试代码

普通的登录判断(token)就在网关里面做,认证可以单独建一个模块来做

让有的判断在网关里做,否则每个判断都要在微服务里做,要麻烦些

SpringCloud-5-Zuul网关

return true才会执行run,false都不会执行run方法

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

2.3.3 单点登录sso

SpringCloud-5-Zuul网关

  1. 认证机制

记住密码实现:

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

  1. token就是服务器存在客户端浏览器中的一个数据,cookie也是

二者有什么区别?

  • cookie:

​ 服务器写在客户端的cookie是根据网络协议进行传输,下一次你去请求服务器,cookie的信息会自动跟着传输过去

​ 有致命危险:csrf跨站伪造

SpringCloud-5-Zuul网关
  • Token

支持跨域访问,我们走网关,在网关里验证,就解决了跨域

不依赖cookie,跟请求头一起发送,token到了服务器以后有验证代码。

移动端开发不支持cookie,只能依赖token来实现

我们会把token存在高版本浏览器的localStorage中,不存在cookkie中,它会默认5M空间,比session的4k要大得多,且是永久存储,手动删除才算过期

每次请求都会带着token去(将token加到请求头中传到服务器),在服务端进行验证,是否有效,就像一个凭证一样,就知道你有没有登录。

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

2.4 token

SpringCloud-5-Zuul网关

2.4.1 添加依赖

SpringCloud-5-Zuul网关

2.4.1 JWT工具类

放在公共模块中,因为哪个模块都有可能去调用

一个模块中都用一个盐,不同项目可以换

  1. 签发人

  2. 过期时间

SpringCloud-5-Zuul网关

  1. 生成token,加密的时候放入自己的额外信息(uname),到时候都取得到
SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

  1. 验证token

盐值不能变,只要不报异常就是验证成功

SpringCloud-5-Zuul网关

  1. 获取自定义信息

SpringCloud-5-Zuul网关

  1. token有效,我们有时做过期时间,也要判断是否过期

SpringCloud-5-Zuul网关

三、登录认证模块(controller)

3.1 添加依赖

SpringCloud-5-Zuul网关

3.2 配置文件

SpringCloud-5-Zuul网关

3.3 启动类

SpringCloud-5-Zuul网关

3.3 controller

SpringCloud-5-Zuul网关

测试的时候zuul都返回false,要不会拦截,看不到效果

SpringCloud-5-Zuul网关

3.4 前端页面

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关

SpringCloud-5-Zuul网关