Dubbo简介ApacheDubbo是一个RPC服务开发框架,用于解决微服务架构下的服务治理和通信问题。官方提供Java、Golang等多语言SDK实现。使用Dubbo开发的微服务本身就具备远程地址发现和相互通信的能力。利用Dubbo提供的丰富的服务治理特性,可以实现服务发现、负载均衡、流量调度等服务治理需求。Dubbo被设计成高度可扩展的,用户可以很容易地实现各种自定义的流量拦截和位置选择逻辑。背景SpringFramework6.011月16日正式发布GA版本,SpringBoot3.011月25日正式发布GA版本,Spring6&SpringBoot3至少支持JDK17,也就是说升级使用Spring6&SpringBoot3您必须升级才能使用JDK17。不过Java8目前是国内主流生产环境的Java版本之一。尽管近几年已经发布了Java11和Java17的正式LTS版本,但大多数开发者仍然抱着“你想怎么玩就怎么玩,我用的是Java8”的观点看待JDK的升级。不过Java17版本在性能方面确实做了很多优化,尤其是ZGC的发布,推动了国内很多公司升级到Java17。Spring框架在Java生态中的重要性不言而喻.我们相信在Spring“最低支持JDK17”的推动下,SpringFramework6.0&SpringBoot3.0将在不久的将来被大家所接受,成为主流技术栈。Dubbo社区非常重视Spring社区的更新迭代,会一直积极支持适配,这一点在最近发布的Spring6.0和SpringBoot3.0中也得到了验证。Dubbo社区早在Spring6.0.0-RC4和SpringBoot3.0.0-RC2就已经做了大致的兼容适配,但是为了保证Dubbo能够完全适配Spring6和SpringBoot3.0正式版,我们有一直等到SpringBoot3.0GA之后,我才选择公布这个开心的事情。为什么要升级到Spring6.0&SpringBoot3.0首先,升级到Spring6.0&SpringBoot3.0以后很长一段时间内都会得到官方的免费技术支持。Spring6和SpringBoot3是Spring下一代技术框架的基石。虽然Spring5.3、SpringBoot2.6.x和SpringBoot2.7.x官方同时维护,但它们最终将在2025年和2026年结束对OSS的支持(OpenSourceSoftwareSupport)。其次,你会在新一代框架中获得很多新特性。这些新功能可以在SpringBoot3.0发行说明(https://github.com/spring-pro...)和SpringFramework6.x中的新增功能(https://github.com/spring-pro...)中找到。..'s-New-in-Spring-Framework-6.x)。最后,Spring6.x和SpringBoot3.x将最广泛地支持JDK17-29。需要注意的是,JDK17作为最新的LTS版本,提供了一组累积的最新语言、API和JVM增强功能,使其升级到更具吸引力的构建,这就是为什么JDK17作为最低支持。Dubbo支持Spring6&SpringBoot3现在很高兴的宣布Dubbo已经开始兼容Spring6&SpringBoot3,所以目前的Dubbo3.2.0-beta.2版本可以兼容支持SpringBoot1.x和2.x同时,3.x。您现在可以使用dubbo-3.2.0-beta.2版本来体验它的兼容性。org.apache.dubbodubbo-spring-boot-starter3.2.0-beta.2更多关于SpringBoot3.0集成Dubbo的例子可以在apache/dubbo-sample找到:https://github.com/apache/dubbo-samples/tree/master/1-basic升级总结我们在兼容Dubbo的基础上适配了Spring6&SpringBoot3过程中总结的经验总结如下。其他组件维护者也可以参考以下经验适配或升级,早点适配升级到最新版本:JakartaEEJakartaEE9将所有API包名从javax.*命名空间改为jakarta.*。此次变更的原因是甲骨文拒绝交出相关权益。详情请查看:https://www.oschina.net/news/...。由于JakartaEE迁移,对于Web应用程序,请确保升级到Tomcat10、Jetty11或Undertow2.2.19。以下是可以帮助您完成这部分迁移的工具列表:OpenRewrite配方。SpringBootMigrator项目。IntelliJIDEA中的迁移支持。删除META-INF/spring.factories文件对自动配置SpringBoot3.0的支持META-INF/spring.factories文件中对自动配置的支持已被删除。为了兼容性,SpringBoot2.7.x是最后支持的版本。适配支持可以按照以下两步完成:【可选】使用@AutoConfiguration注解代替@Configuration(proxyBeanMethods=false)@AutoConfiguration注解是SpringBoot2.7新引入的注解,专门用来标识Auto-配置类名。也可以使用@Configuration注解来标识自动适配类。Dubbo正是基于这个方便,完美支持SpringBoot1.x、2.x、3.x所有版本。Step2:使用AutoConfiguration.imports文件代替META-INF/spring.factories文件。SpringBoot2.7是最后一个仍然兼容spring.factories的版本。SpringBoot3不再兼容。这时,你应该使用META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件替换。在此文件中列出所有配置类,每行一个类名,例如:com.mycorp.libx.autoconfigure.LibXAutoConfigurationcom.mycorp.libx.autoconfigure.LibXWebAutoConfiguration要与ISO-8601对齐,请使用yyyy-MM-dd'T'HH:mm:ss.SSSXXX为默认日志日期格式原默认日志日期格式:yyyy-MM-ddHH:mm:ss.SSS当前默认日志日期格式:yyyy-MM-dd'T'HH:mm:ss。SSSXXX原始默认日志日期格式没有时区/偏移量信息。yyyy-MM-dd'T'HH:mm:ss.SSSXXX>>>e.g.:2014-12-03T10:06:04.646+08:00去掉YamlJsonParserSpringBoot官方测试发现YamlJsonParser不能很好的解析JSON,SpringBoot3决定不再支持将其用作解析JSON的替代方法。YamlJsonParser包装snakeyaml。SpringBoot3解析JSON解析器的优先级如下:1)JacksonJsonParser2)GsonJsonParser3)BasicJsonParser去掉spring.session.store-type配置项去掉spring.session.store-type配置项,当有多个可用存储时库将按Redis、JDBC、Hazelcast和Mongo的顺序使用。更新springdata配置key,明确体现配置key是否依赖SpringData,如果repository相关的配置key(redis、mongo等)不依赖SpringData,只需要spring前缀,否则需要spring.data前缀。示例:spring.redis.host>>spring.data.redis.hostspring.redis.port>>spring.data.redis.portspring.data.cassandra.port>>spring.cassandra.port将HttpMethod枚举重构为类根据最新的rfc2616,HTTPMethod已经是不可枚举的属性,所以重构HttpMethod枚举类为class类。除了众所周知的GET、HEAD、PUT和POST方法外,还有可扩展的方法。当前可扩展的方法包括LOCK、COPY和MOVE。这些扩展方法在WebDAV中定义。不允许URI尾部斜杠匹配在Spring6之前,对“/resources”和“/resources/”的访问都进入了resources()方法。@GetMapping("/resources")Stringresources(){return"Hellofrom/resources";}Spring6之后只能通过你看到的路径"/resources"进入映射方法。如果还想让“/resources/”和“/resources”进入相同的映射方式,可以使用其他方式,比如“反向代理”、“Servlet/Web过滤器”或者“在控制器中配置显式重定向”。基于@HttpExchange服务接口提供HTTP客户端Spring6引入了@HttpExchange注解,可以基于@HttpExchange注解简化HTTP远程调用。增强的SpringSPI加载器SpringFactoriesLoader允许加载多个自定义文件在Spring6之前,SpringFactoriesLoader只允许加载“META-INF/spring.factories”文件内容。Spring6之后,SpringFactoriesLoader可以加载自定义文件或者filename文件,可以通过链式编程加载多个文件。JDK19预览版的早期兼容虚拟线程(virtualthreads)可以在Spring6和SpringBoot3中使用虚拟线程处理请求提前体验。这部分的详细内容见:https://spring.io/blog/2022/10/11/embracing-virtual-threadssupportsRFC7807ProblemDetailsSpring6andlater,SpringMVCcanusetheapplication/problem+jsonmedia键入自定义错误消息响应正文,如下所示:{"type":"https://example.org/problems/unknown-project","title":"Unknownproject","status":404,"detail":"Noprojectfoundforid'spring-unknown'","instance":"/projects/spring-unknown"}展望云原生时代,Java的跨平台特性不再是其抢眼的特性,而其Jar包体积大、启动慢、占用内存大、需要额外安装JVM是Java应用的痛点。使用GraalVM可以很好地解决这些问题。并且通过GraalVM的AOT(Ahead-Of-Time),可以将应用程序编译成单独的可执行文件直接运行。未来,Dubbo会积极在Native上做一些工作,使应用能够实现以下目标支持Spring&SpringBootnative-image更小的本地应用和容器镜像占用空间快速启动,快速启动(数十毫秒)低内存消费,减少RSS(residentsetsize),低内存有助于在需要多个容器的微服务架构部署中优化容器密度首次请求响应快速,避免Hotspot的预热问题欢迎访问https://github.com/apache/dubbo多宝星。搜索并关注官方微信公众号:ApacheDubbo,了解更多行业最新动态,掌握各大厂面试必备的Dubbo技能