Spring Boot 中的服务网关是什么,原理,如何使用

news2024/11/17 21:53:36

Spring Boot 中的服务网关是什么,原理,如何使用

在微服务架构中,服务网关是一个非常重要的组件。它可以作为所有微服务的入口,负责路由、负载均衡、安全性和监控等方面的功能。Spring Boot 提供了一系列的服务网关工具,其中最流行的是 Spring Cloud Gateway。在本文中,我们将深入探讨 Spring Boot 中的服务网关是什么,原理以及如何使用。

在这里插入图片描述

什么是服务网关?

服务网关是微服务架构中的一种设计模式,它负责将所有的客户端请求转发到相应的微服务上,并提供了一些额外的功能,例如路由、负载均衡、安全性和监控等。服务网关是微服务架构中的一个重要组件,它可以简化服务调用方的细节,同时也提高了系统的可靠性和安全性。

Spring Cloud Gateway 原理

Spring Cloud Gateway 是 Spring Cloud 生态系统中的一个组件,它提供了一种基于路由的方式来进行服务发现和请求路由。Spring Cloud Gateway 的核心组件包括 Gateway Server 和 Gateway Client。

Gateway Server 是服务网关,它负责接收客户端的请求,然后根据配置的路由规则将请求转发到相应的微服务上。Gateway Server 基于 Reactor 和 Spring WebFlux 构建,可以支持异步和非阻塞的 I/O 操作,从而提高了系统的吞吐量和响应速度。

Gateway Client 是服务提供者的客户端,它负责向 Gateway Server 注册服务实例,并接收 Gateway Server 的路由配置信息。Gateway Client 基于 Spring Cloud Discovery Client 和 Spring Cloud LoadBalancer 构建,可以自动发现可用的服务实例,并提供负载均衡功能。

如何使用 Spring Cloud Gateway?

下面我们来看一下如何在 Spring Boot 中使用 Spring Cloud Gateway。为了演示简单,我们将创建一个服务网关,用于转发客户端的请求到两个微服务上。

创建服务网关

首先,我们需要创建一个 Spring Boot 项目,并添加 Spring Cloud Gateway 相关依赖。

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>

然后,我们需要在配置文件中添加路由规则。下面的配置文件中,我们将客户端的请求转发到两个微服务上:service-a 和 service-b。

