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

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:过滤器用于在路由请求过程中,向请求添加如鉴权、限流、日志输出等动态功能。

Spring Cloud Gateway Diagram

Gateway的主要功能

  • 路由策略:基于请求URL或请求Header内容,将请求路由到不同的后端服务。
  • 负载均衡:采用Ribbon来实现负载均衡,可以在多个实例之间分配负载。
  • 限流控制:使用Hystrix实现服务熔断和限流控制。
  • 过滤器:支持用户自定义过滤器,可用于鉴权、请求响应加解密、统一异常处理等。

网关服务Gateway的架构设计

架构设计方案

我们在实际项目开发中,通常需要先对Gateway进行一个整体的架构设计,这里我们介绍一种典型的架构设计方案。

  1. 设计网关服务Gateway的Filter过滤器,负责实现鉴权、请求与响应加解密、统一异常处理。
  2. 基于Eureka实现服务注册和发现功能,在Gateway中加入DiscoveryClient组件,用于管理后端服务。
  3. 基于RouteLocator实现路由策略,将请求转发到相应的微服务实例上,并支持灰度升级等高可用特性。
  4. 使用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. 启动网关服务器…...

什么原因导致了儿童自闭症?跟父母养育有关吗?

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

抽象轻松web

不断学习&#xff0c;不断进步&#xff0c;才能不被替代 只有你的不可被替代性才是价值所在 千变万化的叶子 根只有一个 ----2023年4月7日 弹性盒布局的作用其实是定位 我们设置弹性盒子的时候目的是为了让元素放在页面中的某个位置&#xff0c;从而达到布局的效果 定位的本质…...

如何获取系统下目录的文件系统类型

最近看到一个问题&#xff0c;如何获取当前系统的文件类型&#xff1f; 这个时候就要介绍下/proc/mounts文件&#xff1a;这个文件以/etc/mtab文件的格式给出当前系统所安装的文件系统信息。同时也能反映出任何手工安装从而在/etc/mtab文件中没有包含的文件系统。 我们可以通…...

【Linux】GCC编译器的使用

目录 前言&#xff1a; 一、GCC编译过程 1.预处理&#xff1a; 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协议是一种网络传输协议&#xff0c;主要用于代理服务器和客户端之间的通信。它能够通过认证授权等多种方式&#xff0c;提供安全可靠的代理服务&#xff0c;适用于各种应用场景。 SOCKS5协议原理&#xff1a; 1.连接建立&#xff1a;客户端向代理服务器发送连接请求&…...

java面试准备17

事务的四大特性 &#xff08;1&#xff09;原子性&#xff1a;事务执行的最小单位&#xff0c;不可被分割&#xff0c;事务的原子性保证事务中的一连串动作要么都执行&#xff0c;要么都不执行。 &#xff08;2&#xff09;一致性&#xff1a;执行事务前后的数据保持一致&…...

ffmpeg的滤镜

FFmpeg 是一款开源的跨平台音视频处理工具&#xff0c;它提供了众多功能强大的滤镜用于视频/音频的加工处理。其中&#xff0c;滤镜(Filter)是 FFmpeg 中一个十分重要且常用的组件&#xff0c;它们可以实现对视频和音频的各种操作和变化&#xff0c;如转码、编解码、剪裁、裁剪…...

springboot项目感受03

继续上文 01.数据的部分已经完成了&#xff0c;此时需要考虑到前端与用户交互的部分&#xff0c;这里就需要网页html&#xff0c;服务器响应servlet。 网页的部分&#xff0c;html文件放在resource目录下的template文件中&#xff0c;servlet变成了controller包&#xff0c;其…...

notion插件:为你的工作流带来新生

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

【python】Jupyter的使用(python代码编辑器)

文章目录一、Jupyter的介绍1、Jupyter是什么&#xff1f;2、Jupyter有什么独特之处&#xff1f;二、Jupyter的安装1、首先要下载python2、用pip命令下载Jupyter三、Jupyter的使用1、运行Jupyter2、简要介绍Jupyter的使用方法3、快捷键的使用四、总结一、Jupyter的介绍 1、Jupy…...

面试官:你做过什么有亮点的项目吗?

前言 面试中除了问常见的算法网络基础&#xff0c;和一些八股文手写体之外&#xff0c;经常出现的一个问题就是&#xff0c;你做过什么项目吗&#xff1f; 面试官其实是想看看你做过什么有亮点的项目, 其实大家日常做的项目都差不多&#xff0c;增删改查&#xff0c;登录注册&…...

