SpringCloud微服务技术栈之网关服务Gateway

news/2024/11/29 11:43:45/

文章目录

  • 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的实现,微服务架构能够更好地控制和管理整个系统,实现路由策略、负载均衡、限流控制等功能。当然,在实际开发中需要进一步针对不同的业务场景进行定制和优化,以满足不断变化的需求和挑战。


http://www.ppmy.cn/news/41697.html

相关文章

面试题

用 C写一个函数&#xff0c;交换两个整型变量 int a 5, b 10; cout << "Before swapping: a " << a << ", b " << b << endl; swapVars<int>(a, b); cout << "After swapping: a " << a …

检测图中的负循环 | (贝尔曼福特)

我们得到了一个有向图。我们需要计算图形是否有负循环。负循环是循环的总和变为负的循环。 在图形的各种应用中都可以找到负权重。例如,如果我们沿着这条路走,我们可能会得到一些好处,而不是为一条路付出代价。 例子:

数据分析的目的和意义是什么?_光点科技

数据分析是一个越来越受到关注的领域&#xff0c;因为它可以帮助企业和组织利用数据来制定更明智的决策。数据分析的目的和意义是多方面的&#xff0c;例如&#xff1a; 1.了解客户需求 数据分析可以帮助企业更好地了解客户需求&#xff0c;从而制定更准确的市场营销策略。通过…

各种深度学习机器学习数据集(大多数内附读取脚本!)(建议按ctrl+F查询是否有需要的,持续更新中。。)

欢迎关注&#xff0c;高强度更新和MATLAB,PYTHON编程&#xff0c;C编程&#xff0c;算法编程&#xff0c;深度学习&#xff0c;自然语言处理&#xff0c;图像处理&#xff0c;OPENCV等相关知识:) 摘要 MNIST数据集、行人车辆检测数据集、安全头盔数据集、白酒数据集、成人数据…

天气预报查询 API + AI 等于王炸(一大波你未曾设想的天气预报查询 API 应用场景更新了)

前言 近年来&#xff0c;随着信息化进程的不断深入&#xff0c;人们对于信息的获取和处理需求越来越高。而其中&#xff0c;天气查询API是一个非常重要的服务&#xff0c;它能够帮助人们快速获取所在位置的天气情况&#xff0c;同时也为各类应用提供了必要的气象数据支持。 本…

02.vue3事件处理

文章目录1.事件的基本使用2.事件对象3.事件修饰符4.按键修饰符1.Vue中常用的按键别名&#xff1a;2.Vue未提供别名的按键&#xff0c;可以使用按键原始的key值去绑定&#xff0c;但注意要转为kebab-case&#xff08;短横线命名&#xff09;3.系统修饰键&#xff08;用法特殊&am…

【数据结构第八章】- 排序(万字详解排序算法并用 C 语言实现)

目录 一、基本概念和排序方法概述 1.1 - 排序的基本概念 1.2 - 内部排序的分类 二、插入排序 2.1 - 直接插入排序 2.2 - 希尔排序 三、交换排序 3.1 - 冒泡排序 3.2 - 快速排序 3.2.1 - 递归算法 3.2.2 - 优化 3.2.3 - 非递归算法 四、选择排序 4.1 - 简单选择排…

【创作赢红包】python学习——【第七弹】

前言 上一篇文章 python学习——【第六弹】中介绍了 python中的字典操作&#xff0c;这篇文章接着学习python中的可变序列 集合 集合 1&#xff1a; 集合是python语言提供的内置数据结构&#xff0c;具有无序性&#xff08;集合中的元素无法通过索引下标访问&#xff0c;并且…