java_使用Spring Cloud Gateway + nacos实现跨域访问

Spring Cloud Gateway简介

Spring cloud gateway是spring官方基于Spring 5.0、Spring Boot2.0和Project Reactor等技术开发的网关,Spring Cloud Gateway旨在为微服务架构提供简单、有效和统一的API路由管理方式,Spring Cloud Gateway作为Spring Cloud生态系统中的网关,目标是替代Netflix Zuul,其不仅提供统一的路由方式,并且还基于Filter链的方式提供了网关基本的功能,例如:安全、监控/埋点、限流等。

Spring Cloud Gateway核心概念

网关提供API全托管服务,丰富的API管理功能,辅助企业管理大规模的API,以降低管理成本和安全风险,包括协议适配、协议转发、安全策略、防刷、流量、监控日志等贡呢。一般来说网关对外暴露的URL或者接口信息,我们统称为路由信息。如果研发过网关中间件或者使用过Zuul的人,会知道网关的核心是Filter以及Filter Chain(Filter责任链)。Sprig Cloud Gateway也具有路由和Filter的概念。下面介绍一下Spring Cloud Gateway中几个重要的概念。

(1)路由。路由是网关最基础的部分,路由信息有一个ID、一个目的URL、一组断言和一组Filter组成。如果断言路由为真,则说明请求的URL和配置匹配

(2)断言。Java8中的断言函数。Spring Cloud Gateway中的断言函数输入类型是Spring5.0框架中的ServerWebExchange。Spring Cloud Gateway中的断言函数允许开发者去定义匹配来自于http request中的任何信息,比如请求头和参数等。

(3)过滤器。一个标准的Spring webFilter。Spring cloud gateway中的filter分为两种类型的Filter,分别是Gateway Filter和Global Filter。过滤器Filter将会对请求和响应进行修改处理

如图所示,Spring cloud Gateway发出请求。然后再由Gateway Handler Mapping中找到与请求相匹配的路由,将其发送到Gateway web handler。Handler再通过指定的过滤器链将请求发送到实际的服务执行业务逻辑,然后返回。

应用

1. 创建service_gateway模块

2. 在pom.xml引入依赖: nacos 和 gateway

        <!--服务注册--><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-gateway</artifactId></dependency>

3. 编写配置文件

application.yml

spring:application:name: server-gatewayprofiles:active: dev

application-dev.yml

server:port: 8200 #自定义的端口号
​
spring:cloud:gateway:discovery:locator:enabled: true #启用gatewayroutes:- id: service-acl  #自己定义的服务的名称uri: lb://service-aclpredicates:- Path=/*/acl/**  #自己定义的服务的地址中含有的路径关键字符串,下同
​- id: service-sysuri: lb://service-syspredicates:- Path=/*/sys/**
​- id: service-producturi: lb://service-productpredicates:- Path=/*/product/**
​- id: service-activityuri: lb://service-activitypredicates:- Path=/*/activity/**
​- id: service-orderuri: lb://service-orderpredicates:- Path=/*/order/**
​- id: service-paymenturi: lb://service-paymentpredicates:- Path=/*/payment/**
​- id: service-useruri: lb://service-userpredicates:- Path=/*/user/**
​- id: service-searchuri: lb://service-searchpredicates:- Path=/*/search/**
​- id: service-homeuri: lb://service-homepredicates:- Path=/*/home/**
​- id: service-carturi: lb://service-cartpredicates:- Path=/*/cart/**

4. 编写启动类

package com.atguigu.ssyx;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
public class ServiceGatewayApplication {public static void main(String[] args) {SpringApplication.run(ServiceGatewayApplication.class, args);}}

5. 网关相关配置

网关解决跨域问题

跨域不一定都会有跨域问题。因为跨域问题是浏览器对于ajax请求的一种安全限制:一个页面发起的ajax请求,只能是与当前页域名相同的路径,这能有效的阻止跨站攻击。因此:跨域问题 是针对ajax的一种限制。

但是这却给我们的开发带来了不便,而且在实际生产环境中,肯定会有很多台服务器之间交互,地址和端口都可能不同。

创建配置类

