当前位置: 首页 > news >正文

微服务学习-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 配置中心

    1. 网关服务的 pom.xml 文件中引入 Nacos 配置中心依赖
<!-- nacos-config 配置中心依赖 -->
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
    1. 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/** # 断言,路径相匹配的进行路由

    1. 网关服务的 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 网关&#xff1f; 1.1. 在微服务架构中&#xff0c;通常一个系统会被拆分为多个微服务&#xff0c;面对多个微服务客户端应该如何去调用呢&#xff1f; 如果根据每个微服务的地址发起调用&#xff0c;存在如下问题&#xff1a; 客户端多次请求不同的…...

2025寒假备战蓝桥杯02---朴素二分查找升级版本的学习+分别求解左右端点

文章目录 1.朴素二分查找的升级版2.查找左端点3.查找右端点4.代码的编写 1.朴素二分查找的升级版 和之前介绍的这个二分查找相比&#xff0c;我觉得这个区别就是我们的这个二分查找需要找到的是一个区间&#xff0c;而不是这个区间里面的某一个元素的位置&#xff1b; 2.查找…...

PHP语言的软件工程

PHP语言的软件工程 引言 软件工程是计算机科学中的一个重要分支&#xff0c;它涉及软件的规划、开发、测试和维护。在现代开发中&#xff0c;PHP作为一种流行的服务器端脚本语言&#xff0c;广泛应用于网页开发和各种企业应用中。本文将深入探讨PHP语言在软件工程中的应用&am…...

linux-FTP服务配置与应用

也许你对FTP不陌生&#xff0c;但是你是否了解FTP到底是个什么玩意&#xff1f; FTP 是File Transfer Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为 “文传协议” 用于Internet上的控制文件的双向传输。同时&#xff0c;它也是一个应用程序…...

靠右行驶数学建模分析(2014MCM美赛A题)

笔记 题目 要求分析&#xff1a; 比较规则的性能&#xff0c;分为light和heavy两种情况&#xff0c;性能指的是 a.流量与安全 b. 速度限制等分析左侧驾驶分析智能系统 论文 参考论文 两类规则分析 靠右行驶&#xff08;第一条&#xff09;2. 无限制&#xff08;去掉了第一条…...

(1)STM32 USB设备开发-基础知识

开篇感谢&#xff1a; 【经验分享】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 的时候&#xff0c;都是在编译的时候就确定了Exchange、Queue&#xff0c;也就是说我们需要在程序启动之前就创建好需要的Exchange和Queue&#xff0c;但是实际使用的时候&#xff0…...

中国综合算力指数(2024年)报告汇总PDF洞察(附原数据表)

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

【Python项目】小区监控图像拼接系统

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

常用排序算法之插入排序

目录 前言 一、基本原理 1.算法步骤 2.动画演示 3.插入排序的实现代码 二、插入排序的时间复杂度 1. 时间复杂度 1.最优时间复杂度 2.最差时间复杂度 3.平均时间复杂度 2. 空间复杂度 三、插入排序的优缺点 1.优点 2.缺点 四、插入排序的改进与变种 五、插入排…...

Elasticsearch(ES)基础查询语法的使用

1. Match Query (全文检索查询) 用于执行全文检索&#xff0c;适合搜索文本字段。 { “query”: { “match”: { “field”: “value” } } } match_phrase&#xff1a;精确匹配短语&#xff0c;适合用于短语搜索。 { “query”: { “match_phrase”: { “field”: “text” }…...

一篇文章学会Milvus【Docker 中运行 Milvus(Windows),Python实现对Milvus的操作,源代码案例,已经解决巨坑】【程序员猫爪】

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

前端之移动端

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

记一次 SpringBoot 启动慢的问题

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

高效安全文件传输新选择!群晖NAS如何实现无公网IP下的SFTP远程连接

文章目录 前言1. 开启群晖SFTP连接2. 群晖安装Cpolar工具3. 创建SFTP公网地址4. 群晖SFTP远程连接5. 固定SFTP公网地址6. SFTP固定地址连接 前言 随着远程办公和数据共享成为新常态&#xff0c;如何高效且安全地管理和传输文件成为了许多人的痛点。如果你正在寻找一个解决方案…...

如何在Python中进行JSON数据的序列化和反序列化?

在Python中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;易于人阅读和编写&#xff0c;同时也易于机器解析和生成。Python内置的json模块提供了简单易用的方法来实现数据的序列化和反序列化。下面将详细介绍如何…...

学习记录-统计记录场景下的Redis写请求合并优化实践

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

网站HTTP改成HTTPS

您不仅需要知道如何将HTTP转换为HTTPS&#xff0c;还必须在不妨碍您的网站自成立以来建立的任何搜索排名权限的情况下进行切换。 为什么应该从HTTP转换为HTTPS&#xff1f; 与非安全HTTP于不同&#xff0c;安全域使用SSL&#xff08;安全套接字层&#xff09;服务器上的加密代…...

如何在龙蜥 OS(AliOS)上安装极狐GitLab?

本文分享如何在龙蜥操作系统&#xff08;AliOS&#xff09;&#xff08;包括 RHCK 和 ANCK 两种&#xff0c;两种方式的安装流程一样&#xff09;上安装极狐GitLab&#xff1f; 前提条件 一个安装了龙蜥操作系统的云服务器 可以查看 /etc/os-release中的信息&#xff0c;确认…...

unity插件Excel转换Proto插件-ExcelToProtobufferTool

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

2024年赣州旅游投资集团社会招聘笔试真

2024年赣州旅游投资集团社会招聘笔试真 题 ( 满 分 1 0 0 分 时 间 1 2 0 分 钟 ) 一、单选题(每题只有一个正确答案,答错、不答或多答均不得分) 1.纪要的特点不包括()。 A.概括重点 B.指导传达 C. 客观纪实 D.有言必录 【答案】: D 2.1864年,()预言了电磁波的存在,并指出…...

1688商品列表API与其他数据源的对接思路

将1688商品列表API与其他数据源对接时&#xff0c;需结合业务场景设计数据流转链路&#xff0c;重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点&#xff1a; 一、核心对接场景与目标 商品数据同步 场景&#xff1a;将1688商品信息…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

汇编常见指令

汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX&#xff08;不访问内存&#xff09;XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...

3403. 从盒子中找出字典序最大的字符串 I

3403. 从盒子中找出字典序最大的字符串 I 题目链接&#xff1a;3403. 从盒子中找出字典序最大的字符串 I 代码如下&#xff1a; class Solution { public:string answerString(string word, int numFriends) {if (numFriends 1) {return word;}string res;for (int i 0;i &…...

RNN避坑指南:从数学推导到LSTM/GRU工业级部署实战流程

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文全面剖析RNN核心原理&#xff0c;深入讲解梯度消失/爆炸问题&#xff0c;并通过LSTM/GRU结构实现解决方案&#xff0c;提供时间序列预测和文本生成…...

2023赣州旅游投资集团

单选题 1.“不登高山&#xff0c;不知天之高也&#xff1b;不临深溪&#xff0c;不知地之厚也。”这句话说明_____。 A、人的意识具有创造性 B、人的认识是独立于实践之外的 C、实践在认识过程中具有决定作用 D、人的一切知识都是从直接经验中获得的 参考答案: C 本题解…...

【生成模型】视频生成论文调研

工作清单 上游应用方向&#xff1a;控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...