微服务网关的响应式实战:利用Reactor实现非阻塞动态配置
前言在微服务架构中,网关作为流量的门户,其稳定性和性能至关重要。在我的开源项目 ZAutumn-gateway 的开发过程中,为了实现动态路由与限流规则的热更新,我们将配置存入了Redis。但随之而来的是这样一个问题——如果采用传统的同步阻塞方式监听配置变更,那么在主流程(路由转发、熔断限流)中,关键的I/O线程很可能因等待配置更新而被阻塞,这将损害网关处理高并发请求的核心能力。 为了解决这一问题,我引入了响应式编程范式,并选用 Project Reactor 作为核心工具库,将配置更新的相关逻辑全部改造为异步非阻塞处理。这样一来,配置监听器在等待Redis消息时不会阻塞任何线程,当消息到达时才会异步地触发更新操作,从而确保了网关数据平面的高性能和响应性。 阅读本文前,您需要掌握: 微服务架构基础:微服务架构的基本思想、API 网关的角色(统一入口、路由、过滤等) 响应式编程范式:核心思想(异步非阻塞、数据流、变化传播)、背压(Backpressure)概念 Spring 技术栈:Spring Boot 基础(如注解配置、依赖注入)、Spring Cloud 生态的初...
Spring-Cloud-Gateway-路由定位器RouteLocator源码解析
前言在整理和优化 星云网关 的时候,顺便仔细看了看Spring Cloud Gateway源码 网关代码123456789101112131415161718192021222324252627/** * 动态路由定义定位器 */@Component("dynamicRouteDefinitionLocator")public class DynamicRouteDefinitionLocator implements RouteDefinitionLocator { private static final Logger logger = LoggerFactory.getLogger(DynamicRouteDefinitionLocator.class); private final RedisRouteDefinitionRepository repository; private final ApplicationEventPublisher eventPublisher; public DynamicRouteDe...
枚举转换的四种写法
前言:最近开发任务不重,在完成任务工作后,不由的思考起了各种写法的效率和适用场景。 比如下面这种情况 数据库查出来的executionStatus、executionResult我需要转换成executionStatusCH; (执行状态中文描述)、 executionResultCH; (执行结果中文描述) 实现在创建完两个枚举类:ExecutionStatusEnum ExecutionResultEnum后,有大概一下四种转换的写法。让我们一次介绍并且分析写法的效能和适用场景。 1. Lambda 表达式(推荐)1234vos.forEach(vo -> { vo.setExecutionStatusCH(ExecutionStatusEnum.getDescByCode(vo.getExecutionStatus())); vo.setExecutionResultCH(ExecutionResultEnum.getDescByCode(vo.getExecutionResult()));}); 优点:简洁、可读性强,符合现代...
windowsのwsl安装centos
打开虚拟化在安装 WSL 2 之前,必须启用虚拟机平台可选功能。计算机将需要虚拟化功能才能使用此功能。 执行命令(管理员) 1dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart Chocolatey安装NuGet(读作New Get)是用于微软.NET开发平台的软件包管理器,是一个Visual Studio的扩展。Chocolatey 是基于 NuGet 的一个软件包管理器,就像 Linux 中的 yum 或 apt 一样,在 Windows10 中也可以用命令行安装程序了 以管理员身份打开powershell.exe,执行以下代码 1Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1')) 完成后,输入命令:c...
快速排序和快速选择
快速排序1234567891011121314151617181920int Partition(int A[], int low, int high) { int pivot = A[low]; // 选择首元素作为基准 while (low < high) { while (low < high && A[high] >= pivot) --high; A[low] = A[high]; // 比基准小的元素移到左端 while (low < high && A[low] <= pivot) ++low; A[high] = A[low]; // 比基准大的元素移到右端 } A[low] = pivot; // 基准元素放入最终位置 return low;}void QuickSort(int A[], int low, int high) { if (low < hi...
GaussDB安装及应用
安装openGauss官网 我们选择极简版 .gjkfvzhxtcjx{width:70%} 由于有要求: 普通用户必须有数据库包解压路径、安装路径的读、写和执行操作权限,并且安装路径必须为空。 普通用户对下载的openGauss压缩包有执行权限。 因此我们直接useradd openGauss,在openGauss家目录下对tar.bz2进行解压 123456789101112useradd openGauss# 把openGauss-5.0.3-CentOS-64bit.tar.bz2 放在/home/openGauss下tar -jxf openGauss-5.0.3-CentOS-64bit.tar.bz2 cd /home/openGauss/simpleInstallchmod +x ./install.sh# 执行install.sh脚本安装openGauss# -w:初始化数据库密码(gs_initdb指定),因安全需要,此项必须设置。# -p:指定openGauss端口号,如不指定,默认为5432。sh install.sh -w "g...
prometheus&consul&blackboxTest
安装包地址:通过网盘分享的文件:链接: https://pan.baidu.com/s/1iBSiZ4baGzf8KWlhdnDv0w?pwd=9i1u 提取码: 9i1u 代码地址见文章末尾 虚拟机关闭防火墙: systemctl status firewalldsystemctl stop firewalldsystemctl disable firewalld Prometheus启动脚本startup-prometheus 123456789101112131415161718192021#!/bin/bashcd `dirname $0` # 替换为 Prometheus 的实际路径BASE_DIR=`pwd`echo `pwd`# 定义 Prometheus 的路径PROMETHEUS_PATH=$BASE_DIR/prometheus # 替换为 Prometheus 的实际路径PID_FILE=$BASE_DIR/prometheus.pid # 存储进程 ID 的文件LOG_FILE=$BASE_DIR/logs/prometheus.log # ...
hadoop与hive的安装和配置
ssh登录过程 连接请求 用户通过 SSH 客户端发起连接请求,指定目标主机和用户名,即ssh username@hostname 服务器响应 服务器收到连接请求后,会发送一个公钥给客户端。 公钥验证 客户端收到服务器发送的公钥后,会检查这个公钥是否在自己的 known_hosts 文件中。如果没有找到,会发出警告,询问用户是否信任这个公钥,用户可以选择是或否。 1234ssh 111.229.25.127The authenticity of host '111.229.25.127 (111.229.25.127)' can't be established.ECDSA key fingerprint is SHA256:1OLYAxTlNkqPEPqX4n2Pvcg8hBzYbqD+UOfVTseEMYo.Are you sure you want to continue connecting (yes/no/[fingerprint])? yes 生成会话密钥 如果客户端接受了服务器的公钥,客户端会生成一个称为会话密钥(session ...
Docker基本用法
基础安装123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869#【可选】centos8配置yum源cd /etc/yum.repos.drm -rf ./*curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-8.repo yum -y clean all #清除所有文件yum -y makecache #建立缓存yum repolist #查看yum仓库信息# 移除旧版本dockersudo yum remove docker \ docker-client \ docker-client-latest \ docker-common \ ...
处理幂等性
代码地址 ruoyi脚手架是通过参数去判断: 把请求缓存起来到redis里面去【请求地址、请求参数…】 比如:请求地址和请求参数都是一样的话,10秒只能就拒绝重复提交 但这个方法存在一个问题:如果请求的参数是json,一旦我提取出来,将来在接口里面就提取不到了,所以我们先要把这个问题解决掉 **所需依赖:**springweb、redis、aop 1234567891011121314151617181920<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId>...
