微服务:网关

网关

网关,即网络的关口,当一个网络传输到另一个网络时就需要经过网关来实现

数据的路由和转发

以及

数据安全的校验

网关技术实现

SpringCloudGateWay:

基于Spring的WebFlux技术,完全支持响应式编程,吞吐能力更强

SpringCloudGateWay

依赖

 <!--网关--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId></dependency>

配置

gateway:routes:- id: item # 路由规则id,自定义,唯一uri: lb://item-service # 路由的目标服务,lb代表负载均衡,会从注册中心拉取服务列表predicates: # 路由断言,判断当前请求是否符合当前规则,符合则路由到目标服务- Path=/items/**,/search/** # 这里是以请求路径作为判断规则- id: carturi: lb://cart-servicepredicates:- Path=/carts/**- id: useruri: lb://user-servicepredicates:- Path=/users/**,/addresses/**- id: tradeuri: lb://trade-servicepredicates:- Path=/orders/**- id: payuri: lb://pay-servicepredicates:- Path=/pay-orders/**
predicates:路由断言,即路由的规则

请添加图片描述

网关过滤器

网关过滤器流程如下所示

在这里插入图片描述

请求进入网关由HandlerMapping判断,根据规则路由交给WebHandler处理

WebHandler加载路由下需要执行的过滤器链,按顺序一一执行

Filter分为pre和post两部分,分别在微服务之前和之后执行

所有pre过滤器执行完成后请求就会发送到微服务

实现网关过滤器

GatewayFilter:路由过滤器,作用范围比较灵活,可以是任意指定的路由Route

GlobalFilter:全局过滤器,作用范围是所有路由,不可配置

gatewayFilter网关过滤器
spring:cloud:gateway:routes:- id: test_routeuri: lb://test-servicepredicates:-Path=/test/**filters:- AddRequestHeader=key, value # 逗号之前是请求头的key,逗号之后是value

将内置的AddRequestHeader过滤器作用在对应的路由中,作用是给请求添加一个请求头传递到下游的微服务中

spring:cloud:gateway:default-filters: # default-filters下的过滤器可以作用于所有路由- AddRequestHeader=key, valueroutes:- id: test_routeuri: lb://test-servicepredicates:-Path=/test/**

将过滤器置于default-filters下可以生效于所有路由

自定义GatewayFilter

并不是直接使用内置的GatewayFilter而是实现AbstractGatewayFilterFactory

