浙江建设厅继续教育网站首页/西安百度竞价托管公司

浙江建设厅继续教育网站首页,西安百度竞价托管公司,crm管理系统登录入口官网,哪些网站有中文域名微服务的网关配置 1. 网关路由 1.1 网关 1.1.1 存在问题 单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身…

微服务的网关配置

1. 网关路由

1.1 网关

1.1.1 存在问题

单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,这就存在一些问题:每个微服务都需要编写身份校验、用户信息获取的接口,非常麻烦

用户身份校验最好放在一个统一的地方,例如:网关。

1.1.2 认识网关

顾明思议,网关就是络的口。数据在网络间传输,从一个网络传输到另一网络时就需要经过网关来做数据的路由和转发以及数据安全的校验

实现 java 微服务网关的技术:

  • Netflix Zuul:早期实现,目前已经淘汰
  • Spring Cloud Gateway:基于 Spring 的 WebFlux 技术,完全支持响应式编程,吞吐能力更强

Spring Cloud Gateway 使用参考官网

使用 Spring Cloud Gateway 实现网关,如下图:

前端请求网关根据请求路径路由到微服务,网关从 nacos 获取微服务实例地址将请求转发到具体的微服务实例上。

生产环境中网关也是集群部署,在网关前边通过 nginx 进行负载均衡,如下图:

1.2 实现网关路由

1.2.1 配置

创建网关工程;

引入依赖

<properties><maven.compiler.source>11</maven.compiler.source><maven.compiler.target>11</maven.compiler.target>
</properties>
<dependencies><!-- common:通用工具服务,有则添加 --><dependency><groupId>com.hmall</groupId><artifactId>hm-common</artifactId><version>1.0.0</version></dependency><!-- 网关 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency><!-- nacos discovery --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- 负载均衡 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-loadbalancer</artifactId></dependency>
</dependencies>

创建启动类

package com.hmall.gateway;@SpringBootApplication
public class GatewayApplication {public static void main(String[] args) {SpringApplication.run(GatewayApplication.class, args);}
}

修改配置文件

server:port: 8080
spring:application:name: gatewaycloud:nacos:server-addr: 192.168.101.68:8848gateway:routes:- id: item # 以 item-service 举例,根据实际修改uri: lb://item-servicepredicates:- Path=/items/**

路由规则 routes 包括四个属性,定义语法如下:

  • id:路由的唯一标示
  • predicates:路由断言,Predicates 是用于判断请求是否满足特定条件的组件。
  • filters:路由过滤条件,稍后讲解。
  • uri:路由目标地址,lb://代表负载均衡,从注册中心获取目标微服务的实例列表,并且负载均衡选择一个访问。
  • -:用于表示数组
1.2.2 配置项

predicates 属性,也就是路由断言。Spring Cloud Gateway 中支持的断言类型有很多:

名称说明
Cookie请求必须包含某些 cookie
Header请求必须包含某些 header
Host请求必须是访问某个host(域名)
Method请求方式必须是指定方式
Path请求路径必须符合指定规则
weight权重处理

常用的类型就是 Header、Path,Header 的使用如 - Header=X-Request-Id, \d+,说明请求头中包含属性 X-Request-Id,且对应的值为数字。

2. 网关鉴权

2.1 认识网关鉴权

单体架构时我们只需要完成一次用户登录、身份校验,就可以在所有业务中获取到用户信息。而微服务拆分后,每个微服务都独立部署,不再共享数据。也就意味着每个微服务都需要做身份校验,这显然不可取。

我们的登录是基于 JWT 来实现的,校验 JWT 的算法复杂,而且需要用到密钥。如果每个微服务都去做身份校验,这就存在着两大问题:

  1. 每个微服务都需要知道 JWT 的密钥,不安全。
  2. 每个微服务重复编写身份校验代码、权限校验代码,代码重复不易维护。

网关鉴权是指在网关对请求进行身份验证的过程。这个过程确保只有经过授权的用户或设备才能访问特定的服务或资源。

