作者简介:☕️大家好,我是intelligent_M,一个Java后端开发者!
当前专栏:intelligent_M—— 微服务(SpringCloud) ,CSDN博客。后续会更新Java相关技术栈以及链表哈希表二叉树…,回溯算法贪心算法…等等算法题。
创作不易 欢迎点赞评论!!!
网关
- 网关:就是网络的关口,负责数据的路由,转发,安全校验
网关路由
在SpringCloud中网关的实现包括两种:
- SpringCloud Gateway
- Netfilx Zuul
快速入门
- 网关是一个独立服务,因此入门案例中我们要做这么几件事情
- 1.创建网关服务
- 2.引入依赖
- 3.编写启动类
- 4.配置路由
路由断言
网关路由对应的Java类型是RouteDefinition,其中可配置的属性有:
- id:路由唯一标示
- uri:路由目的地,支持lb和http两种
- predicates:路由断言,断言配置都有路由断言工厂(RoutePredicateFactory)来处理
- filters:路由过滤器,处理请求或响应
Spring提供了12种基本的RoutePredicateFactory的默认实现:
网关登录校验
网关过滤器
-网关过滤器有两种,分别是:
- GatewayFilter:路由过滤器,作用范围灵活,作用于任意指定的路由。
- GlobalFilter:全局过滤器,作用范围是所有路由。
- 两种过滤器的过滤方法签名完全一致
Spring内置了很多GatewayFilter和GlobalFilter,其中Global Filter直接对所有请求生效,而Gateway则需要在yaml文件配置指定作用的路由范围。常见的GatewayFilter有:
自定义过滤器
自定义GatewayFilter不是直接实现GatewayFilter,而是实现AbstractGatewayFilterFactory,如下:
自定义GlobaFilter就简单多了,直接实现GlobalFilter接口即可:
实现登录校验
-
自定义
GlobalFilter
来完成登录校验
具体作用如下: -
AuthProperties
:配置登录校验需要拦截的路径,因为不是所有的路径都需要登录才能访问 -
JwtProperties
:定义与JWT工具有关的属性,比如秘钥文件位置 -
SecurityConfig
:工具的自动装配 -
JwtTool
:JWT工具,其中包含了校验和解析token
的功能 -
hmall.jks
:秘钥文件
其中AuthProperties
和JwtProperties
所需的属性要在application.yaml
中配置:
hm:
jwt:
location: classpath:hmall.jks # 秘钥地址
alias: hmall # 秘钥别名
password: hmall123 # 秘钥文件密码
tokenTTL: 30m # 登录有效期
auth:
excludePaths: # 无需登录校验的路径
- /search/**
- /users/login
- /items/**
- 定义一个登录校验的过滤器:
在这里插入图片描述
网关传递用户
- 在网关的登录校验过滤器中,把获取到的用户写入请求头
- 修改gateway模块中的登录校验拦截器,在校验成功后保存到用户下游请求的请求头中。
- 在common中编写SpringMVC拦截器,获取登录用户
OpenFeign传递用户
微服务项目中的很多业务要多个微服务共同合作完成,而这个过程中也需要传递登录用户信息,例如:
- OpenFeign中提供了一个拦截器接口,所有由OpenFeign发送的请求都会先调用拦截器处理请求:
- 其中的RequestTemplate类中提供了一些方法可以让我们修改请求头:
配置管理
Nacos既可以做注册中心也可以做配置管理服务
- 微服务重复配置过多,维护成本高
- 业务配置经常变动,每次修改都要重启服务
- 网关路由配置写死,如果变更要重启网关
共享配置
- 1.添加一些共享配置到Nacos中,包括:Jdbc,MybatisPlus,日志,Swagger,OpenFeign等配置
- 2.拉取共享配置,基于NacosConfig拉取共享配置代替微服务的本地配置。
- 1.引入依赖
- 2.新建bootstrap.yaml
- 1.引入依赖
配置热更新
- 除了Spring的配置以外,业务中自定义的基于@ConfigurationProperties的自定义配置属性也都可以从Nacos读取。而且当Nacos中的这些业务配置变更时,Nacos会推送变更信息到微服务,无需重启即可生效,实现配置热更新。
动态路由
- 动态路由一般是在网关服务的yaml文件中写死的,一般不需要动
- 实现动态路由需要将路由配置保存到Nacos,然后在网关监听Nacos中的路由配置,并实现配置热更新。然而网关路由并不是自定义业务配置属性,本身不具备热更新功能!参考CompositeRouteDefinitionLocator
因此我们需要自己完成两件事情: - 1.监听Naocs配置变更的消息
- 监听Nacos配置变更可以参考官方文档:https://nacos.io/zh-cn/docs/sdk.html
- 2.当配置变更时,将最新的路由消息更新到网关路由表
监听到路由信息后,可以里哟个来更新路由表
最终,我们要向Nacos中添加一个json格式的路由配置,模板如下:
看完本篇请前往SpringCloud微服务第三篇