网关 Spring-Cloud-Gateway 源码解析 —— 网关初始化

Spring-Cloud-Gateway源码分析系列 | Spring-Cloud-Gateway之GatewayProperties初始化加载 推荐 Spring Boot/Cloud 视频: Java 微服务实践 - Spring Boot Java 微服务实践 - Spring Cloud 在Spring-Cloud-Gateway初始化时我们在GatewayAutoConfiguration配置中看到了有初始化加载GatewayProperties实例的配置,接下来学习下GatewayProperties都加载了哪些信息 Gat... 阅读详情

本文主要基于 Spring-Cloud-Gateway 2.0.X M4

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/init/ 「芋道源码」欢迎转载,保留摘要,谢谢!


������关注微信公众号:【芋道源码】有福利:
1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
3. 您对于源码的疑问每条留言都将得到认真回复。甚至不知道如何读源码也可以请教噢。
4. 新的源码解析文章实时收到通知。每周更新一篇左右。
5. 认真的源码交流微信群。


1. 概述

本文主要分享 Spring Cloud Gateway 启动初始化的过程。

在初始化的过程中,涉及到的组件会较多,本文不会细说,留到后面每篇文章针对每个组件详细述说。

那么这有什么意义呢?先对 Spring Cloud Gateway 内部的组件有整体的印象。


在官方提供的实例项目 spring-cloud-gateway-sample ,我们看到 GatewaySampleApplication 上有 @EnableAutoConfiguration 注解。因为该项目导入了 spring-cloud-gateway-core 依赖库,它会扫描 Spring Cloud Gateway 的配置。

在 org.springframework.cloud.gateway.config 包下,我们可以看到四个配置类 :

  • GatewayAutoConfiguration
  • GatewayClassPathWarningAutoConfiguration
  • GatewayLoadBalancerClientAutoConfiguration
  • GatewayRedisAutoConfiguration

它们的初始化顺序如下图 :


推荐 Spring Cloud 书籍:

推荐 Spring Cloud 视频:

2. GatewayClassPathWarningAutoConfiguration

Spring Cloud Gateway 2.x 基于 Spring WebFlux 实现。

org.springframework.cloud.gateway.config.GatewayClassPathWarningAutoConfiguration ,用于检查项目是否正确导入 spring-boot-starter-webflux 依赖,而不是错误导入 spring-boot-starter-web 依赖。

点击链接 链接 查看 GatewayClassPathWarningAutoConfiguration 的代码实现。

3. GatewayLoadBalancerClientAutoConfiguration

org.springframework.cloud.gateway.config.GatewayLoadBalancerClientAutoConfiguration ,初始化 LoadBalancerClientFilter ,点击 链接 查看代码。

在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.4) 之 LoadBalancerClientFilter 负载均衡》 详细解析 LoadBalancerClientFilter 的代码实现。

4. GatewayRedisAutoConfiguration

org.springframework.cloud.gateway.config.GatewayRedisAutoConfiguration ,初始化 RedisRateLimiter 。

RequestRateLimiterGatewayFilterFactory 基于 RedisRateLimiter 实现网关的限流功能,在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.10) 之 RequestRateLimiterGatewayFilterFactory 请求限流》 详细解析相关的代码实现。

5. GatewayAutoConfiguration

org.springframework.cloud.gateway.config.GatewayAutoConfiguration ,Spring Cloud Gateway 核心配置类,初始化如下 :

  • Netty**Configuration**
  • Global**Filter**
  • FilteringWeb**Handler**
  • Gateway**Properties**
  • PrefixPathGateway**FilterFactory**
  • Route**PredicateFactory**
  • Route**DefinitionLocator**
  • Route**Locator**
  • Route**PredicateHandlerMapping**
  • GatewayWebflux**Endpoint**

组件关系交互如下图 :

5.1 网关的开启与关闭

从 GatewayAutoConfiguration 上的注解 @ConditionalOnProperty(name = "spring.cloud.gateway.enabled", matchIfMissing = true) ,我们可以看出 :

  • 通过 spring.cloud.gateway.enabled 配置网关的开启与关闭。
  • matchIfMissing = true => 网关默认开启。

5.2 初始化 NettyConfiguration

