学习分享-为什么把后台的用户验证和认证逻辑放到网关

将后台的用户验证和认证逻辑放到网关(API Gateway)中是一种常见的设计模式,这种做法在微服务架构和现代应用中有许多优势和理由:

1. 集中管理认证和授权

统一的安全策略

在一个包含多个微服务的系统中,如果每个服务都独立处理用户认证和授权,会导致以下问题:

  • 重复代码:每个微服务都需要实现相同的认证和授权逻辑,增加了代码的重复性。
  • 一致性难以保证:不同的服务可能会实现不同的认证和授权策略,导致安全策略的不一致。

将认证和授权逻辑集中到网关,可以统一管理和实施安全策略,确保所有请求经过一致的验证流程。

2. 简化微服务

关注业务逻辑

通过将用户认证和授权逻辑移到网关,微服务本身可以更加专注于业务逻辑,而不需要处理复杂的安全问题。这不仅简化了微服务的实现,还提高了代码的可维护性和可读性。

3. 提高性能

减少重复工作

网关可以缓存认证结果,减少每个微服务对同一用户的重复认证操作,提高系统整体性能。例如,可以在用户首次通过认证后,将认证结果缓存起来,并在后续请求中复用。

4. 增强安全性

统一入口点

网关作为统一入口点,可以更好地监控和管理流量,检测和防御各种安全威胁。例如,网关可以集成防火墙、DDoS 防护等安全机制,提升整体系统的安全性。

5. 灵活性和可扩展性

动态路由和负载均衡

网关可以根据认证结果动态路由请求,并进行负载均衡。例如,可以将未认证的请求重定向到登录页面或认证服务,将认证通过的请求路由到相应的微服务。同时,网关还可以在高并发场景下进行负载均衡,确保系统的稳定性和高可用性。

6. 减少线程占用

在微服务架构中,如果每个微服务都独立处理用户认证和授权,这意味着每次请求都需要占用服务端的线程进行验证。这种做法会带来以下问题:

线程资源消耗
每个微服务都要处理认证逻辑,可能会导致线程资源被大量消耗,尤其是在高并发场景下。这不仅会影响服务的性能,还可能导致线程池耗尽,进而影响系统的可用性。

线程阻塞问题
传统的基于阻塞 I/O 的认证方式会导致线程长时间占用,影响系统的吞吐量和响应时间。

通过将认证逻辑移到网关,可以利用网关的响应式编程模型(如 Spring WebFlux),避免线程的长时间占用,从而提高系统的并发处理能力。

7. 基于响应式模型的网关

现代的 API 网关(如 Spring Cloud Gateway)通常采用响应式编程模型。这种模型有以下几个优点:

高效的资源利用
响应式编程模型(如 Reactor)采用非阻塞 I/O,可以高效利用系统资源,处理大量并发请求而不会阻塞线程。这使得网关能够处理更多的请求,提供更高的吞吐量和更快的响应速度。

更快的响应速度
通过非阻塞 I/O 和响应式编程,网关可以更快地处理请求并返回响应,降低延迟,提高用户体验。

实现示例

以下是一个使用 Spring Cloud Gateway 实现用户认证和授权的简单示例:

添加依赖

pom.xml 文件中添加 Spring Cloud Gateway 和安全相关的依赖:

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>
配置网关

application.yml 文件中配置路由和过滤器:

spring:cloud:gateway:routes:- id: shortlink-serviceuri: http://shortlink-service:8080predicates:- Path=/api/shortlinks/**filters:- name: AuthFilter
实现认证过滤器

创建一个自定义认证过滤器:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.server.authentication.AuthenticationWebFilter;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;@Component
public class AuthFilter extends AuthenticationWebFilter {@Autowiredprivate AuthenticationManager authenticationManager;public AuthFilter() {super(authenticationManager);}@Overridepublic Mono<Void> filter(ServerWebExchange exchange, WebFilterChain chain) {ServerHttpRequest request = exchange.getRequest();String authHeader = request.getHeaders().getFirst(HttpHeaders.AUTHORIZATION);if (authHeader == null || !authHeader.startsWith("Bearer ")) {return Mono.error(new RuntimeException("Missing or invalid Authorization header"));}String token = authHeader.substring(7);Authentication authentication = new BearerTokenAuthenticationToken(token);return this.authenticationManager.authenticate(authentication).doOnNext(auth -> SecurityContextHolder.getContext().setAuthentication(auth)).then(chain.filter(exchange)).doFinally(signalType -> SecurityContextHolder.clearContext());}
}