spring:
  cloud:
    gateway:
      routes:
        - id: service-a
          uri: lb://service-a
          predicates:
            - Path=/service-a/**
        - id: service-b
          uri: lb://service-b
          predicates:
            - Path=/service-b/**

在上面的配置文件中,我们使用了 lb://service-a 和 lb://service-b 来表示负载均衡的服务实例。这里我们使用了 Spring Cloud LoadBalancer 来提供负载均衡功能。

启动服务

最后,我们需要启动 Gateway Server、服务提供者和服务消费者三个应用。首先,我们需要启动 Gateway Server:

mvn spring-boot:run -pl gateway-server

然后,我们需要分别启动服务提供者 service-a 和 service-b:

mvn spring-boot:run -pl service-a
mvn spring-boot:run -pl service-b

启动完成后,我们可以访问 Gateway Server 的接口来调用服务提供者的接口:

curl http://localhost:8080/service-a/hello
curl http://localhost:8080/service-b/hello

Spring Cloud Gateway 高级功能

除了基本的路由功能外,Spring Cloud Gateway 还提供了一些高级功能,例如过滤器、限流和重试等。下面我们来看一下如何使用这些高级功能。

过滤器

过滤器是 Spring Cloud Gateway 中的一个重要功能,它可以在请求路由到微服务之前或之后对请求进行修改或拦截。Spring Cloud Gateway 提供了两种类型的过滤器:全局过滤器和局部过滤器。

全局过滤器可以应用于所有的路由规则,而局部过滤器只能应用于指定的路由规则。下面是一个使用全局过滤器的例子。

@Component
public class AuthFilter implements GlobalFilter {
    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        // 进行认证逻辑
        if (isAuthenticated()) {
            return chain.filter(exchange);
        } else {
            exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
            return exchange.getResponse().setComplete();
        }
    }
}

在上面的例子中,我们定义了一个名为 AuthFilter 的全局过滤器,用于进行认证。如果客户端未通过认证,则返回 401 状态码。可以看到,过滤器非常灵活,可以用于很多场景,例如认证、鉴权、日志等。

限流

限流是一个重要的功能,它可以防止服务被过度请求而导致服务崩溃。Spring Cloud Gateway 提供了基于 Redis 和基于 QPS 的限流功能。

基于 Redis 的限流可以通过 Redis 的计数器功能来实现。下面是一个使用 Redis 计数器实现的限流器:

@Component
public class RateLimiterFilter implements GatewayFilter, Ordered {
    private final RedisTemplate<String, String> redisTemplate;
    private final StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
    private final AtomicInteger atomicInteger = new AtomicInteger(0);

    public RateLimiterFilter(RedisTemplate<String, String> redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        String key = exchange.getRequest().getPath().value();
        return redisTemplate.execute(new RedisCallback<Mono<Void>>() {
            @Override
            public Mono<Void> doInRedis(RedisConnection connection) throws DataAccessException {
                byte[] rawKey = stringRedisSerializer.serialize(key);
                byte[] rawValue = connection.get(rawKey);
                if (rawValue == null) {
                    connection.incr(rawKey);
                    connection.expire(rawKey, 1);
                    return chain.filter(exchange);
                } else {
                    int count = Integer.parseInt(stringRedisSerializer.deserialize(rawValue));
                    if (count < 10) {
                        connection.incr(rawKey);
                        connection.expire(rawKey, 1);
                        return chain.filter(exchange);
                    } else {
                        exchange.getResponse().setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
                        return exchange.getResponse().setComplete();
                    }
                }
            }
        });
    }

    @Override
    public int getOrder() {
        return -1;
    }
}

在上面的例子中,我们定义了一个名为 RateLimiterFilter 的限流器,用于限制每秒钟最多只能请求 10 次。在实现中,我们使用 Redis 计数器来记录请求次数,并通过 Redis 的过期时间来控制计数器的清零。可以看到,通过限流器,我们可以有效地保护我们的微服务,避免被过度请求而导致崩溃。

重试

重试是一个常见的功能,它可以在微服务不可用或出现异常时进行重试。Spring Cloud Gateway 提供了基于 Retry 和基于 Circuit Breaker 的重试功能。

基于 Retry 的重试功能可以在微服务出现异常时自动进行重试。下面是一个使用 Retry 实现的重试器:

@Component
public class RetryFilter implements GatewayFilter, Ordered {
    private final RetryGatewayFilterFactory retryGatewayFilterFactory;

    public RetryFilter(RetryGatewayFilterFactory retryGatewayFilterFactory) {
        this.retryGatewayFilterFactory = retryGatewayFilterFactory;
    }

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        GatewayFilter retryFilter = retryGatewayFilterFactory.apply(new RetryConfig(3, Duration.ofSeconds(2)));
        return retryFilter.filter(exchange, chain);
    }

    @Override
    public int getOrder() {
        return 0;
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/711450.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

redis-哨兵安装

解决问题 自动故障修复 1.在主从模式的基础上,在主节点添加自己的认证密码即可 2.将代码客户端地址改为哨兵地址 ------------- 主节点配置 daemonize yes port 6379 bind 0.0.0.0 requirepass 123456 save 3600 1 300 100 60 10000dir /usr/local/redis dbfilename dump.r…

Java POI (4)—— Linux环境下文件解析过程出现OOM的问题

Excel文件在进行解析的时候&#xff0c;在Windows环境中&#xff0c;没用报错&#xff0c;但是在Linux环境中&#xff0c;出现了如下的报错&#xff1a; nested exception is javalang.OutofMemoryError: Java heap space &#xff08;OOM&#xff09; 一、内存溢出和栈溢出有什…

主流特征工程平台(一)

一. 目标 对于Feature Store的能力与边界&#xff0c;每家的定义略微不同&#xff0c;《Feature Stores - A Hierarchy of Needs》&#xff09;这篇文章做了很好的总结&#xff0c;大体分为如下几个层次&#xff1a; 特征管理&#xff1a;特征抽取、处理、存储、元数据管理&am…

群晖NAS 安装 MySQL 远程访问连接

目录 1. 安装Mysql 2. 安装phpMyAdmin 3. 修改User 表 4. 本地测试连接 5. 安装cpolar 6. 配置公网访问地址 7. 固定连接公网地址 [TOC] > **转载自cpolar极点云文章&#xff1a;[群晖NAS 安装 MySQL远程访问连接](https://www.cpolar.com/blog/install-mysql-remote-…

Spring 事务使用详解

前言 什么是事务&#xff1f;根据 维基百科事务 介绍&#xff0c;数据库事务&#xff08;简称&#xff1a;事务&#xff09;是数据库管理系统执行过程中的一个逻辑单位&#xff0c;由一个有限的数据库操作序列构成。简单来说&#xff0c;事务就是将一系列操作当成一个不可拆分…

报喜鸟如何触发数字化转型及品牌扩张战略分析

传统服装企业往往面临缺乏创新、盲目扩张、追求低成本、库存和行业周期性等问题。报喜鸟通过深入分析市场需求&#xff0c;明确聚焦主业&#xff0c;提出加强品牌核心竞争力的价值主张。通过实施DTC转型&#xff0c;发力电商平台和线下门店等举措&#xff0c;报喜鸟成功提高品牌…

VSC++=》 指针实数排序

缘由https://bbs.csdn.net/topics/396523482 void 指针实数排序(double* aa, int d) {//缘由https://bbs.csdn.net/topics/396523482double lin 0; int j d, jj 0;while (jj < d) if (--j > jj) if (aa[j] > aa[j - 1])lin aa[j], aa[j] aa[j - 1], aa[j - 1] …

Flask request和requests(客户端服务器)

Flask request和requests 1、Flask request属性2、requests属性3、实现代码 1、Flask request属性 这么多属性什么时候有值什么时候没值&#xff0c;其实完全取决于我们请求头content-type是什么&#xff0c;如果是以表单形式multipart/form-data、application/x-www-form-url…

辅助驾驶功能开发-功能规范篇(21)-3-XP行泊一体方案功能规范

XPilot Parking 自动泊车系统 七、全自动泊车(AutoParking) • 自动泊车辅助(AutoParking Assist)、斜列式车位泊车辅助(Diagonal AutoParking Assist) - 产品定义 基于超声波传感器和环视摄像头对空间和车位的识别,通过自动泊车系统实现全自动泊车入库。 - 功能说…

使用HHDESK图形化功能管理服务器

服务器的管理通常繁琐而枯燥&#xff0c;需要大量的命令行来执行。 所以图形化功能应运而生。 本篇以传输文件为例&#xff0c;简单介绍一下HHDESK的图形化管理功能。 首先需要配置好服务器。 点击连接管理&#xff0c;在连接类型中选择SSH&#xff0c;按照刚才在服务器中配…

方波信号轨迹跟踪(过冲与圆角)

在控制系统中&#xff0c;方波信号轨迹跟踪可能会面临过冲和圆角的问题。过冲是指跟踪信号超过期望值的现象&#xff0c;而圆角是指在方波信号变化时产生平滑的过渡。这些问题主要是因为传统的控制方法无法完美跟踪非线性的方波信号导致的。 过冲通常也称为超调。在方波信号的…

C++中的vector使用详解及重要部分底层实现

本篇文章会对vector的语法使用进行详解。同时&#xff0c;还会对重要难点部分的底层实现进行讲解。其中有vector的迭代器失效和深拷贝问题。希望本篇文章的内容会对你有所帮助。 目录 一、vector 简单概述 1、1 C语言中数组的不便 1、2 C中的动态数组容器vector 二、vector的常…

vue中实现div可编辑,并插入指定元素,样式

前言&#xff1a; vue中实现一个既可以编辑内容&#xff0c;有可以动态编辑内容插入一个带有样式的内容&#xff0c;改变默认内容后&#xff0c;这个样式消失的效果&#xff0c;这里来整理下调研与解决实现问题之路。 实现最终效果&#xff1a;图2为默认内容 1、可以光标点击任…

自定义MVC框架优化

目录 一、前言 二、优化问题 1.子控制器的初始化配置问题 2.页面跳转优化代码冗余问题 3.优化参数封装问题 三、进行优化 1.解决子控制器初始化配置 2.解决页面跳转的代码冗余问题 3.解决优化参数封装问题 4.中央控制器 一、前言 在自定义MVC框架原理中讲述了什么是…

Redis - Redis GEO实现经纬度测算距离,附近搜索范围

Redis GEO 主要用于存储地理位置信息&#xff0c;并对存储的信息进行操作&#xff0c;该功能在 Redis 3.2 版本新增 一、Redis GEO 操作方法 geoadd&#xff1a;添加地理位置的坐标 geopos&#xff1a;获取地理位置的坐标 geodist&#xff1a;计算两个位置之间的距离 geor…

client-go初级篇,从操作kubernetes到编写单元测试

欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码)&#xff1a;https://github.com/zq2599/blog_demos 本篇概览 尽管长篇系列《client-go实战》的内容足够丰富&#xff0c;然而内容太多每个知识点也有一定深度&#xff0c;对于打算快速学习并开始kubernetes开发…

分层架构简介

MVC是架构模式&#xff08;设计模式中的结构性模式&#xff09;&#xff0c;不是系统架构&#xff0c;更不是我们常说的三层架构 MVC的缺陷如下&#xff1a; 1.导致控制器冗余&#xff08;有大量的业务逻辑&#xff0c;可能开始没有&#xff0c;但是后来越来越多&#xff09;…

QT学习笔记5--槽函数重载解决办法

connect函数 connect(sender, signal, receiver, slot); 槽函数示例 void student:: treat(QString foodname) void student:: treat(int index) 由上可见&#xff0c;有两个名字相同&#xff0c;但形参不同的槽函数。 可以通过函数指针的方式 &#xff0c;用指针指向具体…

linux环境安装mysql8.0.32

linux环境安装mysql8.0.32 一、下载安装包二、安装前准备2.1 卸载旧版本mysql2.2 检查是否安装了 mariadb 数据库2.3 安装依赖包创建 mysql 用户 三、安装3.1 上传并解压安装包&#xff08;上传路径没有要求&#xff0c;一般在/usr/local&#xff09;3.2 初始化数据库3.3 注册数…

Java面试题6月

redis有哪些缓存淘汰策略 https://blog.51cto.com/u_11720620/5198874 生产环境内存溢出&#xff08;OOM&#xff09;问题处理方案 https://note.youdao.com/ynoteshare/index.html?id5cc182642eb02bc64197788c7722baae&typenote&_time1688287588653 jstack找出占用…