Spring Boot 3.4 正式发布,结构化日志!

1 从 Spring Boot 3.3 升级到 3.4

1.1 RestClient 和 RestTemplate

新增对 RestClientRestTemplate 自动配置的支持,可用 Reactor Netty 的 HttpClient 或 JDK 的 HttpClient。支持的客户端优先级:

  • Apache HTTP Components (HttpComponentsClientHttpRequestFactory)
  • Jetty Client (JettyClientHttpRequestFactory)
  • Reactor Netty 的 HttpClient (ReactorClientHttpRequestFactory)
  • JDK 的 HttpClient (JdkClientHttpRequestFactory)
  • 简单的 JDK HttpURLConnection (SimpleClientHttpRequestFactory)

若类路径没有 HTTP 客户端库,默认可能用 JdkClientHttpRequestFactory,而非之前的 SimpleClientHttpRequestFactory。可以通过设置 spring.http.client.factory 来选择特定客户端,支持的值包括 http-componentsjettyreactorjdksimple

所有五个客户端默认会遵循重定向。如需禁用此行为,可以将 spring.http.client.redirects 设置为 dont-follow

1.2 Apache HTTP Components 和 Envoy

Apache HTTP Components 的 HttpClient 在 HTTP/1.1 的 TLS 升级默认行为有所改变。虽然大多数代理服务器可以正确处理升级,但使用 Envoy 或 Istio 时可能会遇到问题。

如果需要恢复以前的行为,可用新的 ClientHttpRequestFactoryBuilder。定义一个 HttpComponentsClientHttpRequestFactoryBuilder 并按以下方式自定义:

@Bean
public HttpComponentsClientHttpRequestFactoryBuilder httpComponentsClientHttpRequestFactoryBuilder() {return ClientHttpRequestFactoryBuilder.httpComponents().withDefaultRequestConfigCustomizer((builder) -> builder.setProtocolUpgradeEnabled(false));
}
1.3 配置属性的 Bean 验证

之前,当一个 @ConfigurationProperties 类标注了 @Validated 并通过 Bean Validation(如 Hibernate Validator)实现进行验证时,其嵌套属性会在绑定时被验证,无论是否使用 @Valid

Spring Boot 3.4 开始,验证行为与 Bean Validation 规范一致。验证从 @ConfigurationProperties 注解的类开始,并仅在嵌套属性对应的字段标注了 @Valid 时才进行级联验证。

升级时,请检查使用了 Bean Validation 约束的 @ConfigurationProperties 类,并在需要对嵌套属性进行级联验证的地方添加 @Valid

1.4 基于 Bean 的条件

@ConditionalOnBean@ConditionalOnMissingBean@Bean 方法中使用并设置了 annotation 属性时,其行为有所更改。两者仍然默认使用 @Bean 方法的返回类型作为匹配的默认类型。然而,从 Spring Boot 3.4 开始,如果设置了 annotation,此默认值将不会被使用。如果需要恢复以前的行为,请同时指定一个与 @Bean 方法返回类型一致的 valueannotation

1.5 优雅关机

嵌入式 Web 服务器(Jetty、Reactor Netty、Tomcat 或 Undertow)的优雅关机功能现已默认启用。如需恢复之前的立即关机行为, server.shutdownimmediate

1.6 Paketo Tiny Builder 用于构建 OCI 镜像

在使用 Maven 的 spring-boot:build-image 目标为 JVM 应用程序构建 OCI 镜像时,默认的 Cloud Native Buildpacks 构建器已从 paketobuildpacks/builder-jammy-base 更改为 paketobuildpacks/builder-jammy-java-tiny。这将生成更小的镜像。但由于 tiny 构建器不包含 shell,因此可能无法适用于需要通过启动脚本运行的应用程序。有关自定义构建器的详细信息,请参阅 Maven 文档。

1.7 使用 Testcontainers 定义动态属性

通过将 DynamicPropertyRegistry 注入到 @Bean 方法中来定义动态属性的功能已被弃用,现在默认会导致失败。替代方法是实现一个单独的 @Bean 方法,返回一个 DynamicPropertyRegistrar,此方法应注入属性值来源的容器。这种方式解决了一些容器生命周期问题,并确保属性值来源的容器在属性被使用之前已经启动。