package com.atguigu.ssyx.config;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.cors.CorsConfiguration;
import org.springframework.web.cors.reactive.CorsWebFilter;
import org.springframework.web.cors.reactive.UrlBasedCorsConfigurationSource;
import org.springframework.web.util.pattern.PathPatternParser;@Configuration
public class CorsConfig {@Bean// CorsWebFilter 是 Spring Framework 中// 用于处理跨源资源共享(CORS, Cross-Origin Resource Sharing)的过滤器public CorsWebFilter corsFilter() { //网关过滤器,写法基本是固定的CorsConfiguration config = new CorsConfiguration();//表示允许所有 HTTP 方法(如 GET、POST、PUT、DELETE 等)通过跨域请求。"*" 表示所有方法都被允许。config.addAllowedMethod("*");// 允许所有来源的跨域请求。"*" 表示任何来源的请求都可以被接受。如果只想允许特定域名的请求,可以替换 * 为相应的 URL。config.addAllowedOrigin("*");// 允许所有请求头通过跨域请求。"*" 表示所有的头部字段都被允许。如果想限制某些头部字段,可以指定具体的头部名称。config.addAllowedHeader("*");// 创建一个 UrlBasedCorsConfigurationSource 对象,用于存储和管理不同 URL 路径的 CORS 配置。// new PathPatternParser() 是 Spring 5+ 引入的新方式来解析 URL 路径。// 之前可以使用传统的 AntPathMatcher 来匹配路径,但这里使用了新的解析方式。UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());// 将前面配置的 CorsConfiguration 注册到 UrlBasedCorsConfigurationSource 中,// 指定这个配置适用于所有路径(/**,即所有 URL)。这意味着所有的请求都将使用上面定义的 CORS 策略。source.registerCorsConfiguration("/**", config);return new CorsWebFilter(source);}
}

 目前我们已经在网关做了跨域处理,那么service服务就不需要再做跨域处理了,将之前在controller类上添加过@CrossOrigin标签的去掉,防止程序异常.。示例如下:

6. 修改前端路径

修改.env.development 文件,修改为网关路径

# just a flag
ENV = 'development'
​
# base api
# VUE_APP_BASE_API = '/dev-api'
# 修改为网关路径
VUE_APP_BASE_API = 'http://localhost:8200' #  8200为自定义的路径

 参考:68 尚上优选项目-平台管理端-整合Gateway网关_哔哩哔哩_bilibili

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

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

相关文章

Linux中安装open-webui报sqlite版本低的解决办法

almalinux中安装好open-webui&#xff0c;启动服务时报如下错&#xff1a; RuntimeError: [91mYour system has an unsupported version of sqlite3. Chroma requires sqlite3 > 3.35.0.[0m [94mPlease visit https://docs.trychr…

基于SpringBoot+Vue的老年人体检管理系统的设计与实现(源码+SQL脚本+LW+部署讲解等)

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

【AI视频】Runway注册、基本设置、主界面详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: AI视频 | Runway 文章目录 &#x1f4af;前言&#x1f4af;Runway的正确启动方式推荐使用Google Chrome打开Chrome翻译 &#x1f4af;Runway的注册&#x1f4af;My Account&#xff08;我的账户&#xff09;General&a…

大数据的特点

高速、多样性、大量、低价值密度 大数据的应用场景 视频推荐&#xff0c;电商推荐&#xff0c;零售&#xff0c;金融 发展脉络 1.单机时代 2.大数据时代-分布式处理 Hadoop的优势 高可靠性、高拓展性、高效性、 高容错性

P8752 [蓝桥杯 2021 省 B2] 特殊年份——string提取索引转换为值

这里写目录标题 链接题目代码大佬解答string提取索引转换为值 链接 P8752 [蓝桥杯 2021 省 B2] 特殊年份 题目 代码 #include <iostream> #include <vector> #include <string> #include <algorithm> #include <math.h> #include <queue&g…

使用SHOW PROCESSLIST和SHOW ENGINE INNODB STATUS排查mysql锁等待问题

现象&#xff1a; mysql 查某表一直不能结束&#xff0c;查别的表没有问题。已知之前刚刚alter此表想把它的一个字段长度增长&#xff0c;但是这个操作一直没有结束。现在应该怎么办? 方案: 使用 SHOW PROCESSLIST; 查看当前所有活动的SQL线程&#xff0c;找出是否有长时间…

Unity UI个人总结

个人总结&#xff0c;太简单的直接跳过。 一、缩放模式 1.固定像素大小 就是设置一个100x100的方框&#xff0c;在1920x1080像素下在屏幕中长度占比1/19&#xff0c;在3840x2160&#xff0c;方框在屏幕中长度占比1/38。也就是像素长款不变&#xff0c;在屏幕中占比发生变化 2.…

Jmeter如何计算TPS

1.在jmeter中计算出接口请求的个数 1175 1172 1172 174 200 416 384 1174 5867 2.计算接口平均响应时间 计算每个接口的请求次数乘以平均响应时间&#xff0c;所有接口相加&#xff0c;然后除以所有接口的数量总和&#xff0c;得到接口的平均响应时间 (1175*18191172*…

【R语言】回归分析与判别分析