org.springframework.cloud.gateway.config.NettyConfiguration ,Netty 配置类。代码如下 :

  1: @Configuration
  2: @ConditionalOnClass(HttpClient.class)
  3: protected static class NettyConfiguration {
  4:    @Bean // 1.2
  5:    @ConditionalOnMissingBean
  6:    public HttpClient httpClient(@Qualifier("nettyClientOptions") Consumer<? super HttpClientOptions.Builder> options) {
  7:        return HttpClient.create(options);
  8:    }
  9: 
 10:    @Bean // 1.1
 11:    public Consumer<? super HttpClientOptions.Builder> nettyClientOptions() {
 12:        return opts -> {
 13:            opts.poolResources(PoolResources.elastic("proxy"));
 14:            // opts.disablePool(); //TODO: why do I need this again?
 15:        };
 16:    }
 17: 
 18:    @Bean // 1.3
 19:    public NettyRoutingFilter routingFilter(HttpClient httpClient) {
 20:        return new NettyRoutingFilter(httpClient);
 21:    }
 22: 
 23:    @Bean // 1.4
 24:    public NettyWriteResponseFilter nettyWriteResponseFilter() {
 25:        return new NettyWriteResponseFilter();
 26:    }
 27: 
 28:    @Bean // 1.5 {@link org.springframework.cloud.gateway.filter.WebsocketRoutingFilter}
 29:    public ReactorNettyWebSocketClient reactorNettyWebSocketClient(@Qualifier("nettyClientOptions") Consumer<? super HttpClientOptions.Builder> options) {
 30:        return new ReactorNettyWebSocketClient(options);
 31:    }
 32: }
  • 每个 @Bean 注解后的数字为 Bean 的初始化顺序。
  • 第 10 至 16 行 :创建一个类型为 java.util.Objects.Consumer 的 Bean 对象。该 Consumer 会将传入类型为 reactor.ipc.netty.options.HttpClientOptions.Builder 的参数 opts ,设置 opts 的 poolResources 属性。
    • 调用 PoolResources.elastic("proxy") 方法,创建 name 属性为 "proxy" 的 reactor.ipc.netty.resources.PoolResources 。其中 "proxy" 用于实际使用时,打印日志的标记。
  • 第 4 至 8 行 :创建一个类型为 reactor.ipc.netty.http.client.HttpClient 的 Bean 对象。该 HttpClient 使用 Netty 实现的 Client 。
  • 第 18 至 21 行 :使用 HttpClient Bean ,创建一个类型为 org.springframework.cloud.gateway.filter.NettyRoutingFilter 的 Bean 对象。在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.7) 之 NettyRoutingFilter》 详细解析 NettyRoutingFilter 的代码实现。
  • 第 23 至 26 行 :创建一个类型为 org.springframework.cloud.gateway.filter.NettyWriteResponseFilter 的 Bean 对象。在 《Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.7) 之 NettyRoutingFilter》 详细解析 NettyWriteResponseFilter 的代码实现。
  • 第 28 至 31 行 :创建一个类型为 org.springframework.web.reactive.socket.client.ReactorNettyWebSocketClient 的 Bean 对象,用于下文 WebsocketRoutingFilter 的 Bean 对象创建。

5.3 初始化 GlobalFilter

代码如下 :

  1: @Bean // 2.1
  2: public RouteToRequestUrlFilter routeToRequestUrlFilter() {
  3:    return new RouteToRequestUrlFilter();
  4: }
  5: 
  6: @Bean // 2.2
  7: @ConditionalOnBean(DispatcherHandler.class)
  8: public ForwardRoutingFilter forwardRoutingFilter(DispatcherHandler dispatcherHandler) {
  9:    return new ForwardRoutingFilter(dispatcherHandler);
 10: }
 11: 
 12: @Bean // 2.3
 13: public WebSocketService webSocketService() {
 14:    return new HandshakeWebSocketService();
 15: }
 16: 
 17: @Bean // 2.4
 18: public WebsocketRoutingFilter websocketRoutingFilter(WebSocketClient webSocketClient, WebSocketService webSocketService) {
 19:    return new WebsocketRoutingFilter(webSocketClient, webSocketService);
 20: }

5.4 初始化 FilteringWebHandler

