SpringCloud学习路线(7)—— 统一网关Gateway

news2024/11/25 18:52:25

一、引言

(一)需求: 服务器中的微服务只允许内部人员调用或是内网人员进行调用,拒绝外网人员访问。

(二)如何实现需求? 网关

(三)网关的功能

  • 身份认证和权限校验
  • 服务路由、负载均衡
  • 请求限流

(四)网关的技术实现

SpringCloud提供了两种网关实现方式:

  • SpringCloudGateway,基于Spring5中提供的WebFlux,是响应式编程的实现,拥有更好的性能。
  • zuul —— 基于Servlet实现,属于阻塞式编程。

二、Gateway的基本使用

(一)搭建网关服务

1、常见新的模块,引入SpringCloudGateway的依赖和nacos服务发现依赖

<!--网关依赖-->
<dependency>
	<groupId>org.springframework.cloud</gourpId>
	<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
	<groupId>com.alibaba.cloud</gourpId>
	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、创建网关服务

@SpringBootApplication
public class GatewayApplication{
	public static void main(String[] args) {
		SpringApplicaiton.run(GatewayApplication.class,args);
	}
}

3、实现网关路由

配置路由配置

server:
	port: 10010 #网关端口
spring:
	application:
		name: gateway #服务名称
	cloud:
		nacos:
			server-addr: localhost:8848 #nacos地址
		gateway:
			routes: #网关路由配置
				- id: user-service #路由id,自定义只要唯一即可
				  # uri: http://127.0.0.1:8081 #路由的目标地址 http是固定地址
				  uri: lb://userservice #路由目标地址,lb是负载均衡,后面是服务名称
				  predicates: # 路由断言,判断请求是否符合路由规则的条件
					- Path=/user/** # 这个是按照路径匹配,只要以 /user/ 开头就符合要求

总结:

  • 如何配置网关
    • 引入网关依赖,nacos服务发现依赖
    • 配置application,包含服务基本信息,nacos地址,路由
  • 路由配置
    • id:路由唯一标识
    • uri:路由目的地,支持lb和http两种
    • predicates:路由断言,判断请求是否符合要求符合则转发到路由目的地
    • filters: 路由过滤器,处理请求和相应

三、断言工厂 Route Predicate Factory

(一)使用断言工厂的目的

配置文件中的断言规则仅字符串,这些字符串终究会被Predicate Factory读取并处理,转变为路由判断的条件。

(二)Spring提供的基本断言工厂

名称说明示例
After
是某个时间点后的请求
- After=2037-01-20T17:42:47.489-07:00[America/denver]
Before
是某个时间点前的请求
- Before=2037-01-20T17:42:47.489-07:00[America/denver]
Between
是某两个时间点前的请求
- Between=2037-01-20T17:42:47.489-07:00[America/denver], 2099-01-20T17:42:47.489-07:00[America/denver]
Cookie
请求必须包含某些cookie
- Cookie=chocolate, ch.p
Header
请求必须包含某些Header
- Header=X-Request-id,\d+
Host
请求必须是访问某个host(域名)
- Host=**.somehost.org,**.anotherhost.org
Method
请求方式必须是指定方式
- Method=GET,POST
Path(常用)
请求路径必须符合指定规则
- Path= /red/(segment),/blue/**
Query
请求参数必须包含指定参数
- Query=name.jack 或者 -Query=name
RemoteAddr(常用)
请求者IP必须是指定范围
- RemoteAddr=192.168.1.1/24
Weight
权重处理

(三)总结

  • PredicateFactory的作用是什么?
    读取用户定义的断言条件,对请求做出判断
  • Path=user/**的含义?
    路径以/user/开头的就认为是符合的

四、过滤器工厂

(一)路由过滤器 GatewayFilter

GatewayFilter是网关中一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。

在这里插入图片描述

(二)常用的过滤器工厂

Spring提供了31种不同的路由过滤器工厂。

常用过滤器工厂表

名称说明
AddRequestHeader给当前请求添加一个请求头
RemoveRequestHeader移除请求中的一个请求头
AddResponseHeader给响应结果中添加一个响应头
RemoveResponseHeader从响应结果移除一个响应头
RequestRateLimiter限制请求流量

(三)总结

  • 过滤器的作用?
    • 对路由的请求或响应做加工
    • 配置在路由下的过滤器只对当前路由的请求生效
  • defaultFilters的作用是什么?
    • 对所有路由都生效的过滤器

五、全局过滤器

(一)全局过滤器GlobalFilter

全局过滤器的作用是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一致。

全局过滤器相对于Gateway的区别是什么?
GatewayFilter通过配置定义,处理逻辑固定。
GlobalFilter的逻辑通过代码实现。

(二)实现GlobalFilter

通过实现 GlobalFilter 进行完成。

public interface GlobalFilter{
	/**
	* 处理当前请求,有必要的话通过{@link GatewayFilterChain}将请求交给下一个过滤器处理
	* @param exchange 请求上下文,里面可以获取Request、Response等信息
	* @param chain 用来把请求委托给下一个过滤器
	* @return {@code Mono<Void>} 返回标识当前过滤器业务结束
	* */
	Mono<Void> filter(ServerWevExchange exchange, GatewayFilterChain chain);
}

