SpringCloud微服务技术栈之网关服务Gateway
文章目录
- SpringCloud微服务技术栈之网关服务Gateway
- 前言
- 网关服务Gateway的基本概念
- Gateway的体系结构
- Gateway的主要功能
- 网关服务Gateway的架构设计
- 架构设计方案
- 示例代码
- 网关服务Gateway的实践操作
- 1. 创建工程
- 2. 配置路由规则
- 3. 实现过滤器
- 4. 集成服务注册中心
- 5. 启动网关服务器
- 总结
SpringCloud微服务技术栈之网关服务Gateway
前言
在微服务架构中,微服务数量的增加会使得系统中出现大量的服务实例,同时每个服务往往又有多个版本,这些版本需要进行升级、降级等操作。因此,对于这些微服务的调用和路由管理就变成了一个巨大的挑战。Spring Cloud网关服务Gateway可以作为微服务架构中的一个基础设施,通过将API网关方式暴露给服务客户端,从而控制所有的请求流量,并支持许多传输协议,例如HTTP、WebSocket等。
本篇博客主要围绕SpringCloud微服务技术栈中的网关服务Gateway进行介绍和实践,包括其基本概念、架构设计和实践操作。
网关服务Gateway的基本概念
网关服务是微服务架构中的一个基础设施,主要用于集中处理服务请求,从而更好地控制和管理整个系统。SpringCloud网关服务Gateway是一款基于Spring框架的微服务网关服务,它提供了许多特性,比如路由、过滤、限流、负载均衡、熔断器等。
Gateway的体系结构
Gateway主要包含以下两个组件:
Route
:路由是指从网关接收到客户端请求,并将请求转发到适当的微服务实例。路由是Gateway的基本组成部分,它由ID、URI、谓词集合和过滤器工厂等组成。Filter
:过滤器用于在路由请求过程中,向请求添加如鉴权、限流、日志输出等动态功能。
Gateway的主要功能
- 路由策略:基于请求URL或请求Header内容,将请求路由到不同的后端服务。
- 负载均衡:采用Ribbon来实现负载均衡,可以在多个实例之间分配负载。
- 限流控制:使用Hystrix实现服务熔断和限流控制。
- 过滤器:支持用户自定义过滤器,可用于鉴权、请求响应加解密、统一异常处理等。
网关服务Gateway的架构设计
架构设计方案
我们在实际项目开发中,通常需要先对Gateway进行一个整体的架构设计,这里我们介绍一种典型的架构设计方案。
- 设计网关服务Gateway的Filter过滤器,负责实现鉴权、请求与响应加解密、统一异常处理。
- 基于Eureka实现服务注册和发现功能,在Gateway中加入DiscoveryClient组件,用于管理后端服务。
- 基于RouteLocator实现路由策略,将请求转发到相应的微服务实例上,并支持灰度升级等高可用特性。
- 使用Hystrix实现限流控制,当后端服务出现问题或网络拥塞时,能够合理地进行资源分配和降级策略。
示例代码
下面是一个典型的Gateway实现代码:
@SpringBootApplication
public class GatewayServerApplication {public static void main(String[] args) {SpringApplication.run(GatewayServerApplication.class, args);}@Beanpublic RouteLocator customRouteLocator(RouteLocatorBuilder builder) {return builder.routes().route(r -> r.path("/v1/api/user/**").uri("lb://user-service")).route(r -> r.path("/v1/api/order/**").filters(f -> f.stripPrefix(1)).uri("lb://order-service")).build();}
}
上述代码中,我们创建了一个名为GatewayServerApplication的SpringBoot应用。其中的RouteLocator类就是路由配置的核心类。在这个例子中,我们先对URI路径进行转发,然后通过Ribbon来实现负载均衡。
网关服务Gateway的实践操作
在实践操作中,我们需要先安装SpringBoot和SpringCloud环境,然后搭建一个简单的微服务应用。这里我们以一个简单的用户管理系统为例进行演示。具体步骤如下:
1. 创建工程
首先使用Spring Initializr创建一个新的Spring Boot工程,并添加相关依赖:
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
2. 配置路由规则
在application.yml中进行路由配置:
spring:cloud:gateway:routes:- id: user-serviceuri: lb://user-servicepredicates:- Path=/v1/api/user/**- id: order-serviceuri: lb://order-servicepredicates:- Path=/v1/api/order/**
3. 实现过滤器
在实际开发中,我们经常需要对客户端请求进行安全认证或者权限校验等操作。SpringCloud Gateway提供了一个统一化的过滤器框架,允许我们定义多个可以对特定类型请求进行处理的过滤器。Spring Cloud Gateway中有两种类型的过滤器:前置过滤器和后置过滤器。
下面是一个基于过滤器的安全认证实现示例:
@Component
public class AuthorizationFilter implements GatewayFilter, Ordered {private static final Logger log = LoggerFactory.getLogger(AuthorizationFilter.class);@Overridepublic Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {//进行请求Token认证,如果不合法则返回401String token = exchange.getRequest().getHeaders().getFirst("Authorization");if (StringUtils.isBlank(token)) {exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);return exchange.getResponse().setComplete();}//Token认证通过,则将请求转发到对应的微服务实例上return chain.filter(exchange);}@Overridepublic int getOrder() {return -100;}
}
4. 集成服务注册中心
我们需要在网关中加入EurekaClient组件,以实现服务注册和发现功能。
spring:cloud:gateway:discovery:locator:enabled: trueapplication:name: gateway-server
eureka:client:serviceUrl:defaultZone: http://localhost:8761/eureka/
5. 启动网关服务器
最后我们可以运行GatewayServerApplication,并访问相应的API地址进行测试。
总结
本文主要介绍了SpringCloud微服务技术栈中的网关服务Gateway,包括其基本概念、架构设计和实践操作。通过Gateway的实现,微服务架构能够更好地控制和管理整个系统,实现路由策略、负载均衡、限流控制等功能。当然,在实际开发中需要进一步针对不同的业务场景进行定制和优化,以满足不断变化的需求和挑战。
相关文章:

SpringCloud微服务技术栈之网关服务Gateway
文章目录SpringCloud微服务技术栈之网关服务Gateway前言网关服务Gateway的基本概念Gateway的体系结构Gateway的主要功能网关服务Gateway的架构设计架构设计方案示例代码网关服务Gateway的实践操作1. 创建工程2. 配置路由规则3. 实现过滤器4. 集成服务注册中心5. 启动网关服务器…...

什么原因导致了儿童自闭症?跟父母养育有关吗?
导致儿童自闭症的原因是什么?这和父母的抚养有关吗?学习教育孩子的方法,让孩子快乐健康地成长,是家庭和孩子生活中的一件重要事情。不良的环境和错误的教育会导致儿童自闭症,这是真的吗?自闭症,…...

抽象轻松web
不断学习,不断进步,才能不被替代 只有你的不可被替代性才是价值所在 千变万化的叶子 根只有一个 ----2023年4月7日 弹性盒布局的作用其实是定位 我们设置弹性盒子的时候目的是为了让元素放在页面中的某个位置,从而达到布局的效果 定位的本质…...
如何获取系统下目录的文件系统类型
最近看到一个问题,如何获取当前系统的文件类型? 这个时候就要介绍下/proc/mounts文件:这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。同时也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。 我们可以通…...

【Linux】GCC编译器的使用
目录 前言: 一、GCC编译过程 1.预处理: 2.编译 3.汇编 4.链接 二、制作、使用动态库和静态库 1.静态库 2.动态库 三、好用的选项 1.gcc -E main.c 2.gcc -E -dM main.c > 1.txt 3.gcc -Wp,-MD,abc.dep -c -o main.o main.c 4.echo main(){}| …...
浅谈一下socks5协议原理详解与应用场景分析
SOCKS5协议是一种网络传输协议,主要用于代理服务器和客户端之间的通信。它能够通过认证授权等多种方式,提供安全可靠的代理服务,适用于各种应用场景。 SOCKS5协议原理: 1.连接建立:客户端向代理服务器发送连接请求&…...
java面试准备17
事务的四大特性 (1)原子性:事务执行的最小单位,不可被分割,事务的原子性保证事务中的一连串动作要么都执行,要么都不执行。 (2)一致性:执行事务前后的数据保持一致&…...
ffmpeg的滤镜
FFmpeg 是一款开源的跨平台音视频处理工具,它提供了众多功能强大的滤镜用于视频/音频的加工处理。其中,滤镜(Filter)是 FFmpeg 中一个十分重要且常用的组件,它们可以实现对视频和音频的各种操作和变化,如转码、编解码、剪裁、裁剪…...
springboot项目感受03
继续上文 01.数据的部分已经完成了,此时需要考虑到前端与用户交互的部分,这里就需要网页html,服务器响应servlet。 网页的部分,html文件放在resource目录下的template文件中,servlet变成了controller包,其…...

notion插件:为你的工作流带来新生
在本文中,我们将介绍Notion的几款有助于提高生产力的插件。这些插件将加强Notion的功能,并为你的工作流程带来更多的便利。 我们特地为你准备了这本漫游指南:收录各种工具、信息和资源,携你共同探索浩瀚美丽的互联网海洋。 snackt…...

【python】Jupyter的使用(python代码编辑器)
文章目录一、Jupyter的介绍1、Jupyter是什么?2、Jupyter有什么独特之处?二、Jupyter的安装1、首先要下载python2、用pip命令下载Jupyter三、Jupyter的使用1、运行Jupyter2、简要介绍Jupyter的使用方法3、快捷键的使用四、总结一、Jupyter的介绍 1、Jupy…...

面试官:你做过什么有亮点的项目吗?
前言 面试中除了问常见的算法网络基础,和一些八股文手写体之外,经常出现的一个问题就是,你做过什么项目吗? 面试官其实是想看看你做过什么有亮点的项目, 其实大家日常做的项目都差不多,增删改查,登录注册&…...
【华为OD机试真题】猜字谜(javapython)
猜字谜 时间限制:1s空间限制:256MB 限定浯言:不限 题目描述: 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩 家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,…...

制作真人手办有哪些不便?怎么解决?
相信很多朋友都喜欢拍摄写真,比如孩子生日的时候,结婚纪念的时候,写真照片能留存住很多美好的记忆。 不过随着科技的发展,大家已经不能满足只靠照片来记录生活了,越来越多的人开始盯上了手办这件物品。将真人的照片和…...

网络安全行业现在好混吗,工资水平怎么样?
前段时间看到有人私信:网络安全行业现在好混吗,工资水平怎么样?今天在这里做个回答,不知你所说的“好混吗”指的是什么? 薪资高,待遇好?不加班,活儿少?不受气࿰…...

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?
SpringBoot源码下载地址:https://github.com/spring-projects/spring-boot/tags 文章目录🍟下载源码🍗环境准备🍖注解解析🍝SpringBootConfiguration注解🍛EnableAutoConfiguration注解🍤AutoC…...

2023-4-10-用Pthreads计算积分
🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥💟💟喜欢的朋友可以关注一下࿰…...
什么是js?js的基本使用
JavaScript(简称“ js”) 是一种具有函数优先的轻量级,解释型或即时编译型的编译语言虽然它是作为开发WEB页面的脚本语言而出名,但是它也被用到了很多非浏览器环境中,JavaScript 基于原型编程、多范式的动态脚本语言&a…...
自然数的拆分问题 字典序
目录 自然数的拆分问题 字典序 程序设计 程序分析 自然数的拆分问题 字典序 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N Output 所有的拆分情况.按字典序排列。 Sample Input...

软件测试——概念篇
目录 一、软件的生命周期 二、瀑布模型(Waterfall Model) 优点: 缺点: 三、螺旋模型(Spiral Model) 编辑优点: 缺点: 四、增量、迭代 区别: 五、敏捷 scrum…...
总结HTML中的文本标签
总结HTML中的文本标签 文章目录 总结HTML中的文本标签引言一、标题标签(h1 - h6)语法示例使用建议 二、段落标签(p)语法示例使用建议 三、文本节点标签(span)语法示例使用建议 四、粗体标签(b&a…...
从golang的sync.pool到linux的slab分配器
最近学习golang的时候,看到golang并发编程中有一个sync.pool,即对象池,猛地一看这不跟linux的slab分配器类似嘛,赶紧学习记录下 这里先总结下设计sync.pool和slab的目的 sync.pool 为了缓解特定类型的对象频繁创建和销毁&#x…...
【方案分享】蓝牙Beacon定位精度优化(包含KF、EKF与UKF卡尔曼滤波算法详解)
蓝牙Beacon定位精度优化:KF、EKF与UKF卡尔曼滤波算法详解 标签:蓝牙定位|Beacon|卡尔曼滤波|UKF|EKF|RSSI|室内定位|滤波算法|精度优化 相关分享:…...

WebRTC源码线程-1
1、概述 本篇主要是简单介绍WebRTC中的线程,WebRTC源码对线程做了很多的封装。 1.1 WebRTC中线程的种类 1.1.1 信令线程 用于与应用层的交互,比如创建offer,answer,candidate等绝大多数的操作 1.1.2 工作线程 负责内部的处理逻辑&…...
Komiko 视频到视频功能炸裂上线!
Komiko 平台作为行业的创新先锋,近日宣布推出全新的视频到视频(Video-to-Video)功能,这一举措犹如一颗重磅炸弹,瞬间在漫画、动画和插画创作的世界里掀起了惊涛骇浪,进一步巩固了其作为 AI 驱动的一体化创作…...
MS358A 低功耗运算放大器 车规
MS358A 低功耗运算放大器 车规 产品简述 MS358A 是双通道运算放大器,具有低功耗、宽电源电压范围、高单位增益带宽的特性。在特定情况下,压摆率可以达到0.4V/μs 。每个通道的静态电流 (5V) 只有 430μA 。 MS358A输入共模范围可以到地,同时…...
使用docker 安装Redis 带配置文件(x86和arm)版本
一、安装redis 1.1 拉去ARM镜像(7.4.2) docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_redis:latest1.2 拉去x86镜像(8.0.1)版本 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/redis:latest新建文件夹 mkd…...
JavaScript 中的单例内置对象:Global 与 Math 的深度解析
JavaScript 中的单例内置对象:Global 与 Math 的深度解析 在 JavaScript 的世界中,单例内置对象是开发者必须了解的核心概念之一。它们是语言规范中预定义的对象,无需显式创建即可直接使用。本文将深入解析 JavaScript 中最重要的两个单例内…...
STM32实战: CAN总线数据记录仪设计方案
以下是基于STM32的CAN总线数据记录仪/转发器的设计与实现方案,结合了核心功能和进阶需求: 系统架构 graph TBA[CAN总线] -->|CAN_H/CAN_L| B(STM32 bxCAN)B --> C[数据处理核心]C --> D[SD卡存储<br>FATFS文件系统]C --> E[串口输出…...

如何使用插件和子主题添加WordPress自定义CSS(附:常见错误)
您是否曾经想更改网站外观的某些方面,但不知道怎么做?有一个解决方案——您可以将自定义 CSS(层叠样式表)添加到您的WordPress网站! 在本文中,我们将讨论您需要了解的有关CSS的所有知识以及如何使用它来修…...