当所有 org.springframework.cloud.gateway.filter.GlobalFilter 初始化完成时( 包括上面的 NettyRoutingFilter / NettyWriteResponseFilter ),创建一个类型为 org.springframework.cloud.gateway.handler.FilteringWebHandler 的 Bean 对象,代码如下 :

@Bean // 2.6
public FilteringWebHandler filteringWebHandler(List<GlobalFilter> globalFilters) {
    return new FilteringWebHandler(globalFilters);
}

5.5 初始化 GatewayProperties

创建一个类型为 org.springframework.cloud.gateway.config.GatewayProperties 的 Bean 对象,用于加载配置文件配置的 RouteDefinition / FilterDefinition 。代码如下 :

@Bean // 2.7
public GatewayProperties gatewayProperties() {
    return new GatewayProperties();
}

5.6 初始化 PrefixPathGatewayFilterFactory

在 链接 的【第 288 至 372 行】,创建 org.springframework.cloud.gateway.filter.factory 包下的 org.springframework.cloud.gateway.filter.factory.GatewayFilterFactory 接口的实现们。

后续我们会对每个 GatewayFilterFactory 的实现代码做详细解析。

5.7 初始化 RoutePredicateFactory

在 链接 的【第 236 至 284 行】,创建 org.springframework.cloud.gateway.handler.predicate 包下的 org.springframework.cloud.gateway.handler.predicate.RoutePredicateFactory 接口的实现们。

后续我们会对每个 RoutePredicateFactory 的实现代码做详细解析。

5.8 初始化 RouteDefinitionLocator

代码如下 :

  1: @Bean // 4.1
  2: @ConditionalOnMissingBean
  3: public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(GatewayProperties properties) {
  4:    return new PropertiesRouteDefinitionLocator(properties);
  5: }
  6: 
  7: @Bean // 4.2
  8: @ConditionalOnMissingBean(RouteDefinitionRepository.class)
  9: public InMemoryRouteDefinitionRepository inMemoryRouteDefinitionRepository() {
 10:    return new InMemoryRouteDefinitionRepository();
 11: }
 12: 
 13: @Bean // 4.3
 14: @Primary // 优先被注入
 15: public RouteDefinitionLocator routeDefinitionLocator(List<RouteDefinitionLocator> routeDefinitionLocators) {
 16:    return new CompositeRouteDefinitionLocator(Flux.fromIterable(routeDefinitionLocators));
 17: }

org.springframework.cloud.gateway.discovery.DiscoveryClientRouteDefinitionLocator ,基于 DiscoveryClient 注册发现的 RouteDefinitionLocator 实现类,需要手动引入配置,点击 链接 查看。在 《Spring-Cloud-Gateway 源码解析 —— 路由(1.4)之 DiscoveryClientRouteDefinitionLocator 注册中心》 详细解析 DiscoveryClientRouteDefinitionLocator 的代码实现。

5.9 初始化 RouteLocator

代码如下 :

  1: @Bean // 4.4
  2: public RouteLocator routeDefinitionRouteLocator(GatewayProperties properties,
  3:                                               List<GatewayFilterFactory> GatewayFilters,
  4:                                               List<RoutePredicateFactory> predicates,
  5:                                               RouteDefinitionLocator routeDefinitionLocator) {
  6:    return new RouteDefinitionRouteLocator(routeDefinitionLocator, predicates, GatewayFilters, properties);
  7: }
  8: 
  9: @Bean // 4.5
 10: @Primary
 11: public RouteLocator routeLocator(List<RouteLocator> routeLocators) {
 12:    return new CachingRouteLocator(new CompositeRouteLocator(Flux.fromIterable(routeLocators)));
 13: }