流程如下:

  1. 用户登录成功生成 token 并存储在前端
  2. 前端携带 token 访问网关
  3. 网关解析 token 中的用户信息,网关将请求转发到微服务,转发时携带用户信息
  4. 微服务从 http 头信息获取用户信息
  5. 微服务之间远程调用使用内部接口(无状态接口

2.2 网关内置过滤器

网关过滤器链中的过滤器有两种:

  1. GatewayFilter:路由过滤器,作用范围比较灵活,可以是任意指定的路由 Route
  2. GlobalFilter:全局过滤器,作用范围是所有路由,不可配置。

FilteringWebHandler 在处理请求时,会将 GlobalFilter 装饰为 GatewayFilter,然后放到过滤器链中,排序以后依次执行。

Gateway 中内置了很多的 GatewayFilter,详情可以参考官方文档:

常用的过滤器:StripPrefix

router- id: producturi: lb://item-servicepredicates:- Path=/product/**filters:- StripPrefix=1

StripPrefix=1 表示去除一级路径前缀,使用 StripPrefix=1

请求:http://localhost:8080/product/items

经过网关转换后,实际请求路径:http://localhost:8081/items

2.3 自定义过滤器

2.3.1 GlobalFilter 过滤器
package com.hmall.gateway.filter;@Component
@Slf4j
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 编写过滤器逻辑log.info("打印全局过滤器");// 放行return chain.filter(exchange);// 拦截// ServerHttpResponse response = exchange.getResponse();// 修改状态码// response.setRawStatusCode(401);// return response.setComplete();}@Overridepublic int getOrder() {// 过滤器执行顺序,值越小,优先级越高return 0;}
}

全局过滤器不用在路由中配置。

package com.hmall.gateway.config;// 配置拦截路径
@Data
@ConfigurationProperties(prefix = "hm.auth")
public class AuthProperties {private List<String> includePaths;private List<String> excludePaths;
}
2.3.2 GatewayFilter 过滤器

自定义 GatewayFilter 不是直接实现 GatewayFilter,而是继承 AbstractGatewayFilterFactory

注意:该类的名称一定要以 GatewayFilterFactory 为后缀!

package com.hmall.gateway.filter;@Component
@Slf4j
public class FirstFilterGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange,GatewayFilterChain chain) {ServerHttpRequest request = exchange.getRequest();log.info("请求路径:{}",request.getPath());log.info("网关过滤器FirstFilterGatewayFilterFactory执行啦...");// 放行return chain.filter(exchange);// 拦截 返回401状态码// exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);// return exchange.getResponse().setComplete();}};}
}

路由过滤器需要在配置中配置过滤器:

- id: producturi: lb://item-servicepredicates:- Path=/product/**filters:- StripPrefix=1- FirstFilter # 此处直接以自定义的 GatewayFilterFactory 类名称前缀类声明过滤器
2.3.3 总结

两种自定义过滤器的方式:

  1. GatewayFilter:路由过滤器

    作用范围比较灵活,可以是任意指定的路由 Route.

    继承 AbstractGatewayFilterFactory ,并在路由配置中指定过滤器。

    过滤器的名称规则:以 GatewayFilterFactory 作为后缀。

  2. GlobalFilter:全局过滤器

    作用范围是所有路由,不可配置。

    实现 GlobalFilter 接口。

    实现 Ordered 接口可以指定过滤器顺序,实现 getOrder() 方法,返回值越小优先级越好。

2.4 身份校验过滤器

2.4.1 引入 JWT 工具类

参考资料

./
│
├── com.*.gateway/
│    │
│    ├── config/
│    │    ├── AuthProperties.java   # 配置身份校验需要拦截的路径
│    │    ├── JwtProperties.java   # 定义与JWT工具有关的属性,比如秘钥文件位置
│    │    └── SecurityConfig.java   # 工具的自动装配
│    │
│    └── util/
│         └── JwtTool.java   # JWT工具,其中包含了校验和解析 token 的功能
│
└── resources/│└── hmall.jks   # 秘钥文件
2.4.2 配置白名单

其中 AuthPropertiesJwtProperties 所需的属性要在 application.yaml 中配置

