SpringCloud-6-Zuul网关

一、网关作用

nginx结构图

image-20201111101207481

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

1.1 概述

image-20201111101408651

image-20201111115835750

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

image-20201111120135860

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

image-20201111102804466

2.2 微服务网关Zuul

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

2.2.1 添加依赖

image-20201111120203747

2.2.2 启动类

image-20201111105030716

2.2.3 配置文件

2.2.3.1 不挂eureka

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

image-20201111105701570

2.2.3.2 挂eureka

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

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

image-20201111111335182

  1. url可省略

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

image-20201111121220712

  1. path关键字可省略

直接写到服务名的后面

image-20201111110646216

image-20201111121355666

2.3 网关过滤器

2.3.1 概念

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

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

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

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

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

image-20201111120405455

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

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

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

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

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

2.3.2 测试代码

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

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

image-20201111143713821

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

image-20201111143520964

image-20201111143547569

2.3.3 单点登录sso

image-20201111144105387

  1. 认证机制

记住密码实现:

image-20201111144616443

image-20201111144139044

image-20201111144829299

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

二者有什么区别?

  • cookie:

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

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

image-20201111145531807
  • Token

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

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

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

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

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

image-20201111150738549

image-20201111150757877

2.4 token

image-20201111152649750

2.4.1 添加依赖

image-20201111152941347

2.4.1 JWT工具类

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

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

  1. 签发人

  2. 过期时间

image-20201111153424846

  1. 生成token,加密的时候放入自己的额外信息(uname),到时候都取得到
image-20201111153725451

image-20201111154015390

  1. 验证token

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

image-20201111154941409

  1. 获取自定义信息

image-20201111155235516

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

image-20201111155600781

三、登录认证模块(controller)

3.1 添加依赖

image-20201111160009313

3.2 配置文件

image-20201111162725603

3.3 启动类

image-20201111162746430

3.3 controller

image-20201111162809735

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

image-20201111161203474

3.4 前端页面

image-20201111164819341

image-20201111164556847

image-20201111164725301

token删除

image-20201112113928257

3.5 没有登录的用户不能进首页

shouldFilter()类似于shiro里有些页面和请求要直接放行,其他请求要拦截,是一个大关口

认证请求都不要拦

image-20201112120658853

token要发送请求时加上Headers参数,把token带过来,然后用request取出来

image-20201112115819225

前端页面,加请求头,把token加进去

image-20201112120540086

3.6 Hbuilder

改页面路径

image-20201112121144001

3.7 跨域配置(网关模块)

弄一个配置类,注一个bean

image-20201112141332727

image-20201112142223066

注意跨域配置类和@crossorigin注解有冲突,把它注释掉

image-20201112141929218

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值