(三)示例

@Order(-1)
@Component
public class AuthorizeFilter implements GlobalFilter {
	@Override
	Mono<Void> filter(ServerWevExchange exchange, GatewayFilterChain chain){
		//1、获取请求参数
		ServerHttpRequest = exchange.getRequest();
		MultiValueMap<String,String> params = request.getQueryParams();
		//2、获取参数中的 authorization 参数
		String auth = params.get("authorization "):
		//3、判断参数值是否为admin
		if("admin".equals(auth)){
			//4、若是则放行
			return chain.filter(exchange);
		}
		//5、若否则设置状态码并拦截
		exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
		return exchange.getResponse().setComplete();
	}
}

(四)总结

  • 全局过滤器的作用是什么?
    对所有路由都生效的过滤器,并且可以自定义处理逻辑
  • 实现全局过滤器的步骤?
    • 实现GlobalFilter接口
    • 添加@Order注解或实现Ordered接口
    • 编写处理逻辑

六、过滤器的执行顺序

目前学习到的网关过滤器:当前路由过滤器DefaultFilterGlobalFilter

在这里插入图片描述

(一)过滤器能够进行排序执行的原因

所有的过滤器都会通过 AddRequestHeaderGatewayFilterFactory 类进行适配,适配的结果都是GatewayFilter,所会所有的过滤器都能进行排序执行。

(二)过滤器排序规则

  • 每一个过滤器都必须指定int类型的order值,order值越小,优先级越高,执行顺序越靠前
  • GlobalFilter通过实现ordered接口,或者添加Order注解来指定order值。
  • 路由过滤器和defaultFilter的order由Spring指定,默认按照声明顺序从1递增。
  • 当过滤器的order值一样时,按照DefaultFilter > 路由过滤器 > GlobalFilter的顺序执行。

七、跨域问题

(一)跨域问题是什么?

域名不一致就是跨域,主要包括:

  • 域名不同,www.taobao,com——www.taobao.org 或 www.jd.com——miaosha.jd.com。
  • 端口不同,localhost:8080——localhost:8081。

(二)跨域问题产生的原因

浏览器禁止请求发起者与服务端发生跨域Ajax请求,请求被浏览器拦截。

(三)解决方案:CORS

配置CORS方案

spring:
	cloud:
		gateway:
			globalcors: #全局的跨域处理
				add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
				corsConfigurations:
					'[/**]':
						allowedOrigins: #允许地址请求
							- “http://localhost:8090”
							-  "http://www.leyou.com"
						allowedMethods: # 允许跨域ajax的请求方式
							- "GET"
							- "POST"
							- "DELETE"
							- "PUT"
							- "OPTIONS"
						allowedHeaders: "*" # 允许在请求中携带的头信息
						allowedCredentials: true # 是否允许携带Cookie
						maxAge: 360000 # 跨域检测的有效期

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

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

