大数跨境
0
0

Spring Boot 全面升级 @HttpExchange 强的离谱

Spring Boot 全面升级 @HttpExchange 强的离谱 Spring全家桶实战案例
2025-10-18
0
导读:Spring Boot 全面升级 @HttpExchange 强的离谱
Spring Boot 3实战案例锦集PDF电子书已更新至130篇!
图片

🎉🎉《Spring Boot实战案例合集》目前已更新183个案例,我们将持续不断的更新。文末有电子书目录。

💪💪永久更新承诺

我们郑重承诺,所有订阅合集的粉丝都将享受永久免费的后续更新服务

💌💌如何获取
订阅我们的合集点我订阅,并通过私信联系我们,我们将第一时间将电子书发送给您。

→ 现在就订阅合集

环境:Spring Boot3.5.0



1. 简介

Spring 6 引入了通过带有 @HttpExchange 注解的方法在 Java 接口中定义 HTTP服务的功能。如下示例:

第一步,定义远程访问的接口:

public interface BookService {  @GetExchange("/books")  List<Book> list() ;}

第二步,创建HttpServiceProxyFactory对象

@BeanHttpServiceProxyFactory proxyFactory(RestClient.Builder clientBuilder) {  RestClient client = clientBuilder.build() ;  return HttpServiceProxyFactory.builderFor(RestClientAdapter.create(client)).build();}@BeanRestClient.Builder restClientBuilder() {  return RestClient.builder().baseUrl("http://localhost:8080") ;}

第三步,创建接口代理

@BeanBookService 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.实战案例

环境准备

首先,我们准备如下2个远程接口,服务的端口为8080:

@RestController@RequestMapping("/books")public class BookController {  @GetMapping  public List<Booklist() {    return List.of(          new Book(1L, "Spring Boot3实战案例200讲""Pack_xg"BigDecimal.valueOf(70)),          new Book(2L, "Spring全家桶实战案例""Pack_xg"BigDecimal.valueOf(100))        ) ;  }}@RestController@RequestMapping("/users")public class UserController {  @GetMapping("/{id}")  public User queryUser(@PathVariable Long id) {    return new User(id, "姓名 - " + id, new Random().nextInt(100)) ;  }}

接下来,我们开发另外一个服务用来调用上面的接口,服务端口为7000。

2.1 基于注解注册

声明HTTP服务组的一种方式是通过@ImportHttpServices注解(Spring 7中的新增注解)。你可以使用它按组手动列出HTTP服务:

方式1,指定包路径:

@ImportHttpServices(  group = "book", basePackages = {"com.pack.http.book"})@ImportHttpServices(  group = "user", basePackages = {"com.pack.http.user"})@Configurationpublic class ClientConfig {}

方式2,指定具体的HTTP服务接口:

@ImportHttpServices(group = "book", types = {BookService.class})@ImportHttpServices(group = "user", types = {UserService.class})@Configurationpublic 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 服务接口的开发,是不是变的非常的简单了,任由你有多少的接口,我们只需要指定包路径即可。

定义如下的接口进行测试

@RestController@RequestMapping("/api")public class ApiController {  private final BookService bookService ;  private final UserService userService ;  public ApiController(BookService bookService, UserService userService) {    this.bookService = bookService;    this.userService = userService;  }
  @GetMapping("/books")  public List<Book> list() {    return this.bookService.list() ;  }  @GetMapping("/users/{id}")  public User queryUser(@PathVariable Long id) {    return this.userService.queryUser(id) ;  }}

2.2 编程方式注册

如果你需要对过滤或其他注册逻辑进行更多控制,还可以通过两个步骤以编程方式声明HTTP服务。

首先,创建一个声明HTTP服务组的注册器:

public class CustomHttpServiceRegistrar extends AbstractHttpServiceRegistrar {  @Override  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 服务组提供了透明的负载均衡和熔断机制支持。



以上是本篇文章的全部内容,如对你有帮助帮忙点赞+转发+收藏

太强了!Java开源Diff库,一行代码分析千行差异

查询优化!Spring Boot + Lucene 构建全文检索

可插拔、可配置、可扩展:Spring Boot 统一响应增强组件

性能优化!3种方法优化@Transactional长事务问题,方法三性能提升4倍(不修改业务代码)

高级开发!一个注解简化Spring Boot本地消息表(Outbox)实现

10个SQL优化技巧,性能提升300%

太强了!Spring Boot 五大内置 "神兵" 工具

Spring Boot 又一强大的内置功能,自动记录API请求/响应数据

哇塞!Spring Boot 一注解逆天,API 超时问题秒解决

Spring AI:零代码!智能生成SQL,实现数据实时查询!

JSON处理不再头疼!Jackson Tree模型解锁JSON操作的开挂模式

一定要会!MySQL窗口函数太实用了,再也不怕复杂SQL查询了

图片
图片
图片
图片
图片
图片
图片
图片
图片

【声明】内容源于网络
0
0
Spring全家桶实战案例
Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
内容 832
粉丝 0
Spring全家桶实战案例 Java全栈开发,前端Vue2/3全家桶;Spring, SpringBoot 2/3, Spring Cloud各种实战案例及源码解读
总阅读38
粉丝0
内容832