企业级API网关实战:从Spring Cloud Gateway到微服务治理全解析

news2026/5/15 9:07:21
1. 项目概述从单体应用到服务枢纽的演进在微服务架构成为主流的今天一个稳定、高效且功能丰富的API网关API Gateway是连接前端应用与后端众多服务的核心枢纽。我最近在梳理团队的技术栈时深入研究了adaline/gateway这个项目。它并非一个广为人知的通用开源网关而更像是一个基于特定技术栈如Spring Cloud Gateway或类似理念深度定制和封装的内部网关解决方案。这个名字本身“Adaline”可能是一个内部代号或业务系统的名称而“Gateway”则清晰地指明了它的职责。对于任何正在从单体应用向微服务转型或正在优化现有微服务治理体系的团队来说构建或选型一个合适的网关都是无法绕开的关键环节。本文将从一个资深开发者的视角深度拆解一个企业级API网关以adaline/gateway为引子所应具备的核心能力、设计思路、实现细节以及那些在官方文档里不会写的“踩坑”经验。无论你是正在自研网关还是评估Spring Cloud Gateway、Kong、APISIX等开源方案这里面的设计权衡和实操要点都具有直接的参考价值。2. 网关的核心职责与架构设计解析2.1 为什么需要API网关在微服务架构下一个前端应用可能需要调用数十个甚至上百个后端服务。如果让客户端直接与所有服务通信会带来一系列棘手问题客户端需要知道所有服务的网络位置IP和端口这几乎不可能动态维护每个服务都需要实现通用的横切关注点Cross-cutting Concerns如认证、限流、监控造成代码重复和标准不一服务协议的差异如gRPC、HTTP/1.1、WebSocket也需要客户端逐一适配。API网关的出现就是为了解决这些问题。它作为系统的唯一入口将所有非业务功能的逻辑从后端服务中剥离出来形成一个统一的策略执行层。对于adaline/gateway这类项目其首要目标就是为“Adaline”这个业务体系提供一个统一的、安全的、可控的服务接入点。2.2 企业级网关的核心功能矩阵一个成熟的企业级网关其功能远不止简单的请求转发。我们可以将其核心能力归纳为以下几个维度路由与负载均衡这是网关的基石。它必须能够根据请求的路径、方法、Header等信息将请求精准地路由到后端的某个服务实例。同时需要集成负载均衡算法如轮询、随机、加权、最少连接数等将流量合理地分发到健康的实例上实现高可用。安全与认证鉴权作为入口网关是实施安全策略的第一道防线。这包括身份认证集成OAuth 2.0、JWT、API Key等认证方式验证请求者的身份。权限校验根据用户角色或权限列表判断其是否有权访问目标接口。防攻击基础的黑白名单IP过滤、请求签名验证等。流量治理与可观测性限流防止突发流量打垮后端服务支持针对服务、API、用户等多维度的速率限制如令牌桶、漏桶算法。熔断与降级当某个下游服务响应缓慢或失败率过高时快速失败熔断或返回预设的兜底响应降级避免故障蔓延。监控与日志记录所有经过网关的请求和响应日志集成Metrics如QPS、延迟、错误率并输出到监控系统如Prometheus为问题排查和性能分析提供数据支撑。请求/响应转换协议转换例如将外部的HTTP/1.1请求转换为内部服务间的gRPC调用。数据格式转换如XML到JSON的转换。请求/响应增强添加统一的请求头如链路追踪ID或对响应进行统一的包装和过滤。adaline/gateway的设计必然围绕着上述一个或多个核心功能展开并根据其业务特点进行强化或裁剪。2.3 技术选型自研 vs 基于开源二次开发这是项目启动初期最关键的决定。完全自研能获得最大的灵活度和定制能力但需要极高的技术储备和持续的维护成本。目前基于成熟的开源项目进行二次开发是更主流和务实的选择。常见的基石包括Spring Cloud Gateway基于Spring Framework 5、Project Reactor和Spring Boot 2构建的响应式API网关。它通过定义路由Route、断言Predicate和过滤器Filter来工作与Spring Cloud生态无缝集成适合Java技术栈的团队。adaline/gateway有很大概率是基于此构建的。Netflix ZuulSpring Cloud早期的网关组件基于Servlet阻塞模型。在2.x版本尝试向异步非阻塞转型但未成主流目前社区活跃度已不如Spring Cloud Gateway。Kong基于Nginx和OpenResty使用Lua语言编写插件性能极高生态丰富。部署模式通常需要额外的数据库如PostgreSQL。Apache APISIX基于Nginx和etcd动态路由和插件热加载能力非常突出性能强劲是目前非常活跃的开源项目。选型考量点技术栈匹配团队熟悉Java则Spring Cloud Gateway是自然之选熟悉Nginx/Lua则Kong/APISIX更佳。性能要求对吞吐量和延迟有极致要求可倾向Kong/APISIX。动态配置是否需要不重启网关就能更新路由和插件规则APISIX和Spring Cloud Gateway结合配置中心支持较好。生态与插件评估开源生态中是否有满足需求的插件或自研插件的难度。假设adaline/gateway基于Spring Cloud Gateway那么其核心架构就是通过定义一系列RouteLocatorBean来配置路由规则并通过自定义或内置的GatewayFilter来实现各种业务逻辑。3. 核心模块深度实现与配置详解3.1 动态路由配置中心集成静态配置写在YAML文件中的路由在服务上下线时需要重启网关这在生产环境是不可接受的。因此集成配置中心如Nacos、Consul、Apollo实现动态路由是必选项。以Spring Cloud Gateway集成Nacos为例依赖引入在pom.xml中添加Spring Cloud Gateway和Spring Cloud Alibaba Nacos Discovery的依赖。配置拉取与监听网关启动时从Nacos读取初始的路由配置。更重要的是需要监听Nacos中特定配置DataId的变化。路由刷新机制当监听到配置变更时触发Spring Cloud Gateway内部的路由定义刷新事件RefreshRoutesEvent。这通常需要自定义一个RouteDefinitionLocator的实现。# 示例从Nacos读取的动态路由配置数据结构 (adaline-gateway-routes.yaml) spring: cloud: gateway: routes: - id: user-service-route uri: lb://user-service # lb:// 表示负载均衡到名为user-service的服务 predicates: - Path/api/v1/users/** filters: - StripPrefix1 # 去掉路径前缀 /api/v1 - name: CircuitBreaker args: name: userServiceBreaker fallbackUri: forward:/fallback/user - id: order-service-route uri: lb://order-service predicates: - Path/api/v1/orders/** filters: - StripPrefix1 - AddRequestHeaderX-Request-From, gateway-adaline关键实现细节序列化存储在配置中心的路由配置需要被序列化和反序列化。确保你的配置格式如YAML、JSON与网关的解析器兼容。监听性能避免过于频繁的配置变更推送或对路由进行全量刷新这可能导致网关性能抖动。可以考虑增量更新或批量更新策略。版本与回滚配置中心应支持配置的版本管理。当新路由规则导致问题时能快速回滚到上一个稳定版本。3.2 统一认证与鉴权过滤器实现安全是网关的重中之重。我们通常实现一个全局的GlobalFilter来处理认证和鉴权。Component Order(Ordered.HIGHEST_PRECEDENCE) // 设置高优先级确保最先执行 public class AuthGlobalFilter implements GlobalFilter { Autowired private AuthService authService; // 自定义的认证服务可能调用独立的用户中心 Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { ServerHttpRequest request exchange.getRequest(); String path request.getPath().value(); // 1. 检查是否为白名单路径如登录、健康检查 if (isWhiteList(path)) { return chain.filter(exchange); } // 2. 从请求头获取Token String token request.getHeaders().getFirst(Authorization); if (StringUtils.isEmpty(token) || !token.startsWith(Bearer )) { return unauthorizedResponse(exchange, Missing or invalid token); } token token.substring(7); // 3. 验证Token并获取用户上下文 UserInfo userInfo authService.validateToken(token); if (userInfo null) { return unauthorizedResponse(exchange, Token is invalid or expired); } // 4. 权限校验可选根据路径和用户角色判断 if (!authService.hasPermission(userInfo, path, request.getMethod())) { return forbiddenResponse(exchange, Insufficient permissions); } // 5. 将用户信息放入请求头传递给下游服务 ServerHttpRequest mutatedRequest request.mutate() .header(X-User-Id, userInfo.getUserId()) .header(X-User-Roles, String.join(,, userInfo.getRoles())) .build(); return chain.filter(exchange.mutate().request(mutatedRequest).build()); } private MonoVoid unauthorizedResponse(ServerWebExchange exchange, String message) { ServerHttpResponse response exchange.getResponse(); response.setStatusCode(HttpStatus.UNAUTHORIZED); response.getHeaders().add(Content-Type, application/json); String body String.format({\code\: 401, \message\: \%s\}, message); DataBuffer buffer response.bufferFactory().wrap(body.getBytes(StandardCharsets.UTF_8)); return response.writeWith(Mono.just(buffer)); } // ... 其他辅助方法 }实操心得Token无状态化使用JWT作为Token可以避免网关每次鉴权都查询用户数据库但需注意JWT的密钥安全性和过期时间管理。 revocation list吊销列表对于需要强制下线用户的场景是必要的补充。权限模型网关层面的权限校验宜粗不宜细通常做接口级别的路径匹配即可。细粒度的数据权限建议放在业务服务内部实现以保持网关的轻量和高效。性能缓存对于用户权限信息可以在网关本地使用Caffeine或Redis做短期缓存避免对认证服务的高频调用。3.3 高性能限流与熔断集成流量治理是保障系统稳定的关键。Spring Cloud Gateway可以方便地集成Resilience4j库来实现限流和熔断。限流配置示例spring: cloud: gateway: routes: - id: limited-route uri: lb://backend-service predicates: - Path/api/** filters: - name: RequestRateLimiter args: redis-rate-limiter.replenishRate: 10 # 每秒产生的令牌数稳定速率 redis-rate-limiter.burstCapacity: 20 # 令牌桶总容量突发流量 redis-rate-limiter.requestedTokens: 1 # 每个请求消耗的令牌数 key-resolver: #{userKeyResolver} # 限流维度按用户你需要定义一个KeyResolverBean来决定限流的Key如按用户ID、IP或接口。Bean KeyResolver userKeyResolver() { return exchange - { // 从请求头或Token中解析出用户ID String userId exchange.getRequest().getHeaders().getFirst(X-User-Id); if (StringUtils.isEmpty(userId)) { userId anonymous; } return Mono.just(userId); }; }熔断配置示例resilience4j.circuitbreaker: instances: backendService: registerHealthIndicator: true slidingWindowSize: 10 # 滑动窗口大小 minimumNumberOfCalls: 5 # 最小调用次数低于此数不触发熔断计算 permittedNumberOfCallsInHalfOpenState: 3 # 半开状态允许的调用次数 automaticTransitionFromOpenToHalfOpenEnabled: true waitDurationInOpenState: 10s # 熔断开启后等待多久进入半开状态 failureRateThreshold: 50 # 失败率阈值超过则开启熔断 eventConsumerBufferSize: 10 spring: cloud: gateway: routes: - id: circuit-breaker-route uri: lb://backend-service predicates: - Path/api/backend/** filters: - name: CircuitBreaker args: name: backendService # 对应上面的实例名 fallbackUri: forward:/fallback/backend # 熔断后的降级地址注意事项限流维度选择按用户限流最公平但需要认证信息按IP限流简单但可能误伤如公司出口IP相同按接口限流是通用做法。通常需要组合使用。熔断器参数调优slidingWindowSize、failureRateThreshold和waitDurationInOpenState需要根据下游服务的实际性能如平均响应时间、可接受的错误率进行压测和调整。设置过于敏感会导致不必要的熔断过于迟钝则失去保护作用。降级逻辑fallbackUri指向的降级接口逻辑要简单、快速且不依赖其他不稳定服务。通常返回一个默认值、缓存数据或友好的提示信息。3.4 全链路追踪与日志聚合在微服务调用链中网关是第一个节点必须负责生成或传递追踪标识。TraceId与SpanId传递集成Spring Cloud Sleuth可以自动完成。确保网关的过滤器在转发请求前将traceId和spanId添加到请求头中如X-B3-TraceId,X-B3-SpanId。下游服务也需要集成Sleuth或其他兼容的追踪库来继续传递。结构化日志不要使用简单的System.out.println。使用SLF4JLogback/Log4j2并输出为JSON格式便于日志收集系统如ELK Stack进行解析和索引。日志中必须包含traceId、userId、请求路径、响应状态码、耗时等关键字段。访问日志独立输出为了不影响业务日志的分析建议将网关的访问日志Access Log输出到独立的文件或Appender中。这可以通过自定义一个记录请求/响应信息的GlobalFilter来实现。Component Order(Ordered.LOWEST_PRECEDENCE - 1) // 在最后执行确保能记录到响应状态和耗时 public class AccessLogFilter implements GlobalFilter { private static final Logger ACCESS_LOG LoggerFactory.getLogger(ACCESS_LOG); Override public MonoVoid filter(ServerWebExchange exchange, GatewayFilterChain chain) { long startTime System.currentTimeMillis(); ServerHttpRequest request exchange.getRequest(); String traceId request.getHeaders().getFirst(X-B3-TraceId); return chain.filter(exchange).doFinally(signalType - { long duration System.currentTimeMillis() - startTime; ServerHttpResponse response exchange.getResponse(); int statusCode response.getStatusCode() ! null ? response.getStatusCode().value() : 0; // 结构化日志输出为JSON MapString, Object logMap new LinkedHashMap(); logMap.put(timestamp, Instant.now().toString()); logMap.put(traceId, traceId); logMap.put(method, request.getMethodValue()); logMap.put(path, request.getURI().getPath()); logMap.put(query, request.getURI().getQuery()); logMap.put(remoteAddr, request.getRemoteAddress() ! null ? request.getRemoteAddress().getAddress().getHostAddress() : ); logMap.put(status, statusCode); logMap.put(durationMs, duration); logMap.put(userAgent, request.getHeaders().getFirst(User-Agent)); // 使用JSON序列化工具输出如Jackson try { ACCESS_LOG.info(new ObjectMapper().writeValueAsString(logMap)); } catch (JsonProcessingException e) { ACCESS_LOG.warn(Failed to write access log, e); } }); } }4. 生产环境部署、监控与问题排查实录4.1 高可用部署架构网关作为流量入口绝对不能是单点。常见的部署模式是集群化部署前面通过负载均衡器如F5、Nginx、云厂商的SLB进行流量分发。无状态设计确保网关实例本身是无状态的。所有配置路由、限流规则都应来自外部的配置中心Nacos、Apollo所有会话状态如限流计数器应使用共享存储如Redis。这样任何一个实例宕机流量可以无缝切换到其他实例。健康检查负载均衡器需要配置对网关实例的健康检查端点如/actuator/health。Spring Boot Actuator提供了此功能。滚动更新在Kubernetes环境中可以通过Deployment实现网关服务的零停机滚动更新。确保新版本实例完全启动并健康后再逐步替换旧实例。4.2 全面的监控指标没有监控的系统就是在“裸奔”。网关需要暴露的关键Metrics包括系统层面CPU使用率、内存使用率、GC情况、线程池状态。应用层面Spring Boot Actuator Micrometer Prometheusgateway.requests总请求数按路由ID、状态码、方法等标签区分。gateway.request.duration请求耗时分布直方图。resilience4j.circuitbreaker.state熔断器状态0关闭1半开2打开。resilience4j.circuitbreaker.calls熔断器调用次数成功、失败、被拒绝。resilience4j.ratelimiter.waiting_threads限流器等待线程数。业务层面可以自定义Metrics如按用户或接口分组的QPS、错误率。在Grafana中将这些指标可视化设置合理的告警规则如错误率1%持续5分钟P99延迟1秒。4.3 典型问题排查与修复记录在实际运维adaline/gateway或类似网关时以下是我遇到过的典型问题及解决思路问题一网关CPU突然飙升响应变慢。排查步骤使用top -Hp [gateway_pid]查看哪个线程CPU高。通过jstack [gateway_pid]获取线程堆栈分析高CPU线程在做什么。常见情况是陷入死循环、频繁GC。检查网关日志是否有大量错误或异常堆栈特别是限流、熔断或自定义过滤器中的逻辑。查看监控是否某个下游服务响应变慢导致网关线程池被占满如果使用Tomcat等阻塞模型。可能原因与解决自定义过滤器Bug例如在过滤器中进行了低效的同步阻塞调用如JDBC查询应改为异步非阻塞。心得在Spring Cloud Gateway的响应式编程模型中任何可能阻塞的操作IO、复杂计算都应包装在Mono.fromCallable或使用Schedulers.parallel()切换到弹性线程池执行绝不能阻塞Netty的EventLoop线程。下游服务雪崩下游服务大面积超时或宕机导致网关熔断器频繁触发且降级逻辑也可能很重。需要先治理下游服务同时优化降级逻辑使其快速返回。内存泄漏/频繁Full GC使用jmap和jstat分析内存使用和GC情况。可能是缓存未设置TTL或某个集合对象无限增长。问题二部分用户反馈“认证失败”但其他用户正常。排查步骤根据用户提供的请求时间、TraceId在日志系统中定位该用户的请求日志。检查认证过滤器日志看Token解析是否失败或调用认证服务是否超时/出错。确认该用户的Token是否已过期或被加入吊销列表。检查网关集群各实例的时间是否同步JWT校验依赖时间。使用NTP服务确保时间一致。可能原因与解决时钟漂移网关服务器时钟比认证服务器快或慢超过JWT的允许时间误差leeway。统一所有服务器的时间同步服务。Token吊销列表Blacklist不同步如果使用Redis存储吊销列表确保网关所有实例连接的是同一个Redis集群或主从同步正常。心得对于吊销列表这类强一致性要求不高的数据可以适当增加本地缓存并设置较短的过期时间以减少对Redis的访问压力同时通过发布订阅机制在列表更新时通知各网关实例刷新本地缓存。问题三动态路由更新后部分请求仍被路由到旧地址。排查步骤确认配置中心如Nacos中的路由配置已成功更新并发布。检查网关日志看是否收到了配置变更事件并成功刷新了路由。检查网关的内存中当前生效的路由定义是否已是新版本。可以通过/actuator/gateway/routes端点查看。检查客户端或负载均衡器是否有DNS缓存或长连接未断开。可能原因与解决本地缓存网关内部或集成的服务发现客户端如Ribbon可能有本地缓存。需要检查并确保缓存刷新机制生效。在Spring Cloud Gateway中RouteDefinitionLocator的刷新可能需要手动触发或依赖Spring Cloud Bus。事件监听丢失配置中心的监听器可能因为网络抖动或异常重启而失效。需要增加监听器的心跳和重连机制并在网关启动时强制拉取最新配置。问题四限流不准确在突发流量下仍有大量请求穿透。排查步骤检查限流配置的burstCapacity突发容量是否设置过大。检查Redis限流器的性能。如果Redis成为瓶颈限流计数会不准确。确认限流的key-resolver是否正确。如果是按IP限流是否因为请求经过代理如Nginx、CDN导致获取的是代理服务器的IP而非真实用户IP。可能原因与解决Redis性能瓶颈所有限流计数都集中在Redis的一个Key上在高并发下会成为热点。解决方案是采用分布式限流算法或者将限流维度拆分得更细如按用户接口将压力分散到多个Key上。也可以考虑使用本地限流如Guava RateLimiter作为第一道防线结合分布式限流但要注意集群限流总量的准确性会下降。获取真实IP需要配置网关从X-Forwarded-For或X-Real-IP这样的标准头中提取真实客户端IP。在Spring Cloud Gateway中可以通过自定义过滤器来修改key-resolver的逻辑。构建和维护一个像adaline/gateway这样的企业级API网关是一个持续迭代和优化的过程。它不仅仅是技术的堆砌更是对流量治理、稳定性和开发效率的深度思考。从最初简单的路由转发到集成认证、限流、监控再到应对各种生产环境的突发状况每一个功能的添加和每一次故障的复盘都让这个核心组件变得更加健壮和可靠。我的体会是网关的稳定性直接决定了整个微服务体系的用户体验在设计和运维上多花一分心思就能在问题发生时减少十分慌乱。最后再分享一个小心得对于网关的每一次变更配置或代码一定要有灰度发布和快速回滚的方案因为它的影响面是全局性的。

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

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

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…