hm:jwt:location: classpath:hmall.jks # 秘钥地址alias: hmall # 秘钥别名password: hmall123 # 秘钥文件密码tokenTTL: 30m # 登录有效期auth:excludePaths: # 无需身份校验的路径- /search/**- /users/login- /items/**

excludePaths 配置白名单地址,即无需身份校验的路径。

2.4.3 身份校验过滤器
./
│
└── com.*.gateway/└── filter/└── AuthGlobalFilter.java

2.5 总结

网关身份校验过滤器怎么实现?

我们项目中网关身份校验过滤器使用 Spring cloud Gateway 的 GlobalFilter 实现,GlobalFilter 是一种全局过滤器。实现过程如下:

  1. 配置密钥、白名单 等相关信息。
  2. 编写身份校验过滤器,实现 GlobalFilter 接口。
  3. 首先判断请求地址是否是白名单地址,如果是则放行
  4. 取出 http 头中的 token,然后校验 token 的合法性
  5. 如果 token 合法则将 token 中的用户信息向下传给微服务
  6. 如果 token 不合法则拒绝访问。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/74097.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

区间震荡指标

区间震荡指标的逻辑如下&#xff1a; 一、函数注解 1. Summation函数 功能&#xff1a; 计算给定价格序列Price的前Length个数据点的和&#xff0c;或在数据点数量超过Length时&#xff0c;计算滚动窗口内的价格和。 参数&#xff1a; Price(1)&#xff1a;价格序列&#…

C语言-数组指针和指针数组

指针 数组指针与指针数组 数组指针 定义 概念&#xff1a;数组指针是指向数组的指针&#xff0c;本质上还是指针 特点&#xff1a; ①先有数组&#xff0c;后有指针 ②它指向的是一个完整的数组 一维数组指针 语法&#xff1a; 数据类型 (*指针变量名)[容量]; 案例&a…

31天Python入门——第5天:循环那些事儿

你好&#xff0c;我是安然无虞。 文章目录 1. while循环1.1 while循环的嵌套1.2 补充学习:print函数 2. for循环2.1 range函数2.2 for循环2.3 continue和break以及return2.4 for循环的嵌套 3. 补充学习3.1 enumerate函数3.2 zip函数3.3 不要在遍历列表的过程中删除元素 循环 是…

c#难点整理

1.何为托管代码&#xff0c;何为非托管代码 托管代码就是.net框架下的代码 非托管代码&#xff0c;就是非.net框架下的代码 2.委托的关键知识点 将方法作为参数进行传递 3.多维数组 4.锯齿数组 5.多播委托的使用 6.is运算符 相当于逻辑运算符是 7.as 起到转换的作用 8.可…

数据结构之栈的2种实现方式(顺序栈+链栈,附带C语言完整实现源码)

对于逻辑关系为“一对一”的数据&#xff0c;除了用顺序表和链表存储外&#xff0c;还可以用栈结构存储。 栈是一种“特殊”的线性存储结构&#xff0c;它的特殊之处体现在以下两个地方&#xff1a; 1、元素进栈和出栈的操作只能从一端完成&#xff0c;另一端是封闭的&#xf…

Jmeter旧版本如何下载

1.Jmeter最新版本下载位置 https://jmeter.apache.org/download_jmeter.cgi2.Jmeter旧版本下载位置 https://archive.apache.org/dist/jmeter/binaries稳定版本&#xff1a;5.4.1

css-grid布局

文章目录 1、布局2、网格轨道3、间距Gap4、网格线5、网格别名 当一个 HTML 元素将 display 属性设置为 grid 或 inline-grid 后&#xff0c;它就变成了一个网格容器&#xff0c;这个元素的所有直系子元素将成为网格元素。 1、布局 启用grid布局类似与flex布局&#xff0c;不过g…

SolidWorks使用显卡教程

操作步骤&#xff1a; 打开注册表编辑器 按下键盘上的 Win R 组合键&#xff0c;输入 regedit 并按回车键&#xff0c;打开注册表编辑器。 导航到显卡信息路径 在注册表中依次展开以下路径&#xff1a; plaintext HKEY_CURRENT_USER\Software\SolidWorks\SOLIDWORKS 2021\Per…