一、线性回归分析 1、lm()函数 lm()函数是用于拟合线性模型&#xff08;Linear Models&#xff09;的主要函数。线性模型是一种统计方法&#xff0c;用于描述一个或多个自变量&#xff08;预测变量、解释变量&#xff09;与因变量&#xff08;响应变量&#xff09;之间的关系…

上线了一个微软工具(免费),我独自开发,本篇有源码

各位读者老爷们好。今天给大家推荐一个我刚上线微软商店的免费工具。 起因是有一些看似简单的文本处理功能,有时却很难找到针对性的工具。 比如我前几天有需求将一个巨大的TXT文件切割成多个指定大小的小TXT,却发现很难找到趁手的批量工具。 没有,那我就写一个。 python写…

vue elementui select下拉库组件鼠标移出时隐藏下拉框

方案&#xff1a; select 监听 mouseleave事件&#xff0c;当鼠标离开时通过唯一标识ref设置select 下拉框隐藏&#xff0c;并做失焦 <el-select v-model"value" :popper-append-to-body"false" class"select_drop_inner" size"s…

Docker 安装和配置 Nginx 详细图文教程

&#x1f680; 作者主页&#xff1a; 有来技术 &#x1f525; 开源项目&#xff1a; youlai-mall ︱vue3-element-admin︱youlai-boot︱vue-uniapp-template &#x1f33a; 仓库主页&#xff1a; GitCode︱ Gitee ︱ Github &#x1f496; 欢迎点赞 &#x1f44d; 收藏 ⭐评论 …

Golang学习笔记_34——组合模式

Golang学习笔记_31——原型模式 Golang学习笔记_32——适配器模式 Golang学习笔记_33——桥接模式 文章目录 一、核心概念1. 定义2. 解决的问题3. 核心角色4. 类图 二、特点分析三、适用场景1. 文件系统2. 图形界面3. 组织架构 四、代码示例&#xff08;Go语言&#xff09;五、…

LKT4202UGM新一代安全认证加密芯片,守护联网设备和服务安全

LKT4202UGM是提供身份验证、机密性和平台完整性服务的安全元件产品&#xff0c;可保护原始设备制造商免受克隆、伪造、恶意软件注入和未经授权生产的侵害。LKT安全元件经过最为严格的安全认证&#xff0c;可提供一站式解决方案。 为满足市场对LKT产品的需求&#xff0c;凌科芯…

人工智能之目标追踪DeepSort源码解读(yolov5目标检测,代价矩阵,余弦相似度,马氏距离,匹配与预测更新)

要想做好目标追踪,须做好目标检测,所以这里就是基于yolov5检测基础上进行DeepSort,叫它为Yolov5_DeepSort。整体思路是先检测再追踪,基于检测结果进行预测与匹配。 一.参数与演示 这里用到的是coco预训练人的数据集&#xff1a; 二.针对检测结果初始化track 对每一帧数据都输出…

网络安全不分家 网络安全不涉及什么

何为网络安全 信息安全是指系统的硬件、软件及其信息受到保护&#xff0c;并持续正常运行和服务。信息安全的实质是保护信息系统和信息资源免受各种威胁、干扰和破坏&#xff0c;即保证信息的安全性。 网络安全是指利用网络技术、管理和控制等措施&#xff0c;保证网络系统和…

【Spring+MyBatis】_图书管理系统(中篇)

【SpringMyBatis】_图书管理系统&#xff08;上篇&#xff09;-CSDN博客文章浏览阅读654次&#xff0c;点赞4次&#xff0c;收藏7次。&#xff08;1&#xff09;当前页的内容records&#xff08;类型为List&#xff09;&#xff1b;参数&#xff1a;userNameadmin&&pas…

利用acme.sh 申请 Google 免费证书

1.Google API权限准备 获取 EAB 密钥 ID 和 HMAC 登录你的 GCP 控制台面板&#xff0c;进入 Public Certificate Authority API 管理页面&#xff08;https://console.cloud.google.com/apis/library/publicca.googleapis.com&#xff09;点击启动&#xff1a; 或者直接在下一…

【基础架构篇十五】《DeepSeek权限控制:RBAC+ABAC混合鉴权模型》

某天深夜,电商平台运营总监误触按钮,把价值千万的优惠券设置成全员可领。当你想追究责任时,却发现系统日志写着"操作人:admin"。这血淋淋的事故告诉我们:权限控制不是选择题,而是生死攸关的必答题。本文将深挖DeepSeek的RBAC+ABAC混合鉴权体系,看看他们如何做…

Kafka

Kafka概念 https://kafka.apache.org/ Kafka是一种高吞吐量的分布式发布订阅消息系统&#xff0c;使用 Scala 语言编写。 producer通过网络发送消息到Kafka集群&#xff0c;然后consumer来进行消费&#xff0c;如下图&#xff1a; 服务端(brokers)和客户端(producer、consumer…