🎉🎉《Spring Boot实战案例合集》目前已更新183个案例,我们将持续不断的更新。文末有电子书目录。
💪💪永久更新承诺
我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务。
💌💌如何获取
订阅我们的合集《点我订阅》,并通过私信联系我们,我们将第一时间将电子书发送给您。
环境:Spring Boot3.5.0
1. 简介
Spring 6 引入了通过带有 @HttpExchange 注解的方法在 Java 接口中定义 HTTP服务的功能。如下示例:
第一步,定义远程访问的接口:
public interface BookService {List<Book> list() ;}
第二步,创建HttpServiceProxyFactory对象
HttpServiceProxyFactory proxyFactory(RestClient.Builder clientBuilder) {RestClient client = clientBuilder.build() ;return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client)).build();}RestClient.Builder restClientBuilder() {return RestClient.builder().baseUrl("http://localhost:8080") ;}
第三步,创建接口代理
BookService bookService(HttpServiceProxyFactory factory) {return factory.createClient(BookService.class) ;}
通过上述三个步骤,我们便能顺利访问目标接口,整个过程极为简便。具体而言,只需创建一个HttpServiceProxyFactory,并利用它生成一个、两个甚至多个客户端代理即可,这在少量操作时轻而易举。然而,随着需要生成的客户端代理数量不断增多,这种操作会逐渐变得重复且繁琐。
HTTP Service注册
为应对这一挑战,Spring 7在 HttpServiceProxyFactory 之上引入了一个额外的注册表层,提供以下功能:
用于注册HTTP接口并初始化HTTP客户端基础设施的配置模型
以Spring Bean形式透明地创建和注册客户端代理
通过HttpServiceProxyRegistry访问所有客户端代理
在配置模型中,HTTP服务按组进行组织,其中组只是一组共享相同HTTP客户端配置以及由此生成的客户端实例的HTTP服务。目前,有两种方式来声明HTTP服务。
接下来,我们将详细的介绍这两种简化HTTP Service注册的流程。
环境准备
首先,我们准备如下2个远程接口,服务的端口为8080:
("/books")public class BookController {public List<Book> list() {return List.of(new Book(1L, "Spring Boot3实战案例200讲", "Pack_xg", BigDecimal.valueOf(70)),new Book(2L, "Spring全家桶实战案例", "Pack_xg", BigDecimal.valueOf(100))) ;}}("/users")public class UserController {("/{id}")public User queryUser( Long id) {return new User(id, "姓名 - " + id, new Random().nextInt(100)) ;}}
接下来,我们开发另外一个服务用来调用上面的接口,服务端口为7000。
2.1 基于注解注册
声明HTTP服务组的一种方式是通过@ImportHttpServices注解(Spring 7中的新增注解)。你可以使用它按组手动列出HTTP服务:
方式1,指定包路径:
group = "book", basePackages = {"com.pack.http.book"})group = "user", basePackages = {"com.pack.http.user"})public class ClientConfig {}
方式2,指定具体的HTTP服务接口:
public class ClientConfig {}
在默认情况下,HTTP服务组默认使用RestClient进行配置,但你可以通过该注解的clientType属性切换为使用WebClient。
最后,我们还需要为上面的每一个组进行HTTP Client的初始化
@BeanRestClientHttpServiceGroupConfigurer groupConfigurer() {return groups -> {groups.filterByName("book").forEachClient((group, builder) -> {builder.baseUrl("http://localhost:8080") ;}) ;groups.filterByName("user").forEachClient((group, builder) -> {builder.baseUrl("http://localhost:8080") ;}) ;};}
以上我们就完成了HTTP 服务接口的开发,是不是变的非常的简单了,任由你有多少的接口,我们只需要指定包路径即可。
定义如下的接口进行测试
public class ApiController {private final BookService bookService ;private final UserService userService ;public ApiController(BookService bookService, UserService userService) {this.bookService = bookService;this.userService = userService;}public List<Book> list() {return this.bookService.list() ;}public User queryUser( Long id) {return this.userService.queryUser(id) ;}}
2.2 编程方式注册
如果你需要对过滤或其他注册逻辑进行更多控制,还可以通过两个步骤以编程方式声明HTTP服务。
首先,创建一个声明HTTP服务组的注册器:
public class CustomHttpServiceRegistrar extends AbstractHttpServiceRegistrar {protected void registerHttpServices(GroupRegistry registry, AnnotationMetadata metadata) {registry.forGroup("book").detectInBasePackages("com.pack.http.book") ;registry.forGroup("user").detectInBasePackages("com.pack.http.user") ;}}
最后,通过@Import导入上面的类
@Import(HttpServiceRegistrar.class)public class ClientConfig {}
通过此种方式能够实现更多的控制。
2.3 关于Spring Boot4中的支持
Spring Boot 4.0会通过其RestClient和WebClient自动配置,为每个组透明地应用HTTP客户端构建器的初始化。此外,它还提供按组划分的HTTP客户端属性支持:
# Global, applies to all groupsspring.http.client.service.read-timeout=2s# Book groupspring.http.client.service.group.book.base-url=http://localhost:8080
注意:Spring Cloud 2025.1 为 HTTP 服务组提供了透明的负载均衡和熔断机制支持。
查询优化!Spring Boot + Lucene 构建全文检索
可插拔、可配置、可扩展:Spring Boot 统一响应增强组件
性能优化!3种方法优化@Transactional长事务问题,方法三性能提升4倍(不修改业务代码)
高级开发!一个注解简化Spring Boot本地消息表(Outbox)实现
Spring Boot 又一强大的内置功能,自动记录API请求/响应数据
哇塞!Spring Boot 一注解逆天,API 超时问题秒解决
Spring AI:零代码!智能生成SQL,实现数据实时查询!
JSON处理不再头疼!Jackson Tree模型解锁JSON操作的开挂模式
一定要会!MySQL窗口函数太实用了,再也不怕复杂SQL查询了