另外,有如下两种方式实现自定义 RouteLocator :

  • 使用 Routes#locator()#build() 方法,创建 RouteLocator ,例子代码如下 :

    @Bean
    public RouteLocator customRouteLocator() {
        //@formatter:off
        return Routes.locator()
                .route("test")
                    .predicate(host("**.abc.org").and(path("/image/png")))
                    .addResponseHeader("X-TestHeader", "foobar")
                    .uri("http://httpbin.org:80")
                .route("test2")
                    .predicate(path("/image/webp"))
                    .add(addResponseHeader("X-AnotherHeader", "baz"))
                    .uri("http://httpbin.org:80")
                .build();
        ////@formatter:on
    }
  • 使用 RouteLocatorDsl#gateway() 方法,创建 RouteLocator ,该方式使用 Kotlin 实现,例子代码如下 :

    @Configuration
    class AdditionalRoutes {
    
        @Bean
        fun additionalRouteLocator(): RouteLocator = gateway {
            route(id = "test-kotlin") {
                uri("http://httpbin.org:80")
                predicate(host("kotlin.abc.org") and path("/image/png"))
                add(addResponseHeader("X-TestHeader", "foobar"))
            }
        }
    
    }

5.10 初始化 RoutePredicateHandlerMapping

创建一个类型为 org.springframework.cloud.gateway.handler.RoutePredicateHandlerMapping 的 Bean 对象,用于查找匹配到 Route ,并进行处理。代码如下 :

@Bean
public RoutePredicateHandlerMapping routePredicateHandlerMapping(FilteringWebHandler webHandler,
                                                                   RouteLocator routeLocator) {
    return new RoutePredicateHandlerMapping(webHandler, routeLocator);
}

5.11 初始化 GatewayWebfluxEndpoint

创建一个类型为 org.springframework.cloud.gateway.actuate.GatewayWebfluxEndpoint 的 Bean 对象,提供管理网关的 HTTP API ,代码如下 :

@ManagementContextConfiguration
@ConditionalOnProperty(value = "management.gateway.enabled", matchIfMissing = true)
@ConditionalOnClass(Health.class)
protected static class GatewayActuatorConfiguration {

    @Bean
    public GatewayWebfluxEndpoint gatewayWebfluxEndpoint(RouteDefinitionLocator routeDefinitionLocator, List<GlobalFilter> globalFilters,

        List<GatewayFilterFactory> GatewayFilters, RouteDefinitionWriter routeDefinitionWriter,
                                                         RouteLocator routeLocator) {
        return new GatewayWebfluxEndpoint(routeDefinitionLocator, globalFilters, GatewayFilters, routeDefinitionWriter, routeLocator);
    }
}

666. 彩蛋

知识星球

是不是内心里面有种感觉,“劳资看了一堆构造函数”?

嘿嘿嘿,后面咱一篇一篇走起!

胖友,分享一波朋友圈可好!

Spring 源码硬核解析系列专题(二十):Spring Cloud Gateway 的网关路由源码解析 在前几期中,我们从 Spring 核心到 Spring Boot 的多个模块,再到 Spring Data Redis,逐步揭示了 Spring 生态在微服务领域的广泛应用。Spring Cloud Gateway 是 Spring Cloud 的网关组件,提供路由、过滤和负载均衡等功能,基于响应式编程模型。本篇将深入 Spring Cloud Gateway 的源码,剖析其核心机制与实现原理,并补充图示。 阅读详情

相关推荐

spring cloud gateway过滤器及执行顺序

一、图谱 在Spring-Cloud-Gateway之请求处理流程中最终网关是将请求交给过滤器链表进行处理。 核心接口:GatewayFilter(网关过滤器),GlobalFilter(全局过滤器),GatewayFilterChain(过滤器链)。 类关联图: 二、为什么使用网关过滤器 现在流行的微服务,整个项目包含很多个服务,如果没有网关这层,那么我们通过什么方式来限制访问呢?难道在每个服...

SuperBins的博客 1万+

spring cloud gateway 启动流程及原理分析

https://www.jianshu.com/p/9b813f6ca4c2 spring cloud gateway 作为新一代的微服务网关已经发布了一段时间,我从7月份开始使用到现在已经4个月了。但是我一直处于一种只会使用,原理一知半解的水平。我们小组作为公司微服务产品的实践者,我自己作为组中一员完成了spring cloud gateway的开发,也解决了很多棘手的问题,却对它的原理和启动...

3817

spring cloud gateway 源码解析

Spring Cloud Gateway 是基于 Spring WebFlux 的响应式网关框架,其核心依赖 starter-gateway 和 starter-webflux。starter-webflux 使用 Reactor Netty 作为嵌入式反应式 HTTP 服务器,负责处理请求。通过分析源码,网关的启动过程涉及 ReactiveWebServerFactoryAutoConfiguration 和 NettyReactiveWebServerFactory,最终在 finishRefresh