【C++11】左值引用、右值引用、移动语义和完美转发

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C ⚙️操作环境:Visual Studio 2022 目录 &#x1f4cc;左值引用和右值引用 &#x1f38f;左值和左值引用 &#x1f38f;右值和右值引用 &#x1f4cc;左值引用和右值引用比较 &#x1f38f;左值引用 &#x1f38f;右值…

【机密计算顶会解读】11:ACAI——使用 Arm 机密计算架构保护加速器执行

导读&#xff1a;本文介绍ACAI&#xff0c;其构建一个基于CCA的解决方案&#xff0c;使得机密虚拟机能够安全地使用加速器&#xff0c;同时保持与现有应用程序的兼容性和安全性&#xff0c;能够实现对加速器的安全访问。 原文链接&#xff1a;ACAI: Protecting Accelerator Ex…

【Java SE】抽象类/方法、模板设计模式

目录 1.抽象类/方法 1.1 基本介绍 1.2 语法格式 1.3 使用细节 2. 模板设计模式&#xff08;抽象类使用场景&#xff09; 2.1 基本介绍 2.2 具体例子 1.抽象类/方法 1.1 基本介绍 ① 当父类的某些方法&#xff0c;需要声明&#xff0c;但是又不确定如何实现时&#xff…

深度学习:从零开始的DeepSeek-R1-Distill有监督微调训练实战(SFT)

原文链接&#xff1a;从零开始的DeepSeek微调训练实战&#xff08;SFT&#xff09; 微调参考示例&#xff1a;由unsloth官方提供https://colab.research.google.com/github/unslothai/notebooks/blob/main/nb/Qwen2.5_(7B)-Alpaca.ipynbhttps://colab.research.google.com/git…

流畅如丝:利用requestAnimationFrame优化你的Web动画体验

requestAnimationFrame 是前端开发中用于优化动画性能的 API。它允许浏览器在下一次重绘之前执行指定的回调函数&#xff0c;通常用于实现平滑的动画效果。 1.作用 优化性能&#xff1a;requestAnimationFrame 会根据浏览器的刷新率&#xff08;通常是 60Hz&#xff0c;即每秒…

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

IoTDB日志提示Too many open files

问题 时序数据库 IoTDB 1.3.3 版本 IoTDB 执行查询操作失败&#xff0c;日志打印提示 Too many open files。通过命令查看打开文件数&#xff0c;结果如下&#xff1a; [root0002 DataReceiver]# lsof|grep 28347|wc -l DataNode 55444 [root0002 DataReceiver]# lsof|g…

prometheus 添加alertmanager添加dingtalk机器人告警

1、dingtalk创建机器人,目前我们采用加白名单的方式校验 2、定位到如下图 test结果如下

C 语 言 --- 操 作 符 2

C 语 言 --- 操 作 符 2 移 位 操 作 符定 义原 码 补 码 和 反 码左 移&#xff08;<<&#xff09;右 移&#xff08;>>&#xff09;算 术 右 移逻 辑 右 移 按 位 与、按 位 或、和 按 位 异 或按 位 与按 位 或按 位 异 或 逻 辑 反 操 作负 值 操 作按 位 取 反…

基于Spring Boot的公司资产网站的设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导&#xff0c;欢迎高校老师/同行前辈交流合作✌。 技术范围&#xff1a;SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容&#xff1a;…

零碳工厂能源管理系统的核心技术与应用实践

零碳工厂能源管理系统是一种高效的解决方案&#xff0c;旨在优化能源使用并减少碳排放&#xff0c;以帮助工厂实现低碳或零碳的生产目标。以下是该系统的详细构成和功能&#xff1a; 1. 核心组件 传感器和监测设备&#xff1a;用于实时监测工厂内的能源使用情况&#xff0c;包…

美摄接入DeepSeek等大模型,用多模态融合重构视频创作新边界!

今年以来&#xff0c;DeepSeek凭借其强大的深度推理分析能力&#xff0c;在AI领域掀起新的热潮。美摄科技快速响应市场需求&#xff0c;迅速接入以DeepSeek、通义千问、商汤、文心一言为代表的大模型&#xff0c;为企业视频创作生产带来全新体验。 传统视频创作面临着同质化、…