相关文章

十八、Unity游戏引擎入门

1、下载 首先需要下载Unity Hub,下载网址:https://unity.com/cn。 然后在其中下载Unity编辑器并安装,可选择最新版本。 接着需要选择适合的开发环境,例如Android Studio或Xcode,以便进行手机游戏开发。在安装完Unity后,需要根据项目需求下载对应的模块和插件…

实训笔记7.19

实训笔记7.19 7.19一、座右铭二、Hadoop的HDFS分布式文件存储系统的相关原理性内容2.1 HDFS上传数据的流程2.2 HDFS下载数据的流程2.3 HDFS中NameNode和SecondaryNameNode工作机制&#xff08;涉及到HDFS的元数据管理操作&#xff09;2.4 HDFS中NameNode和DataNode的工作机制&a…

【C++】仿函数(less)

C中的仿函数 class Solution { public:struct cmp{bool operator()(const pair<string,int>&kv1,const pair<string,int>&kv2){if(kv1.second<kv2.second) return true;if(kv1.secondkv2.second&&kv1.first>kv2.first) return true;return …

JavaWeb01-Servlet-thymeleaf-mvd-dispatcher-controller

Servlet: servlet的基本作用 第一个servlet程序&#xff1a; //演示servlet的生命周期 public class Demo02Servlet extends HttpServlet {Overridepublic void init() throws ServletException {System.out.println("正在初始化。。。");}Overrideprotected void …

实例019 以图形按钮显示的界面

实例说明 菜单和工具栏虽然能方便用户操作程序的相应功能&#xff0c;但各有缺点。如果采用按钮式功能菜单&#xff0c;不但美观大方&#xff0c;而且操作灵活。当单击按钮时&#xff0c;用户区将显示相应的操作按钮组。下面介绍图形界面式菜单的设计方法。运行本例&#xff0…

【个人笔记】linux命令之cd

cd命令 cd&#xff08;英文全拼&#xff1a;change directory&#xff09;命令用于改变当前工作目录的命令&#xff0c;切换到指定的路径。 若目录名称省略&#xff0c;则变换至使用者的 home 目录 (也就是刚 login 时所在的目录)。 另外&#xff0c;~ 也表示为 home 目录 的…

恢复配置并减少网络停机时间

随着众多公司努力在商业世界中崭露头角&#xff0c;拥有可靠的 IT 基础架构比以往任何时候都更加重要。组织需要维护一个稳定的网络环境&#xff0c;避免不合时宜的网络中断以及网络连接中断、声誉受损、应用程序不可用和数据丢失。 Network Configuration Manager 提供了一种…

Debian 12上如何关闭nobody共享文件夹,一个能让INSCODE AI 创作助手不知所措的小问题

这个问题之前在Debian 10和11上都没有遇到过&#xff0c;换上Debian 12后Samba的设置就出现了状况&#xff0c;装上Samba后什么都没有设置就在局域网可以看到&#xff1a; 根据之前的经验在/etc/samba/smb.conf里查了很久也没有看出所以然来&#xff0c;后来又问了INSCODE AI…

ubuntu打开usb摄像头

文章目录 前言一、识别 usb 摄像头二、安装应用程序显示摄像头捕捉到的视频1、使用应用程序茄子&#xff08;cheese&#xff09;2、运行 cheese 捕捉视频 总结 前言 记录一下解决在 Linux 下打开 usb 摄像头界面黑屏的问题。 一、识别 usb 摄像头 1、保持在 ubuntu 界面&…

软件测试用例的八大步骤你都知道吗?

目录 第一步、UI体验测试 第二步、功能完整性测试 第三步、业务流程测试 第四步、容错机制测试 第五步、常规性测试 第六步、性能测试 第七步、交互体验测试 第八步、兼容性测试 总结&#xff1a; 第一步、UI体验测试 1.风格、样式、颜色是否协调 2. 界面布局是否整齐、…

【网站搭建】3 更换博客主题—butterfly

可以到官网选择想要更换的主题Themes | Hexo 我选用的是butterflyzhangzeli/hexo-theme-butterfly: A Hexo Theme: Butterfly (github.com) 在Hexo根目录打开终端执行拉去操作 下载配套文件 npm install hexo-renderer-pug hexo-renderer-stylus 打开_config.yml文件&#xf…

二维费用背包(既有最大体积限制,又多加了一个最大重量限制)

1:分析状态转移方程式 2:ACcode: #include<bits/stdc.h> using namespace std; const int N1e310; int f[N][N],v[N],w[N],m[N]; void solve() {int a,b,c;cin>>a>>b>>c;for(int i1; i<a; i) cin>>v[i]>>m[i]>>w[i];//酷似01背…

数仓虚拟化技术:PieCloudDB 通过中国信通院 2023 「可信数据库」性能评测的强力支撑...

“可信数据库”是国内首个数据库的评测体系&#xff0c;被业界广泛认可为产品能力重要的衡量标准之一。PieCloudDB 在该评测中展现出卓越的数据处理速度、稳定性和可扩展性&#xff0c;为用户提供了强大的数据分析和查询能力。 6 月 15 ~ 16 日&#xff0c;中国信通院 2023 上…

vue3笔记-脚手架篇

第一章 基础篇 第二章 脚手架篇 vue2与vue3的一些区别 响应式系统&#xff1a; Vue 2 使用 Object.defineProperty 进行响应式数据的劫持和监听&#xff0c;它对数据监听是一项项的进行监听&#xff0c;因此&#xff0c;当新增属性发生变化时&#xff0c;它无法监测到&…

0719_rasa网站的一些介绍

it’s not a bot, it’s your brand rasa is the leading open generative conversational ai platform for creating and managing ai assistants at scale. learn more talk with sales top enterprises trust rasa american express adobe dell accenture report ho…

使用Canal同步mysql数据到es

一、简介 Canal主要用途是基于 MySQL 数据库增量日志解析&#xff0c;提供增量数据订阅和消费。 当前的 canal 支持源端 MySQL 版本包括 5.1.x , 5.5.x , 5.6.x , 5.7.x , 8.0.x 二、工作原理 MySQL主备复制原理 MySQL master 将数据变更写入二进制日志( binary log, 其中记…

一篇文章带你用Jenkins和Kubernetes搭建DevOps平台

JenkinsKubernetes实现DevOps DevOps 介绍Jenkins环境准备准备JDK下载jdk安装jdk配置jdk环境变量 准备maven下载maven解压maven配置maven配置maven环境变量 安装Docker安装git 安装Jenkins初始化jenkins准备代码仓库和docker镜像仓库准备Kubernetes准备java项目搭建DevOps创建代…

ENSP实验一:防火墙基础配置

1、搭建拓扑图 配置client&#xff08;内网&#xff09;、FTP Server&#xff08;外网&#xff09;的IP地址 客户端设置&#xff1a; 服务端设置&#xff1a; 2、配置防火墙命名 进入防火墙&#xff0c;输入密码&#xff1a;默认为admin123 <USG6000V1>system-view /…

埃科光电在科创板上市:同创伟业、毅达资本为股东,实控人为董宁

7月19日&#xff0c;合肥埃科光电科技股份有限公司&#xff08;下称“埃科光电”&#xff0c;SH:688610&#xff09;在上海证券交易所科创板上市。本次上市&#xff0c;埃科光电的发行价为73.33元/股&#xff0c;发行数量为1700万股&#xff0c;募资总额约为12.47亿元&#xff…

Flutter 单线程模型保证UI运行流畅

Flutter 框架出色的渲染和交互能力。支撑起这些复杂的能力背后&#xff0c;实际上是基于单线程模型的 Dart。那么&#xff0c;与原生 Android 和 iOS 的多线程机制相比&#xff0c;单线程的 Dart 如何从语言设计层面和代码运行机制上保证 Flutter UI 的流畅性呢&#xff1f; 因…