【华为OD机试真题】猜字谜(javapython)

猜字谜 时间限制:1s空间限制:256MB 限定浯言:不限 题目描述: 小王设计了一个简单的猜字谜游戏,游戏的谜面是一个错误的单词,比如nesw,玩 家需要猜出谜底库中正确的单词。猜中的要求如下: 对于某个谜面和谜底单词,满足下面任一条件都表示猜中: 变换顺序以后一样的,…...

制作真人手办有哪些不便?怎么解决?

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

网络安全行业现在好混吗,工资水平怎么样?

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

【SpringBoot】面试组合技-天羽屠龙舞,SpringBootApplication注解的作用是什么?SpringBoot怎么实现自动装配的?

SpringBoot源码下载地址&#xff1a;https://github.com/spring-projects/spring-boot/tags 文章目录&#x1f35f;下载源码&#x1f357;环境准备&#x1f356;注解解析&#x1f35d;SpringBootConfiguration注解&#x1f35b;EnableAutoConfiguration注解&#x1f364;AutoC…...

2023-4-10-用Pthreads计算积分

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f;&#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xff0…...

什么是js?js的基本使用

JavaScript&#xff08;简称“ js”&#xff09; 是一种具有函数优先的轻量级&#xff0c;解释型或即时编译型的编译语言虽然它是作为开发WEB页面的脚本语言而出名&#xff0c;但是它也被用到了很多非浏览器环境中&#xff0c;JavaScript 基于原型编程、多范式的动态脚本语言&a…...

自然数的拆分问题 字典序

目录 自然数的拆分问题 字典序 程序设计 程序分析 自然数的拆分问题 字典序 对于大于1的自然数N,可以拆分成若干个大于等于1的自然数之和。 Input 一个大于1的自然数N Output 所有的拆分情况.按字典序排列。 Sample Input...

软件测试——概念篇

目录 一、软件的生命周期 二、瀑布模型&#xff08;Waterfall Model&#xff09; 优点&#xff1a; 缺点&#xff1a; 三、螺旋模型&#xff08;Spiral Model&#xff09; ​编辑优点&#xff1a; 缺点&#xff1a; 四、增量、迭代 区别&#xff1a; 五、敏捷 scrum…...

网络六边形受到攻击

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 现代智能交通系统 &#xff08;ITS&#xff09; 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 &#xff08;…...

C++_核心编程_多态案例二-制作饮品

#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为&#xff1a;煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例&#xff0c;提供抽象制作饮品基类&#xff0c;提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

微信小程序之bind和catch

这两个呢&#xff0c;都是绑定事件用的&#xff0c;具体使用有些小区别。 官方文档&#xff1a; 事件冒泡处理不同 bind&#xff1a;绑定的事件会向上冒泡&#xff0c;即触发当前组件的事件后&#xff0c;还会继续触发父组件的相同事件。例如&#xff0c;有一个子视图绑定了b…...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

页面渲染流程与性能优化

页面渲染流程与性能优化详解&#xff08;完整版&#xff09; 一、现代浏览器渲染流程&#xff08;详细说明&#xff09; 1. 构建DOM树 浏览器接收到HTML文档后&#xff0c;会逐步解析并构建DOM&#xff08;Document Object Model&#xff09;树。具体过程如下&#xff1a; (…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

uniapp 实现腾讯云IM群文件上传下载功能

UniApp 集成腾讯云IM实现群文件上传下载功能全攻略 一、功能背景与技术选型 在团队协作场景中&#xff0c;群文件共享是核心需求之一。本文将介绍如何基于腾讯云IMCOS&#xff0c;在uniapp中实现&#xff1a; 群内文件上传/下载文件元数据管理下载进度追踪跨平台文件预览 二…...

ZYNQ学习记录FPGA(一)ZYNQ简介

一、知识准备 1.一些术语,缩写和概念&#xff1a; 1&#xff09;ZYNQ全称&#xff1a;ZYNQ7000 All Pgrammable SoC 2&#xff09;SoC:system on chips(片上系统)&#xff0c;对比集成电路的SoB&#xff08;system on board&#xff09; 3&#xff09;ARM&#xff1a;处理器…...

DAY 26 函数专题1

函数定义与参数知识点回顾&#xff1a;1. 函数的定义2. 变量作用域&#xff1a;局部变量和全局变量3. 函数的参数类型&#xff1a;位置参数、默认参数、不定参数4. 传递参数的手段&#xff1a;关键词参数5 题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...