总结

将用户验证逻辑移到网关,不仅可以集中管理安全策略,简化微服务的实现,还能有效减少线程占用,利用响应式编程模型提高系统的资源利用率和响应速度。这种设计方式有助于提升系统的整体性能和用户体验,特别是在高并发场景下表现更加突出。

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

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

相关文章

优化扩散模型中的采样计划

在生成模型领域&#xff0c;扩散模型&#xff08;Diffusion Models, DMs&#xff09;因其卓越的生成质量而成为最新的技术趋势。但这些模型的一个关键缺点是它们的采样速度较慢&#xff0c;需要通过大型神经网络进行多次顺序函数评估。扩散模型通过一个称为采样计划的离散噪声水…

Golang | Leetcode Golang题解之第130题被围绕的区域

题目&#xff1a; 题解&#xff1a; var (dx [4]int{1, -1, 0, 0}dy [4]int{0, 0, 1, -1} ) func solve(board [][]byte) {if len(board) 0 || len(board[0]) 0 {return}n, m : len(board), len(board[0])queue : [][]int{}for i : 0; i < n; i {if board[i][0] O {q…

xmind父主题快捷键Ctrl+Enter

xmind父主题快捷键 CtrlEnter

实验八、地址解析协议《计算机网络》

水逆退散&#xff0c;学业进步&#xff0c;祝我们都好&#xff0c;不止在夏天。 目录 一、实验目的 二、实验内容 &#xff08;1&#xff09;预备知识 &#xff08;2&#xff09;实验步骤 三、实验小结 一、实验目的 完成本练习之后&#xff0c;您应该能够确定给定 IP 地…

MySQL之查询性能优化(十二)

查询性能优化 优化COUNT()查询 4.使用近似值 有时候某些业务场景并不要求完全精确的COUNT值&#xff0c;此时可以用近似值来代替。EXPLAIN出来的优化器估算的行数就是一个不错的近似值&#xff0c;执行EXPLAIN并不需要真正地去执行查询&#xff0c;所以成本很低。很多时候&am…

【消灭星星game】

“消灭星星”&#xff08;PopStar&#xff09;是一款非常受欢迎的益智游戏&#xff0c;游戏目标是在一个网格中消除相同颜色的星星&#xff0c;一次消除的星星数量越多&#xff0c;得分越高。以下是一个简化版的消灭星星游戏的Python代码示例&#xff0c;用于演示基本的游戏逻辑…

智能数据分析(2)Lecture 9-11

Lecture 9: Feature Analysis and Dimensionality Reduction 特征选择&#xff08;Feature Selection&#xff09; 特征选择的定义与目标 定义&#xff1a;特征选择指的是从原始特征集中选择一个子集&#xff0c;以减少特征的数量并提升模型的性能。选择的特征子集应当能最好…

【python】python商业客户流失数据模型训练分析可视化(源码+数据集+课程论文)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;公众号&#x1f448;&#xff1a;测试开发自动化【获取源码商业合作】 &#x1f449;荣__誉&#x1f448;&#xff1a;阿里云博客专家博主、5…

基本通信设备

1、 网卡 &#xff08;1&#xff09;负责将终端机连入网络 &#xff08;2&#xff09;计算机通过网卡接入网络&#xff08;有线、无线&#xff09; 2、 交换机 &#xff08;1&#xff09;连接终端机&#xff0c;构建网段 &#xff08;2&#xff09;负责网段内…

CentOS 7基础操作08_Linux查找目录和文件

1、which命令——查找用户所执行的命令文件存放的目录 which命令用于查找Linux命令程序并显示所在的具体位置.其搜索范围主要由用户的环境变量PATH决定(可以执行言echo sPATH”命令查看),这个范围也是Linux操作系统在执行命令或程序时的默认搜索路径。 which命令使用要查找的命…

