微服务学习-Gateway 统一微服务入口
1. 微服务为什么需要 API 网关?
1.1. 在微服务架构中,通常一个系统会被拆分为多个微服务,面对多个微服务客户端应该如何去调用呢?
如果根据每个微服务的地址发起调用,存在如下问题:
- 客户端多次请求不同的微服务,会增加客户端代码和配置的复杂性,维护成本比较高;
- 认证复杂,每个微服务可能存在不同的认证方式,客户端去调用,要去适配不同的认证;
- 存在跨域的请求,调用链有一定的相对复杂性(防火墙、浏览器不友好的协议);
- 难以重构,随着代码的迭代,可能需要重新划分微服务。
1.2. 为了解决以上问题,微服务引入了 API 网关的概念
API 网关为微服务架构的系统提供简单、有效且统一的 API 路由管理,作为系统的统一入口,提供内部服务的路由中转,给客户端提供统一的服务,可以实现一些和业务没有耦合的公共逻辑,主要功能包括:认证、鉴权、路由转发、安全策略、防刷、流量控制、监控日志等。
2. Spring Cloud Gateway 是什么?
官方文档:Spring Cloud Gateway :: Spring Cloud Gateway
Spring Cloud Gateway 是 Sprinig Cloud 官方推出的第二代网关框架,定位取代 Netflix Zuul。
Spring Cloud Gateway 旨在为微服务架构提供一种简单且有效的 API 路由的管理方式,并基于 Filter 的方式提供网关的基本功能,例如说安全认证、监控、限流等。
Spring Cloud Gateway 是有 WebFlux + Netty + Reactor 实现的响应式的 API 网关。它不能再传统的 Servlet 容器中工作,也不能构建成 war 包。
3. 微服务快速接入 Spring Cloud Gateway
3.1. 构建网关服务
3.1.1. 创建一个新的 module 模块 icoolkj-mall-gateway
- pom.xml 文件中引入 Spring Cloud Gateway 网关依赖
<dependencies><!-- gateway网关 --><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><!-- loadbalancer 负载均衡器依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-loadbalancer</artifactId></dependency></dependencies>
3.2. 微服务快速接入网关服务
3.2.1. 以订单服务为例
在网关服务配置 application.yml 文件
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848gateway:# 设置路由:路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/order/** # 断言,路径相匹配的进行路由
商品、库存、账户服务同上配置,网关服务的完整的 application.yml 配置如下:
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:discovery:server-addr: icoolkj-mall-nacos-server:8848gateway:# 设置路由:路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/order/** # 断言,路径相匹配的进行路由- id: product_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-product # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/product/** # 断言,路径相匹配的进行路由- id: inventory_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-inventory # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/inventory/** # 断言,路径相匹配的进行路由- id: account_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-account # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/account/** # 断言,路径相匹配的进行路由
优化:可以将 gateway 的配置移到 Nacos 配置中心
-
- 网关服务的 pom.xml 文件中引入 Nacos 配置中心依赖
<!-- nacos-config 配置中心依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
-
- Nacos 控制台创建 dataId 为 icoolkj-mall-gateway.yml,配置内容如下:
spring:cloud:gateway:# 设置路由:路由ID、路由到微服务的 uri、断言routes:- id: order_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-order # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/order/** # 断言,路径相匹配的进行路由- id: product_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-product # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/product/** # 断言,路径相匹配的进行路由- id: inventory_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-inventory # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/inventory/** # 断言,路径相匹配的进行路由- id: account_route # 路由ID,全局唯一,建议配置服务名uri: lb://icoolkj-mall-account # lb 整合负载均衡器 loadbalancerpredicates:- Path=/api/account/** # 断言,路径相匹配的进行路由
-
- 网关服务的 application.yml 调整引入 icoolkj-mall-gateway.yml 配置
server:port: 18888spring:application:name: icoolkj-mall-gatewaycloud:nacos:config:server-addr: icoolkj-mall-nacos-server:8848file-extension: yml # 指定配置文件扩展名为ymlconfig:import:- optional:nacos:${spring.application.name}.yml- nacos:nacos-discovery.yml
3.3. 启动网关服务,测试
postman 中通过网关服务的 18888 端口下单,看看能否成功。
icoolkj-mall-forntend 前端服务 order.html 中访问后端服务地址都替换成 icoolkj-mall-gateway:18888,测试下单是否成功。
4. Gateway 跨域资源共享配置
官方文档:Spring Cloud Gateway
4.1. 通过 yml 配置的方式
spring:cloud:gateway:globalcors:cors-configurations:'[/**]':allowedOrigins: "*"allowedMethods:- GET- POST- DELETE- PUT- OPTIONallowedHeaders: '*'
4.2. 通过 java 配置的方式
@Configuration
public class CorsConfig {@Beanpublic CorsWebFilter corsFilter() {CorsConfiguration config = new CorsConfiguration();// 允许的前端地址config.addAllowedOrigin("http://localhost:88"); // 只允许特定的前端地址// 允许所有 HTTP 方法(包括 GET)config.addAllowedMethod("*");// 允许所有请求头config.addAllowedHeader("*");// 设置允许带有凭证(如 Cookies)config.setAllowCredentials(true);UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();source.registerCorsConfiguration("/**", config); // 全局匹配所有请求路径return new CorsWebFilter(source);}
}
4.3. 发现问题
通过通过以上配置,后台接口可以访问,但是还是提示跨域。解决方案去除微服务内部的注解 @CrossOrigin
- 全局 CORS 配置放在网关服务中,这会确保跨域请求的集中管理,避免每个微服务都进行重复配置。
- 微服务内部的 CORS 配置一般不需要,除非某些微服务的接口有特殊需求,可以通过
@CrossOrigin
注解进行单独配置。 - 网关处理 CORS 后,微服务只需专注于业务逻辑,不必关注跨域问题,简化了微服务的开发和维护。
5. 小结
gateway 就是整个微服务架构的统一入口。
相关文章:

微服务学习-Gateway 统一微服务入口
1. 微服务为什么需要 API 网关? 1.1. 在微服务架构中,通常一个系统会被拆分为多个微服务,面对多个微服务客户端应该如何去调用呢? 如果根据每个微服务的地址发起调用,存在如下问题: 客户端多次请求不同的…...

2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点
文章目录 1.朴素二分查找的升级版2.查找左端点3.查找右端点4.代码的编写 1.朴素二分查找的升级版 和之前介绍的这个二分查找相比,我觉得这个区别就是我们的这个二分查找需要找到的是一个区间,而不是这个区间里面的某一个元素的位置; 2.查找…...
PHP语言的软件工程
PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支,它涉及软件的规划、开发、测试和维护。在现代开发中,PHP作为一种流行的服务器端脚本语言,广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...

linux-FTP服务配置与应用
也许你对FTP不陌生,但是你是否了解FTP到底是个什么玩意? FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为 “文传协议” 用于Internet上的控制文件的双向传输。同时,它也是一个应用程序…...

靠右行驶数学建模分析(2014MCM美赛A题)
笔记 题目 要求分析: 比较规则的性能,分为light和heavy两种情况,性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶(第一条)2. 无限制(去掉了第一条…...

(1)STM32 USB设备开发-基础知识
开篇感谢: 【经验分享】STM32 USB相关知识扫盲 - STM32团队 ST意法半导体中文论坛 单片机学习记录_桃成蹊2.0的博客-CSDN博客 USB_不吃鱼的猫丿的博客-CSDN博客 1、USB鼠标_哔哩哔哩_bilibili usb_冰糖葫的博客-CSDN博客 USB_lqonlylove的博客-CSDN博客 USB …...

Spring中如何动态的创建、监听MQ以及创建Exchange
文章目录 前言动态创建和管理Exchange、Queue动态消费Queue结论 前言 前面我们学习 RabbitMQ 的时候,都是在编译的时候就确定了Exchange、Queue,也就是说我们需要在程序启动之前就创建好需要的Exchange和Queue,但是实际使用的时候࿰…...

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)
原文链接: https://tecdat.cn/?p39061 在全球算力因数字化技术发展而竞争加剧,我国积极推进算力发展并将综合算力作为数字经济核心驱动力的背景下,该报告对我国综合算力进行研究。 中国算力大会发布的《中国综合算力指数(2024年…...

【Python项目】小区监控图像拼接系统
【Python项目】小区监控图像拼接系统 技术简介:采用Python技术、B/S框架、MYSQL数据库等实现。 系统简介:小区监控拼接系统,就是为了能够让业主或者安保人员能够在同一时间将不同地方的图像进行拼接。这样一来,可以很大程度的方便…...

常用排序算法之插入排序
目录 前言 一、基本原理 1.算法步骤 2.动画演示 3.插入排序的实现代码 二、插入排序的时间复杂度 1. 时间复杂度 1.最优时间复杂度 2.最差时间复杂度 3.平均时间复杂度 2. 空间复杂度 三、插入排序的优缺点 1.优点 2.缺点 四、插入排序的改进与变种 五、插入排…...
Elasticsearch(ES)基础查询语法的使用
1. Match Query (全文检索查询) 用于执行全文检索,适合搜索文本字段。 { “query”: { “match”: { “field”: “value” } } } match_phrase:精确匹配短语,适合用于短语搜索。 { “query”: { “match_phrase”: { “field”: “text” }…...

一篇文章学会Milvus【Docker 中运行 Milvus(Windows),Python实现对Milvus的操作,源代码案例,已经解决巨坑】【程序员猫爪】
一篇文章学会Milvus【Docker 中运行 Milvus(Windows),Python实现对Milvus的操作,源代码案例,已经解决巨坑】【程序员猫爪】 一、Milvus 是什么?【程序员猫爪】1、Milvus 是一种高性能、高扩展性的向量数据库…...

前端之移动端
视口 布局视口 layout viewport 视口(viewport)就是浏览器显示页面内容的屏幕区域。 视口可以分为布局视口、视觉视口和理想视口 一般移动设备的浏览器都默认设置了一个布局视口,用于解决早期的PC端页面在手机上显示的问题。 iOS, Androi…...

记一次 SpringBoot 启动慢的问题
记一次 SpringBoot 启动慢的问题 背景问题描述分析处理Flame Graph 火焰图Call Tree 调用树关键词检索尝试解决 为什么这样反向检索问题梳理 复盘处理流程为什么 Reference 背景 最近临时接了一个任务,就从一个旧 springboot 项目 copy 出来,临时写个服…...

高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接
文章目录 前言1. 开启群晖SFTP连接2. 群晖安装Cpolar工具3. 创建SFTP公网地址4. 群晖SFTP远程连接5. 固定SFTP公网地址6. SFTP固定地址连接 前言 随着远程办公和数据共享成为新常态,如何高效且安全地管理和传输文件成为了许多人的痛点。如果你正在寻找一个解决方案…...
如何在Python中进行JSON数据的序列化和反序列化?
在Python中,JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人阅读和编写,同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何…...

学习记录-统计记录场景下的Redis写请求合并优化实践
学习记录-使用Redis合并写请求来优化性能 1.业务背景 学习进度的统计功能:为了更精确的记录用户上一次播放的进度,采用的方案是:前端每隔15秒就发起一次请求,将播放记录写入数据库。但问题是,提交播放记录的业务太复杂了&#x…...

网站HTTP改成HTTPS
您不仅需要知道如何将HTTP转换为HTTPS,还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS? 与非安全HTTP于不同,安全域使用SSL(安全套接字层)服务器上的加密代…...
如何在龙蜥 OS(AliOS)上安装极狐GitLab?
本文分享如何在龙蜥操作系统(AliOS)(包括 RHCK 和 ANCK 两种,两种方式的安装流程一样)上安装极狐GitLab? 前提条件 一个安装了龙蜥操作系统的云服务器 可以查看 /etc/os-release中的信息,确认…...

unity插件Excel转换Proto插件-ExcelToProtobufferTool
unity插件Excel转换Proto插件-ExcelToProtobufferTool **ExcelToProtobufTool 插件文档****1. 插件概述****2. 默认配置类:DefaultIProtoPathConfig****属性说明** **3. 自定义配置类****定义规则****示例代码** **4. 使用方式****4.1 默认路径****4.2 自定义路径**…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明
LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造,完美适配AGV和无人叉车。同时,集成以太网与语音合成技术,为各类高级系统(如MES、调度系统、库位管理、立库等)提供高效便捷的语音交互体验。 L…...

日语AI面试高效通关秘籍:专业解读与青柚面试智能助攻
在如今就业市场竞争日益激烈的背景下,越来越多的求职者将目光投向了日本及中日双语岗位。但是,一场日语面试往往让许多人感到步履维艰。你是否也曾因为面试官抛出的“刁钻问题”而心生畏惧?面对生疏的日语交流环境,即便提前恶补了…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
React Native 开发环境搭建(全平台详解)
React Native 开发环境搭建(全平台详解) 在开始使用 React Native 开发移动应用之前,正确设置开发环境是至关重要的一步。本文将为你提供一份全面的指南,涵盖 macOS 和 Windows 平台的配置步骤,如何在 Android 和 iOS…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
Qt Http Server模块功能及架构
Qt Http Server 是 Qt 6.0 中引入的一个新模块,它提供了一个轻量级的 HTTP 服务器实现,主要用于构建基于 HTTP 的应用程序和服务。 功能介绍: 主要功能 HTTP服务器功能: 支持 HTTP/1.1 协议 简单的请求/响应处理模型 支持 GET…...
Unit 1 深度强化学习简介
Deep RL Course ——Unit 1 Introduction 从理论和实践层面深入学习深度强化学习。学会使用知名的深度强化学习库,例如 Stable Baselines3、RL Baselines3 Zoo、Sample Factory 和 CleanRL。在独特的环境中训练智能体,比如 SnowballFight、Huggy the Do…...
大数据学习(132)-HIve数据分析
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言Ǵ…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...