如果仍希望注入 DynamicPropertyRegistry(需承担可能的生命周期问题),可以将 spring.testcontainers.dynamic-property-registry-injection 设置为 warnallow。前者会记录警告但允许注入,后者则会完全恢复 Spring Boot 3.3 的行为。

1.8 @AutoConfigureTestDatabase 与容器的集成

@AutoConfigureTestDatabase 注解现在会自动检测数据库是否来源于容器。如果是,则无需再添加 replace=Replace.NONE

如需恢复旧的行为,可以在注解中设置 replace=Replace.AUTO_CONFIGURED

1.9 控制 Actuator 端点的访问权限

启用和禁用端点的支持已被重新设计,替换为更细粒度的访问控制模型。新的模型不仅支持禁用端点(访问级别为 none)和完全启用端点(访问级别为 unrestricted),还支持只允许端点操作的“只读”访问(访问级别为 read-only)。

以下属性已被弃用:

  • management.endpoints.enabled-by-default
  • management.endpoint.<id>.enabled

其替代属性为:

  • management.endpoints.access.default
  • management.endpoint.<id>.access

同样,@Endpoint 注解中的 enableByDefault 属性已被弃用,新的 defaultAccess 属性取代了它。

作为更改的一部分,enabled-by-default 的应用现在更加一致,并与是否使用了 @ConditionalOnEnabledEndpoint 无关。如果升级后失去了某个端点的访问权限,可以将 management.endpoint.<id>.access 设置为 read-onlyunrestricted,或者将 management.endpoint.<id>.enabled 设置为 true,以使端点重新可用。

另外,还引入了一个新属性,用于控制 Actuator 端点访问级别的上限:

  • management.endpoints.access.max-permitted

此属性限制所有配置的访问级别。例如,如果 management.endpoints.access.max-permitted 设置为 read-only,而 management.endpoint.loggers.access 设置为 unrestricted,则日志记录端点仅允许只读访问。

1.10 Cloud Foundry 中 @ConditionalOnAvailableEndpoint 暴露的更改

在使用 @ConditionalOnAvailableEndpoint 注解时,原本使用的枚举值 EndpointExposure.CLOUD_FOUNDRY 已被弃用,建议改用 EndpointExposure.WEB。对于典型的 Spring Boot 应用,这一更改通常不会有影响。但如果你定义了自定义的 Cloud Foundry 特定 Actuator 端点 bean,则需要将条件更新为使用 EndpointExposure.WEB

1.11 HtmlUnit 4.3

HtmlUnit 已升级至 4.3。本次升级中,依赖坐标从 net.sourceforge.htmlunit:htmlunit 变更为 org.htmlunit:htmlunit,包名也从 com.gargoylesoftware.htmlunit. 更新为 org.htmlunit.。升级时,请相应调整构建配置和代码导入。

1.12 Selenium HtmlUnit 4.22

Selenium HtmlUnit 已更新至 4.22。本次升级中,依赖坐标从 org.seleniumhq.selenium:htmlunit-driver 变更为 org.seleniumhq.selenium:htmlunit3-driver。升级时,请相应调整构建配置。

1.13 WebJars 定位器集成

为了更快的启动时间和更高效的 WebJars 资源解析,你需要在构建文件(如 pom.xml)中将依赖从 org.webjars:webjars-locator-core 更新为 org.webjars:webjars-locator-lite。这两项依赖由 Spring Boot 统一管理。需要注意,Spring 对 org.webjars:webjars-locator-core 的支持已被弃用,并将在未来版本中移除。有关详细信息,请参阅 参考文档的相关章节。

1.14 OkHttp 依赖管理的移除

Spring Boot 不再直接依赖 OkHttp,因此也不再对其版本进行管理。如果你的应用程序包含 OkHttp 依赖,请更新构建以选择适合需求的 OkHttp 版本。

1.15 原生镜像中的 Netty

Spring Boot 3.4 使用的 Netty 版本尚未完全被 Native Build Tools 提供的 GraalVM 可达性元数据支持。要在原生镜像中正常使用 Netty,需手动升级 GraalVM 可达性元数据版本。

对于 Maven:

<plugin><groupId>org.graalvm.buildtools</groupId><artifactId>native-maven-plugin</artifactId><configuration><metadataRepository><version>0.3.14</version></metadataRepository></configuration>
</plugin>
1.16 @MockBean 和 @SpyBean 的弃用