论文复现:Track to Detect and Segment: An Online Multi-Object Tracker

论文下载链接&#xff1a;链接 简单介绍&#xff1a;大多数在线多目标跟踪器在神经网络中独立执行目标检测&#xff0c;无需任何跟踪输入。在本文中提出了一种新的在线联合检测和跟踪模型TraDeS&#xff08;TRAck to DEtect and Segment&#xff09;&#xff0c;利用跟踪线索…

一个例子了解c++的指针数组和数组指针

c的指针数组和数组指针容易混淆&#xff0c;所以我们加个字&#xff1a; 指针的数组和数组的指针 所谓指针数组&#xff0c;就是指针的数组&#xff0c;就是由指针组成的数组。重点在后面的两个字&#xff1a;数组 所谓数组指针&#xff0c;就是数组的指针&#xff0c;就是指向…

基于协调过滤算法商品推荐系统的设计#计算机毕业设计

基于协调过滤算法商品推荐系统的设计#计算机毕业设计 管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;商品管理&#xff0c;论坛管理&#xff0c;商品资讯管理 前台账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;论坛&#xf…

MySQL-二进制部署-配置systemctl管理脚本(一)

一 二进制部署MySQL 参考二进制部署mysql 二 MySQL启动&关闭命令 mysqld_sqfe 是 mysqld 父进程&#xff0c;用那个启动都可以 ##启动命令 /usr/local/mysql/bin/mysqld_safe --defaults-file/data/mysql/conf/my.cnf & /usr/local/mysql/bin/mysqld --defaults-fil…

数字校园的优势有哪些

数字化时代下&#xff0c;数字校园已成为教育领域一股显著趋势。数字校园旨在借助信息技术工具对传统校园进行改造&#xff0c;提供全新的教学、管理和服务方式。那么&#xff0c;数字校园究竟具备何种优势&#xff1f;现从三个方面为您详细介绍。 首先&#xff0c;数字校园为教…

STM32项目分享:智能家居(机智云)系统

目录 一、前言 二、项目简介 1.功能详解 2.主要器件 三、原理图设计 四、PCB硬件设计 1.PCB图 2.PCB板及元器件图 五、程序设计 六、实验效果 七、资料内容 项目分享 一、前言 项目成品图片&#xff1a; 哔哩哔哩视频链接&#xff1a; https://www.bilibili.c…

如何使用ERC-20与Sui Coin标准创建Token

区块链使用tokens作为传递价值的基本手段。它们可以是区块链的原生交换单位&#xff0c;也可以是应用中的交换单位&#xff0c;甚至可以在游戏世界中用作货币。tokens还支持Sui和其他区块链上的强大DeFi活动。 以太坊使用ERC-20标准来创建tokens&#xff0c;借用智能合约&…

步态控制之ZMP

零力矩点(Zero Moment Point,ZMP)概述 ZMP步态控制是人形机器人步态控制中的一个关键概念,旨在确保机器人在行走或站立过程中保持平衡。ZMP是指机器人接触面上力矩为零的点,确保在该点上机器人不会倾倒。这个示例展示了ZMP步态控制的基本原理和实现方法。实际应用中,机器…

Redisson 源码分析 —— 调试环境搭建

本文基于 Redisson 3.11.4-SNAPSHOT 版本 依赖工具 MavenGitJDKIntelliJIDEA 源码拉取 从官方仓库 https://github.com/redisson/redisson Fork 出属于自己的仓库。 为什么要 Fork &#xff1f;既然开始阅读、调试源码&#xff0c;我们可能会写一些注释&#xff0c;有了自…

【Spring Cloud】Ribbon详细介绍及底层原理分析

目录 核心功能 Ribbon 的工作原理 底层原理及代码详解 1. ServerList 2. IRule 3. IPing 4. ServerListUpdater 使用场景 实际使用示例 1. 使用 RestTemplate 与 Ribbon 集成 2. 使用 Feign 与 Ribbon 集成 Ribbon 是 Netflix 开源的一款客户端负载均衡器&#xff0…