@Component
public class PrintAnyGatewayFilterFactory extends AbstractGatewayFilterFactory<Object> {@Overridepublic GatewayFilter apply(Object config) {return new GatewayFilter() {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 获取请求ServerHttpRequest request = exchange.getRequest();// 编写过滤器逻辑System.out.println("过滤器执行了");// 放行return chain.filter(exchange);}};}
}

重写过滤器内部的apply方法

在apply方法内部返回一个gatewayFilter对象,并重写其中的filter规则作为业务逻辑

使用时:直接和之前一样在路由配置中使用即可

spring:cloud:gateway:default-filters:- PrintAny # 此处直接以自定义的GatewayFilterFactory类名称前缀类声明过滤器

还可以通过在自定义网关中配置内部配置类和重写getConfigClass来自定义网关参数

自定义GlobalFilter

globalFilter的自定义比较简单,也无法设置动态参数

直接通过实现GlobalFilter接口即可

重写filter编写拦截逻辑

重写getOrder规定过滤器的执行顺序

@Component
public class PrintAnyGlobalFilter implements GlobalFilter, Ordered {@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 编写过滤器逻辑System.out.println("未登录,无法访问");// 放行// return chain.filter(exchange);// 拦截ServerHttpResponse response = exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}@Overridepublic int getOrder() {// 过滤器执行顺序,值越小,优先级越高return 0;}
}
登录拦截器
package com.hmall.gateway.filter;import com.hmall.common.exception.UnauthorizedException;
import com.hmall.common.utils.CollUtils;
import com.hmall.gateway.config.AuthProperties;
import com.hmall.gateway.util.JwtTool;
import lombok.RequiredArgsConstructor;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.http.server.reactive.ServerHttpResponse;
import org.springframework.stereotype.Component;
import org.springframework.util.AntPathMatcher;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;import java.util.List;@Component
@RequiredArgsConstructor
@EnableConfigurationProperties(AuthProperties.class)
public class AuthGlobalFilter implements GlobalFilter, Ordered {private final JwtTool jwtTool;private final AuthProperties authProperties;private final AntPathMatcher antPathMatcher = new AntPathMatcher();@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {// 1.获取RequestServerHttpRequest request = exchange.getRequest();// 2.判断是否不需要拦截if(isExclude(request.getPath().toString())){// 无需拦截,直接放行return chain.filter(exchange);}// 3.获取请求头中的tokenString token = null;List<String> headers = request.getHeaders().get("authorization");if (!CollUtils.isEmpty(headers)) {token = headers.get(0);}// 4.校验并解析tokenLong userId = null;try {userId = jwtTool.parseToken(token);} catch (UnauthorizedException e) {// 如果无效,拦截ServerHttpResponse response = exchange.getResponse();response.setRawStatusCode(401);return response.setComplete();}// TODO 5.如果有效,传递用户信息System.out.println("userId = " + userId);// 6.放行return chain.filter(exchange);}private boolean isExclude(String antPath) {for (String pathPattern : authProperties.getExcludePaths()) {if(antPathMatcher.match(pathPattern, antPath)){return true;}}return false;}@Overridepublic int getOrder() {return 0;}
}

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

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

相关文章

【Rust光年纪】数据科学与机器学习:深入了解Rust语言中的6个关键库

Rust语言中的数据科学和机器学习&#xff1a;六大库全面解析 前言 随着Rust语言的不断发展&#xff0c;越来越多的优秀库和框架涌现出来&#xff0c;为不同领域的开发者提供了丰富的选择。本文将介绍一些适用于Rust语言的机器学习、数据处理和自然语言处理领域的优秀库和框架…

JAVA毕业设计152—基于Java+Springboot+vue+小程序的个人健康管理系统小程序(源代码+数据库+15000字论文)

毕设所有选题&#xff1a; https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootvue小程序的个人健康管理系统小程序(源代码数据库15000字论文)152 一、系统介绍 本项目前后端分离带小程序(可以改为ssm版本)&#xff0c;分为用户、管理员两种…

Ubuntu下载jdk:cannot execute binary file

虚拟机上Ubuntu系统安装jdk且配置环境之后&#xff0c;java -version显示cannot execute binary file&#xff0c;多番查阅推测是由于系统和jdk版本不兼容的原因。 uname -m查看系统版本位i686&#xff0c;是32位的&#xff0c;和64位的jdk版本不兼容。因此&#xff0c;下载32位…

Postman与WebSockets:实时通信的桥梁

Postman与WebSockets&#xff1a;实时通信的桥梁 在当今的Web应用中&#xff0c;实时通信变得越来越重要。WebSockets提供了一种在单个连接上进行全双工通信的方法&#xff0c;允许服务器和客户端之间进行实时数据交换。Postman&#xff0c;作为一款强大的API开发和测试工具&a…

阻止 chrome “[保存并填写地址](chrome://settings/addresses)“ 导致输入框聚焦时出现候选项

参考 禁止浏览器自动填充到表单 的这个回答 代码 要求将不可见的input框放在页面的最前面&#xff0c;如body起始处&#xff0c; chrome之类的浏览器会填充最前面的输入框。 <!-- 阻止浏览器的自动填充 --> <input type"text" name"_prevent_auto_co…

[css3] 如何设置边框颜色渐变

div {border: 4px solid;border-image: linear-gradient(to right, #8f41e9, #578aef) 1; }参考&#xff1a; 5种CSS实现渐变色边框&#xff08;Gradient borders方法的汇总

【Python】探索 Python 中的 divmod 方法

为何每次早餐 仍然魂离魄散 原来 那朝分手都要啜泣中上班 明明能够过得这关 赢回旁人盛赞 原来 顽强自爱这样难 难得的激情总枉费 残忍的好人都美丽 别怕 你将无人会代替 &#x1f3b5; 陈慧娴《情意结》 在 Python 编程中&#xff0c;经常需要同时获取除…

如何通过smtp设置使ONLYOFFICE协作空间服务器可以发送注册邀请邮件

什么是ONLYOFFICE协作空间 ONLYOFFICE协作空间&#xff0c;是Ascensio System SIA公司出品的&#xff0c;基于Web的&#xff0c;开源的&#xff0c;跨平台的&#xff0c;在线文档编辑和协作的解决方案。在线Office包含了最基本的办公三件套&#xff1a;文档编辑器、幻灯片编辑…

FPGA实验1:简单逻辑电路

一、实验目的及要求 学习Create-SOPC实验平台的使用方法&#xff1b;熟悉Quartus II 软件平台和使用 VHDL 语言设计电路的方法&#xff1b;学习简单逻辑电路的设计、仿真和硬件测试。 二、实验原理 运用Quartus II 集成环境下的VHDL文本设计方法设计半加器&#xff0c;进行波…

LInux工具(2)

目录 1.关于底行模式的一个设置 1.1设置行号 1.2取消行号 2.简单vim配置 2.1简单认识 2.2配置选项 2.3其他说明 3.库的引入 3.1背景知识 3.2对应指令 3.3相关介绍 3.4.o文件和库的链接 3.5静态库的安装和测试 3.6动静态库对比 1.关于底行模式的一个设置 1.1设置行…

黑马点评-Postman卡住sending Requst原因解决

不知道为什么&#xff0c;用这个c1e1d5的token就会一直卡死&#xff0c;但是换了一个token就解决了&#xff0c;目前不知道为什么 解决了&#xff0c;原来是这个请求下面的函数发生了死循环&#xff01;&#xff01;太瓜皮了我超&#xff01; 把num写成了count&#xff0c;导…

函数(递归)

递归&#xff1a;程序调用自身编程技巧称为递归。 在学习递归前需要粗略的了解一下内存&#xff0c;内存分为三类&#xff0c;分别是栈区、堆区和静态区。对于栈区来说&#xff0c;每调用一次函数都会为本次函数开辟一块空间&#xff0c;然而栈区也是有空间限制的&#xff0c;随…

Golang | Leetcode Golang题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; func isAnagram(s, t string) bool {if len(s) ! len(t) {return false}cnt : map[rune]int{}for _, ch : range s {cnt[ch]}for _, ch : range t {cnt[ch]--if cnt[ch] < 0 {return false}}return true }

Temporal-Kit 及 Ebsynth-流程

https://www.youtube.com/watch?vBL77HVIviJM 预处理 Ebsynth-流程

全国区块链职业技能大赛第八套区块链产品需求分析与方案设计

任务1-1:区块链产品需求分析与方案设计 医疗健康平台中涉及到医院、医生、患者等参与方,他们需要在区块链医疗健康平台中完成账户注册、身份上链、挂号就诊、查询病例等多种业务活动。通过对业务活动的功能分析,可以更好的服务系统的开发流程。基于医疗健康平台系统架构,以…

PyTorch实战:深度解析Tensor归一化技巧与应用

PyTorch Tensor 归一化&#xff1a;理解、应用及实现 在机器学习和深度学习中&#xff0c;数据预处理是一个关键的步骤。其中&#xff0c;对于某些情况下&#xff0c;特别是生产的环境&#xff0c;数据归一化是一项必不可少的任务。 在 PyTorch 中&#xff0c;对于 Tensor 的…

【SpringBoot配置文件application.yaml】笔记

详细内容见官方文档Common Application Properties 使用application.yaml进行简单配置 第一步&#xff1a;创建WebDemo第二步&#xff1a;创建application.yaml配置文件注意&#xff1a; 第三步&#xff1a;验证自己创建的yaml文件是否生效测试&#xff1a;思考&#xff1a;如…

算法刷题笔记 八数码(C++实现)

文章目录 题目描述基本思路实现代码 题目描述 在一个33的网格中&#xff0c;1∼8这8个数字和一个x恰好不重不漏地分布在这33的网格中。例如&#xff1a; 1 2 3 x 4 6 7 5 8 在游戏过程中&#xff0c;可以把x与其上、下、左、右四个方向之一的数字交换&#xff08;如果存在&…

MT7628指定分区备份固件

为了避免升级过程突然断电&#xff0c;或者其他不良操作导致的路由器“变砖”。在MT7628使用过程中&#xff0c;我们可以对固件进行备份。 MT7628原厂SDK有关于双备份的选项&#xff0c;选择对应选项后&#xff0c;可对固件进行备份。下面以SKYLAB的SKW92A模组为例进行测试说明…

【专项刷题】— 快排

1、颜色分类 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 创建三个指针&#xff0c;然后把数组分为三个区域遍历代码&#xff1a; class Solution {public void swap(int[] nums, int i, int j){int t nums[i];nums[i] nums[j];nums[j] t;}public void sortCo…