renzhe1301的专栏 1143

Spring Cloud Gateway系列【4】初始化加载流程源码解析

文章目录核心源码Route类AsyncPredicate接口ServerWebExchange 接口GatewayFilterRouteLocatorRouteDefinitionLocator接口RouteDefinition 类初始化加载流程1. 路由构建方式2. 加载配置3. 加载PropertiesRouteDefinitionLocator4. 加载RouteDefinitionRouteLocator5. 加载HandlerMapping、WebHandler5. 启动服务参考文档 核心源码 R

记录知识、锤炼自我 1759

网关 Spring-Cloud-Gateway 源码解析 —— 路由(1.1)之RouteDefinitionLocator一览

点击上方“芋道源码”,选择“置顶公众号”技术文章第一时间送达!源码精品专栏 中文详细注释的开源项目Java 并发源码合集RocketMQ 源码合集Sharding-JDB...

芋道源码 5496

网关 Spring-Cloud-Gateway 源码解析 —— 调试环境搭建

本文主要基于 Spring-Cloud-Gateway 2.0.X M4摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/build-debugging-environment/ 「芋道源码」欢迎转载,保留摘要,谢谢!1. 依赖工具2. 源码拉取3. 运行示例4. 彩蛋友情提示:欢迎关注公众号【芋道源码】。?关注后,拉你进【源码圈】微信群和【芋

芋道源码 3212

springcloud gateway踩大坑了Parameter 0 of method websocketRoutingFilter in org.springframework.cloud.gat

pom <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> 只有网关依赖 Spring Boot 版本是 2.1.0.RELEASE, Spring Clound 版本是Finchley.RELEASE applica

保暖透气大裤衩LeoLee的博客 4252

Spring Cloud Gateway(十):网关过滤器工厂 GatewayFilterFactory

本文基于 spring cloud gateway 2.0.1 1、GatewayFilterFactory 简介 路由过滤器允许以某种方式修改传入的HTTP请求或传出的HTTP响应。 路径过滤器的范围限定为特定路径。 Spring Cloud Gateway包含许多内置的GatewayFilter工厂。 网关过滤器工厂接口有多个实现类,在每个 GatewayFilterFactory 实现类...

码客 1万+

Spring-Cloud-Gateway 源码解析 —— 网关初始化

1. 概述 本文主要分享Spring Cloud Gateway 启动初始化的过程。 在初始化的过程中,涉及到的组件会较多,本文不会细说,留到后面每篇文章针对每个组件详细述说。 那么这有什么意义呢?先对 Spring Cloud Gateway 内部的组件有整体的印象。 在官方提供的实例项目spring-cloud-gateway-sample,我们看到 GatewaySampleApplication 上有@EnableAutoConfiguration注解。因为该项目导入了sprin...

weixin_42073629的博客 1187

Spring Cloud Gateway 之动态路由

通过 GatewayControllerEndpoint 和 AbstractGatewayControllerEndpoint 类的源码,我们可以知道 Gateway 提供获取路由信息、过滤器、断言等接口,这里面我们重点关注了的关于路由部分的,也是源码中涉及较多的,这两个类的源码提供了路由的增删改查及刷新的接口。AbstractGatewayControllerEndpoint#refresh 路由刷新功能,逻辑很简单,使用了事件监听的机制,发布了一个路由刷新事件。

brhhh_sehe的博客 1089

源码深度剖析Spring Cloud Gateway如何处理一个请求只能那么细了

史无前例最详细版源码剖析Spring Cloud Gateway如何处理一个请求? 含:ReactorHttpHandlerAdapter接收请求、HttpWebHandlerAdapter解析请求、WebFilterChain做Web层面的过滤、DispatcherHandler处理请求、RoutePredicateHandlerMapping获取Route路由规则、核心过滤器链FilterWebHandler最后过滤请求............

健身变秃,coding变强 1万+

Spring Cloud Gateway源码解析