@MockBean@SpyBean 注解已被弃用,建议使用 Spring Framework 提供的 @MockitoBean@MockitoSpyBean。新的注解功能与 Spring Boot 提供的注解功能并不完全一致。例如,@MockitoBean 尚不支持在 [这里是代码101] 类中使用,你可能需要在测试类中直接注解字段。

1.17 Spring Boot 3.2 的弃用项

Spring Boot 3.2 中标记为弃用并计划在 3.4 中移除的类、方法和属性现已被移除。在升级之前,请确保没有调用这些弃用的功能。

1.18 最低要求更改

2 新功能和亮点

2.1 结构化日志

新增了对结构化日志的支持,包括 Elastic Common Schema(ecs)、Graylog 扩展日志格式(gelf)和 Logstash(logstash)的内置支持。可以通过设置 logging.structured.format.fileecsgelflogstash 来启用结构化文件日志记录。类似地,可以通过设置 logging.structured.format.console 来启用结构化控制台日志记录。

有关更多信息,包括如何定义自定义格式,请参阅参考文档。

@Fallback Bean

@ConditionalOnSingleCandidate 现在支持 @Fallback Bean。如果存在一个主 Bean,或者没有主 Bean 但存在一个非回退的单一候选 Bean,则该条件会匹配。

定义附加 Bean

在类型匹配时,基于 Bean 的条件现在会忽略非默认候选 Bean。通过声明某个 Bean 为非默认候选(使用 @Bean(defaultCandidate=false)),现在可以定义一个特定类型的 Bean,而不会导致相同类型的自动配置 Bean 退出。这简化了配置,例如在同一个应用程序中使用 两个 [这里是代码114] Bean 或 两个 [这里是代码115] Bean。

ClientHttpRequestFactory 构建器

新增了 ClientHttpRequestFactoryBuilder 接口,可以为特定技术创建 ClientHttpRequestFactory 实例。构建器支持对底层组件进行细粒度自定义,并提供一致的方式来应用通用设置。

以下构

建器可以通过接口的静态工厂方法创建:

  • Apache HTTP Components(ClientHttpRequestFactoryBuilder.httpComponents()
  • Jetty Client(ClientHttpRequestFactoryBuilder.jetty()
  • Reactor Netty 的 HttpClientClientHttpRequestFactoryBuilder.reactor()
  • JDK 的 HttpClientClientHttpRequestFactoryBuilder.jdk()
  • 简单的 JDK HttpURLConnectionClientHttpRequestFactoryBuilder.simple()

有关更多详细信息,包括如何通过配置属性应用通用设置,请参阅参考文档。

可观察性改进
应用程序分组

新增了 spring.application.group 属性,用于对应用程序进行分组,例如将属于某个业务部门的多个应用程序归类。当设置此属性时,它也会出现在日志消息中。此行为可通过 logging.include-application.group 属性控制。应用程序分组信息还会自动添加到 OpenTelemetry 的 Resource 中。

OTLP

支持通过 gRPC 传输发送 OTLP span。要启用此功能,请将新配置属性 management.otlp.tracing.transport 设置为 grpc。该属性默认为 http。此外,还新增了相应的服务连接支持。

新增的 management.otlp.logs 配置属性可用于自动配置 OpenTelemetry 的 OtlpHttpLogRecordExporterSdkLoggerProvider

其他可观察性更新

ProcessInfoContributor 现在还会显示堆和非堆内存的使用信息。

新增的 management.otlp.tracing.export.enabledmanagement.wavefront.tracing.export.enabledmanagement.zipkin.tracing.export.enabled 属性,可用于更细粒度地启用或禁用跟踪导出。

对 MockMvc 的 AssertJ 支持

当类路径中存在 AssertJ 时,将自动配置 MockMvcTesterMockMvcTester 提供了一种流畅的 API,用于定义请求和断言。它可以在任何可以注入 MockMvc 的地方使用。

有关更多详细信息,请参阅 Spring Framework 参考文档的专用章节。

Spring Pulsar

Spring Boot 现在提供了配置默认租户和命名空间的属性。这些默认值适用于主题 URL 未完全限定时生产或消费消息的情况。可以通过 spring.pulsar.defaults.topic.tenantspring.pulsar.defaults.topic.namespace 配置这些属性,或者定义自己的 PulsarTopicBuilder bean。如果需要禁用默认值,将 spring.pulsar.defaults.topic.enabled=false

新增了 PulsarContainerFactoryCustomizer 接口,用于自定义自动配置的 PulsarContainerFactory

spring.pulsar.consumer.subscription.name 配置属性现在应用于自动配置的 Pulsar 监听器容器。

引入了两个用于配置 Pulsar 客户端并发性的属性:

  • spring.pulsar.client.threads.io:控制用于处理与代理连接的线程数。
  • spring.pulsar.client.threads.listener:控制用于消息监听器的线程数。

此外,新属性 spring.pulsar.listener.concurrency 可控制自动配置的 Pulsar 消息监听器容器的并发性。

Couchbase 身份验证

Couchbase 集群现在支持通过客户端证书进行身份验证,作为用户名和密码身份验证的替代方案。详细信息请参阅参考文档。

FreeMarker

FreeMarker 变量现可通过定义一个或多个类型为 FreeMarkerVariablesCustomizer 的 bean 来自定义。自定义器将按定义的顺序(如果有)依次调用。

嵌入式 ActiveMQ Classic Broker 的支持

由于 ActiveMQ Classic 重新支持嵌入式 Broker,自动配置已更新以支持此功能。

需要注意,与 Spring Boot 2.7.x 不同,ActiveMQ starter 仅限于客户端。如果需要使用嵌入式 Broker,需要将 org.apache.activemq:activemq-broker 添加到应用程序中。

配置元数据

注解处理器现在支持检测 Enum 类型的默认值。如果你为自定义属性手动添加了元数据来提供默认值,请确保将其移除。

弃用和替换自动配置类

为简化自动配置的演进,Spring Boot 引入了对自动配置类的弃用和替换支持。替换可以在新的 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.replacements 文件中声明。更多详情请参阅参考文档。

虚拟线程

如果启用了虚拟线程,以下组件将默认使用虚拟线程:

  • OtlpMeterRegistry
  • Undertow Web 服务器
镜像构建改进

Spring Boot 默认使用 [这里是代码157] 构建器。此构建器原生支持 ARM 和 x64 平台。

Maven插件新增了 trustBuilder 选项,用于控制 CNB 生命周期的调用方式,以提高安全性。默认信任的构建器包括 Paketo 项目、Heroku 和 Google 的构建器。详情请参阅 Maven文档。

新增的 imagePlatform 选项允许为不同于主机平台的操作系统和架构构建镜像,前提是主机平台支持模拟其他系统(

例如,使用 Apple Silicon 的 Mac 上的 Rosetta 模拟 AMD 架构)。详情请参阅 Maven文档。

Docker Compose 改进

Docker Compose 现在支持多个 Docker Compose 配置文件。

命令行参数

新属性 spring.docker.compose.start.argumentsspring.docker.compose.stop.arguments 可以用来指定在启动和停止服务时传递给 Docker Compose 子命令的额外命令行参数。新增了 spring.docker.compose.arguments 属性,用于向 Docker Compose 传递参数。

更新支持
  • Postgres [这里是代码163] 环境变量 现在被支持。
  • 通过分别使用 redis/redis-stackredis/redis-stack-server 容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。
  • 通过使用 grafana/otel-lgtm 容器镜像,添加了对 Grafana LGTM 的支持。
  • 添加了对 Hazelcast 的支持(使用 HazelcastConnectionDetails)。
  • 添加了对 OTLP 日志记录的支持。
Testcontainers 改进
  • 添加了对 org.testcontainers.kafka.KafkaContainer 的支持。
  • 通过分别使用 redis/redis-stackredis/redis-stack-server 容器镜像,添加了对 Redis Stack 和 Redis Stack Server 的支持。
  • 添加了对 org.testcontainers.grafana.LgtmStackContainer 的支持。
  • 添加了对 Hazelcast 的支持(使用 HazelcastConnectionDetails)。
  • 添加了对 OTLP 日志记录的支持。
  • 添加了对 RedisContainer 的支持。
Actuator
可插拔的 Actuator 暴露器

现在可以扩展 Spring Boot,以可插拔的方式暴露 actuator 端点。可以实现新的 EndpointExposureOutcomeContributor 接口来影响 @ConditionalOnAvailableEndpoint 条件。

这个扩展应该使得提供类似我们现有的 Cloud Foundry 支持的额外平台集成变得更加容易。

SSL 信息和健康检查

如果您使用的是 SSL 包,现在有一个新端点显示 SSL 信息(有效期、发行者、主题等),可在 /actuator/info 下获取。该端点还会显示即将过期的证书,以提醒您需要尽快轮换证书。新增了名为 management.health.ssl.certificate-validity-warning-threshold 的配置属性来配置阈值。

还添加了一个新的健康检查来监控 SSL 证书。如果证书无效,它将状态设置为 OUT_OF_SERVICE

/actuator/scheduledtasks 端点中的额外信息

[这里是代码180] Actuator 端点 现在公开了有关计划任务的额外元数据,例如 “下一次预定执行时间” 和 “上次执行时间、状态和异常”。

3 依赖升级

Spring Boot 3.4 迁移到了几个 Spring 项目的新版:

  • Spring AMQP 3.2
  • Spring Authorization Server 1.4
  • Spring Batch 5.2
  • Spring Data 2024.1
  • Spring Framework 6.2
  • Spring HATEOAS 2.4
  • Spring Integration 6.4
  • Spring Kafka 3.3
  • Spring Pulsar 1.2
  • Spring Security 6.4
  • Spring Session 3.4

许多第三方依赖项也已更新,其中一些更值得注意的包括:

  • Apache Http Client 5.4
  • AssertJ 3.26
  • Artemis 2.37
  • Elasticsearch Client 8.15
  • Flyway 10.20
  • Gson 2.11
  • Hibernate 6.6
  • HtmlUnit 4.5.0
  • JUnit Jupiter 5.11
  • Jackson 2.18.0
  • Jedis 5.2
  • Kafka 3.8
  • Lettuce 6.4
  • Liquibase 4.29
  • Log4j 2.24
  • HtmlUnit 4.3
  • MariaDB 3.4
  • Micrometer 1.14
  • Micrometer Tracing 1.4
  • Mockito 5.13
  • MongoDB 5.2.0
  • MySQL 9.1
  • OpenTelemetry 1.41
  • Oracle Database 23.4
  • R2DBC MySQL 1.3
  • Rabbit AMQP Client 5.22
  • Rabbit Stream Client 0.18.0
  • Reactor 2024.0
  • Selenium 4.25
  • Testcontainers 1.20.3
  • XMLUnit 2.10
杂项

除了上述变化外,还包括许多小的调整和改进:

  • 现在可以使用 Customizer<Liquibase> bean 在使用 Liquibase 之前对其进行自定义。
  • 现在可以通过定义 JCachePropertiesCustomizer bean 来自定义用于创建 JCache CacheManager 的属性。
  • 现在可以通过定义名为 viewNameTranslator 的 bean 来自定义 Spring MVC 使用的 RequestToViewNameTranslator
  • 现在可以使用 LettuceClientOptionsBuilderCustomizer bean 来自定义 Lettuce 的 ClientOptions。对于整个 LettuceClientConfiguration 的更广泛配置,继续使用 LettuceClientConfigurationBuilderCustomizer
  • 可以使用新的自定义器 ProxyConnectionFactoryCustomizer 来自定义 R2DBC 的 ProxyConnectionFactory
  • 如果发生 Spring Security 注销,现在会发布一个审计事件。
  • 现在可以使用新的属性 spring.mail.ssl.* 通过 SSL 包配置 JavaMailSender 上的 TLS。
  • 现在可以使用新的 spring.gson.strictness 属性配置 GSON 的严格性。
  • 现在可以在 JavaBean 风格的配置属性的字段上使用 @Name 来自定义其名称。
  • 当从另一个 DataSource 派生时,DataSourceBuilder 现在可以使用源 DataSource 的 URL 确定驱动程序类名称,如果它不公开驱动程序类名称。
  • 就绪和存活健康探针 现在在 Cloud Foundry 平台上自动启用。
  • 可以使用新属性 spring.application.version 读取和设置应用程序版本。属性的默认值取自清单中的 Implementation-Version
  • 自动配置的 EntityManagerFactoryBuilder 也定义了原生(例如 Hibernate)属性。
  • 即使没有使用 @EnableScheduling,Spring Integration 的 TaskScheduler 现在也支持虚拟线程。
  • @ConditionalOnAvailableEndpoint 现在有一个 value 别名用于 endpoint
  • 添加了一个新的配置属性 spring.data.web.pageable.serialization-mode,用于配置 Spring Data Web 的序列化模式。
  • 使用 SpringApplication.from(…) 语法时,现在可以指定要激活的额外配置文件。
  • Spring Boot 插件不再在构建包环境中设置 BP_NATIVE_IMAGE: true
  • 注册的 @ConfigurationProperties beans 现在尊重 @DependsOn@Description@Fallback@Lazy@Primary@Scope@Role 注解。
  • 现在支持 Log4j2 的 MultiFormatStringBuilderFormattable 在结构化日志中。
  • 添加了一个新的配置属性 spring.jms.listener.max-messages-per-task,用于配置监听器在单个任务中处理的最大消息数。
  • 默认的安全配置现在暴露了映射到附加路径的健康组。此外,两个 EndpointRequest 类现在提供了 toAdditionalPaths(…) 方法。
  • 现在可以通过属性设置会话 cookie 的分区属性。
  • 添加了一个新的 server.jetty.max-form-keys 属性,用于自定义 Jetty 的最大表单键。
  • 添加了新的属性 management.otlp.logging.connect-timeoutmanagement.otlp.tracing.connect-timeout 以配置与 OTLP 收集器的连接超时。
  • 添加了通过 OTLP 传输日志时的 gRPC 传输支持。
  • 如果在构建过程中绑定了容器中使用的目录,现在会显示警告。
  • 如果使用 --enable-sbom=sbom 构建原生镜像,现在会自动检测到这个 SBOM。
  • DatabaseDriver 枚举现在支持 ClickHouse JDBC 驱动程序。
  • 可以使用新属性 management.logging.export.enabled
  • management.otlp.logging.export.enabled 禁用日志导出。
    • 可以通过定义带有 @BatchTaskExectuor 注解的 TaskExecutor bean 来自定义 Spring Batch 使用的 TaskExecutor
    • Spring Session 自动配置现在支持响应式 Web 应用程序中的 indexed 存储库类型。
    • 如果未配置池挂起并且创建了检查点,HikariCheckpointRestoreLifecycle 现在会记录一条警告。

3.4 版本 Spring Boot 的弃用

  • 弃用 spring.gson.lenient,改用 spring.gson.strictness
  • 弃用 @MockBean@SpyBean,改用 Spring Framework 的 @MockitoBeanMockitoSpyBean
  • 弃用 org.springframework.boot.ResourceBanner#getApplicationVersion(Class<?>),改用 spring.application.version 属性。
  • 弃用 org.springframework.boot.SpringApplication#logStartupInfo(boolean),改用 org.springframework.boot.SpringApplication#logStartupInfo(ConfigurationApplicationContext)
  • 弃用 org.springframework.boot.logging.logback.ApplicationNameConverter,改用 org.springframework.boot.logging.logback.EnclosedInSquareBracketsConverter
  • 弃用 org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#CLOUD_FOUNDRY,改用 org.springframework.boot.actuate.autoconfigure.endpoint.expose.EndpointExposure#WEB
  • 弃用 org.springframework.boot.actuate.autoconfigure.tracing.otlp.OtlpTracingConnectionDetails#getUrl(),改用 getUrl(Transport)
  • 弃用 org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryAutoConfiguration,改用 org.springframework.boot.actuate.autoconfigure.tracing.OpenTelemetryTracingAutoConfiguration
  • 弃用 OtlpAutoConfiguration,改用 OtlpTracingAutoConfiguration
  • 弃用 management.endpoints.enabled-by-defaultmanagement.endpoint.<id>.enabled,改用 management.endpoints.access.defaultmanagement.endpoint.<id>.access
  • 弃用 @Endpoint 上的 enableByDefault,改用 defaultAccess

关注我,紧跟本系列专栏文章,咱们下篇再续!

作者简介:魔都架构师,多家大厂后端一线研发经验,在分布式系统设计、数据平台架构和AI应用开发等领域都有丰富实践经验。

各大技术社区头部专家博主。具有丰富的引领团队经验,深厚业务架构和解决方案的积累。

负责:

  • 中央/分销预订系统性能优化

  • 活动&券等营销中台建设

  • 交易平台及数据中台等架构和开发设计

  • 车联网核心平台-物联网连接平台、大数据平台架构设计及优化

  • LLM Agent应用开发

  • 区块链应用开发

  • 大数据开发挖掘经验

  • 推荐系统项目

    目前主攻市级软件项目设计、构建服务全社会的应用系统。

参考:

  • 编程严选网

    本文由博客一文多发平台 OpenWrite 发布!

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

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

相关文章

vulnhub靶场【kioptrix-3】靶机

前言 靶机&#xff1a;kioptrix-3&#xff0c;IP地址为192.168.1.74 攻击&#xff1a;kali&#xff0c;IP地址为192.168.1.16 都采用虚拟机&#xff0c;网卡为桥接模式 文章中涉及的靶机&#xff0c;来源于vulnhub官网&#xff0c;想要下载&#xff0c;可自行访问官网下载&a…

Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析

第一部分&#xff1a;问题背景 1.1 错误现象复现 // 浏览器控制台报错示例 Access to fetch at https://chat.qwenlm.ai/api/v1/files/ from origin https://ocr.doublefenzhuan.me has been blocked by CORS policy: Response to preflight request doesnt pass access con…

VMware虚拟机安装Linux系统(openKylin)

首先打开VMware Workstation&#xff0c;点击创建新的虚拟机。 进入虚拟机引导界面后&#xff0c;选择“典型”选项&#xff0c;点击下一步&#xff1b; 选择“稍后安装操作系统”&#xff0c;点击下一步&#xff1b; 客户机操作系统选择“Linux”&#xff0c;版本选择Ubuntu 6…

RabbitMQ 多种安装模式

文章目录 前言一、Windows 安装 RabbitMq1、版本关系2、Erlang2.1、下载安装 Erlang 23.12.2、配置 Erlang 环境变量 3、RabbitMQ3.1、下载安装 RabbitMQ 3.8.93.2、环境变量3.3、启动RabbitMQ 管理插件3.3、RabbitMQ3.4、注意事项 二、安装docker1、更新系统包&#xff1a;2、…

【Java-数据结构】Java 链表面试题上 “最后一公里”:解决复杂链表问题的致胜法宝

我的个人主页 我的专栏&#xff1a;Java-数据结构&#xff0c;希望能帮助到大家&#xff01;&#xff01;&#xff01;点赞❤ 收藏❤ 引言&#xff1a; Java链表&#xff0c;看似简单的链式结构&#xff0c;却蕴含着诸多有趣的特性与奥秘&#xff0c;等待我们去挖掘。它就像一…

【0x03】HCI_Connection_Complete事件详解

目录 一、事件概述 二、事件格式及参数详解 2.1. HCI_Connection_Complete事件格式 2.2. 事件参数 2.2.1. Status 2.2.2. Connection_Handle 2.2.3. BD_ADDR 2.2.4. Link_Type 2.2.5. Encryption_Enabled 三、事件处理流程 3.1. 事件触发 3.2. 事件接收与解析 3.…

激活版,快速安装

每天开机都要等待很长时间&#xff0c;玩游戏或看视频时频繁卡顿&#xff0c;甚至偶尔还会莫名其妙地崩溃。这种情况几乎每个人都遇到过&#xff0c;真是让人头疼不已。 别担心&#xff0c;其实有一种方法可以让你的电脑恢复如新&#xff0c;让我们一起看看如何解决这些烦恼吧…

二叉树(了解)c++

二叉树是一种特殊的树型结构&#xff0c;它的特点是: 每个结点至多只有2棵子树(即二叉树中不存在度大于2的结点) 并且二叉树的子树有左右之分&#xff0c;其次序不能任意颠倒&#xff0c;因此是一颗有序树 以A结点为例&#xff0c;左边的B是它的左孩子&#xff0c;右边的C是…

C#标准Mes接口框架(持续更新)

前言 由于近期我做了好几个客户的接入工厂Mes系统的需求。但是每个客户的Mes都有不同程度的定制需求&#xff0c;原有的代码复用难度其实很大。所以打算将整个接入Mes系统的框架单独拿出来作为一个项目使用&#xff0c;同时因为不同的设备接入同一个Mes系统&#xff0c;所以代…

【Nacos】负载均衡

目录 前言 一、服务下线二、权重配置三、同一个集群优先访问四、环境隔离 前言 我们的生产环境相对是比较恶劣的&#xff0c;我们需要对服务的流量进行更加精细的控制.Nacos支持多种负载均衡策略&#xff0c;包括配置权重&#xff0c;同机房&#xff0c;同地域&#xff0c;同环…

嵌入式MCU面试笔记2

目录 串口通信 概论 原理 配置 HAL库代码 1. 初始化函数 2. 数据发送和接收函数 3. 中断和DMA函数 4. 中断服务函数 串口通信 概论 我们知道&#xff0c;通信桥接了两个设备之间的交流。一个经典的例子就是使用串口通信交换上位机和单片机之间的数据。 比较常见的串…

DDD该怎么去落地实现(1)关键是“关系”

DDD落地的关键是“关系” 这些年&#xff0c;我认为DDD走到了一个死胡同里了&#xff0c;因为落地实现过于困难。很多团队在经过一段时间的学习&#xff0c;清楚理解了DDD那些晦涩的概念&#xff0c;根据业务绘制出领域模型&#xff0c;这都不困难。但绘制领域模型不是我们最终…

RabbitMQ---面试题

常见面试题 1.MQ的作用及应用场景 类似问题&#xff1a;项目什么情况下用到了MQ&#xff0c;为什么要用MQ MQ的主要应用场景&#xff0c;消息队列的应用场景&#xff0c;为什么说消息队列可以削峰 首先MQ是一种用来接收和转发消息的队列&#xff0c;常见的应用常见如下&…

PaddleSeg 从配置文件和模型 URL 自动化运行预测任务

git clone https://github.com/PaddlePaddle/PaddleSeg.git# 在ipynb里面运行 cd PaddleSegimport sys sys.path.append(/home/aistudio/work/PaddleSeg)import os# 配置文件夹路径 folder_path "/home/aistudio/work/PaddleSeg/configs"# 遍历文件夹&#xff0c;寻…

2_高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计

一、高并发内存池框架设计 高并发池框架设计&#xff0c;特别是针对内存池的设计&#xff0c;需要充分考虑多线程环境下&#xff1a; 性能问题锁竞争问题内存碎片问题 高并发内存池的整体框架设计旨在提高内存的申请和释放效率&#xff0c;减少锁竞争和内存碎片。 高并发内存…

WebODM之python实现

1、安装webodm_slam 主要是了解API文档,查看之前的文章 安装WebODM_slate 2、安装webodm 查看之前的文章 Win10安装WebODM和操作全流程 3、python脚本 项目案例 This Source Code Form is subject to the terms of the Mozilla Public License, v. 2.0. If a copy of…

2025年美赛C题:奥运奖牌榜模型 解析及Python代码实现

2025年美赛C题&#xff1a;奥运奖牌榜模型 解析及Python代码实现 1 题目 2025 MCM问题C&#xff1a;奥运奖 牌榜模型在最近的2024年巴黎夏季奥运会期间&#xff0c; 粉丝们除了观看个人项目外&#xff0c; 还关注每个 国家的整体 “ 奖牌榜 ”。 最终的结果&#xff08;表1&am…

Qt 5.14.2 学习记录 —— 십칠 窗口和菜单

文章目录 1、Qt窗口2、菜单栏设置快捷键添加子菜单添加分割线和菜单图标 3、工具栏 QToolBar4、状态栏 QStatusBar5、浮动窗口 QDockWidget 1、Qt窗口 QWidget&#xff0c;即控件&#xff0c;是窗口的一部分。在界面中创建控件组成界面时&#xff0c;Qt自动生成了窗口&#xf…

Spring Boot 邂逅Netty:构建高性能网络应用的奇妙之旅

一、引言 在当今数字化时代&#xff0c;构建高效、可靠的网络应用是开发者面临的重要挑战。Spring Boot 作为一款强大的 Java 开发框架&#xff0c;以其快速开发、简洁配置和丰富的生态支持&#xff0c;深受广大开发者喜爱。而 Netty 作为高性能、异步的网络通信框架&#xff…

Windows中本地组策略编辑器gpedit.msc打不开/微软远程桌面无法复制粘贴

目录 背景 解决gpedit.msc打不开 解决复制粘贴 剪贴板的问题 启用远程桌面剪贴板与驱动器 重启RDP剪贴板监视程序 以上都不行&#xff1f;可能是操作被Win11系统阻止 最后 背景 远程桌面无法复制粘贴&#xff0c;需要查看下主机策略组设置&#xff0c;结果按WinR输入…