文章概览一、概述二、GlobalFilter和GatewayFilter1.GlobalFilter2.GatewayFilter三、原理四、源码分析五、自定义GatewayFilter 一、概述 本周又回顾了一下Spring Cloud Gateway的内容,主要参考《重新定义Spring Cloud实战》以及一些网络博客,虽然内容都差不多,但我还想照猫画虎总结一下子,加深印象。 SpringCloud gateway是Spring Cloud生态体系的第二代网关,是基于Spring5.0、Spring

至尊宝 7566

Anaconda/Miniconda的删除和安装

要在 MacBook 上删除 Anaconda 或 Miniconda,并重新安装它,您可以按照以下步骤进行操作。

qq_27390023的博客 3026

Spring cloud gateway 详解和配置使用(文章较长)

目录 spring cloud gateway 介绍 1. 网关是怎么演化来的 2. 网关的基本功能 3.关于Spring Cloud Gateway 4.Spring Cloud Gateway 功能特征 5.predicate简介 6.GatewayFilter 工厂介绍 7.集成Hystrix的断路器功能 8.请求限流 pom.xml application.ym...

荡漾 21万+

鱼眼相机去畸变(图像拉直/展开/矫正)算法及实战总结

1、算法说明经纬度矫正法, 可以把鱼眼图想象成半个地球, 然后将地球展开成地图,经纬度矫正法主要是利用几何原理, 对图像进行展开矫正。经过P点的入射光线没有透镜的话,本应交于相机成像平面的e点。然而,经过鱼眼相机的折射,光线会交于相机成像平面的d点,就产生了畸变,因此畸变图像整体上呈现出像素朝图像中心点聚集的态势。而去畸变,就是将折射到d点的点,重新映射回到e点,因此去畸变之后的图像与原始的鱼眼图像相比,仿佛是把向心聚集的像素又重新向四周铺展开来。AVM环视系统——鱼眼相机去畸变算法 - 知乎。

大胡子大叔的专栏 2万+

FileZilla Server 1.2.0 TLS证书过期问题

FileZilla Server TLS证书过期后重新生成

Wigle的备忘录 7525

网关 Spring-Cloud-Gateway 源码解析 —— 过滤器 (4.8) 之 WebClientHttpRoutingFilter

摘要: 原创出处 http://www.iocoder.cn/Spring-Cloud-Gateway/filter-web-client-http-routing/ 「芋道源码」欢迎转载,保留摘要,谢谢! 本文主要基于 Spring-Cloud-Gateway 2.0.X M4 1. 概述 2. 环境配置 3. WebClientHttpRoutingFilter 4. WebClie...

芋艿V 1906

从SIGGRAPH审稿人视角看:什么样的TOG论文更容易被接收?

本文从SIGGRAPH审稿人视角深入解析TOG论文的审稿标准与投稿策略,揭示如何提升论文接收概率。重点探讨创新性、技术深度、实验验证等核心评分维度,并提供写作技巧与审稿意见应对策略,帮助研究者优化ACM Transactions on Graphics投稿质量。

weixin_33721344的博客 108

Spring Cloud Gateway实现分布式限流

小伙伴们,你们好呀!我是老寇!一起学习学习gateway限流。

. 1万+

【Docker】从零构建达梦DM8轻量级服务镜像:实战与优化

本文详细介绍了从零开始构建达梦DM8轻量级Docker镜像的完整实战流程。通过分析传统安装方式的痛点,阐述了使用Docker封装数据库的优势,并重点讲解了如何利用静默安装、精简组件、多阶段构建等优化技巧,打造一个体积小巧、启动迅速、配置灵活的DM8服务镜像,助力实现开发、测试与部署的环境一致性与高效性。

ooo22的博客 519

MaxKey+JeecgBoot单点登录实战:手把手教你从零配置到账户同步

本文提供MaxKey与JeecgBoot单点登录(SSO)的实战整合指南。详细讲解从MaxKey应用注册、JeecgBoot前后端改造,到最终实现账户同步的完整步骤,重点解决Shiro配置、令牌交换等关键问题,帮助企业构建统一、可扩展的身份管理体系。

weixin_29258297的博客 540
上一篇: 【死磕Java并发】-----J.U.C之并发工具类:CountDownLatch
下一篇: 【追光者系列】HikariCP连接池监控指标实战
公众号-芋道源码
博客等级 码龄10年 1628粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值