Spring Boot 单体架构下要做“远程调用”,其实就是把原来进程内直接 new 的调用,改成跨进程的 HTTP 调用。
✅ 方案 1:最轻量——RestTemplate(无依赖,单体可用)
步骤 1:提供方(order-service,端口 8081)
@RestController
@RequestMapping("/user")
public class UserController {
@GetMapping("/{id}")
public User getUser(@PathVariable Long id){
return new User(id, "Mike");
}
}
步骤 2:调用方(单体应用,端口 8080)
@SpringBootApplication
public class App {
public static void main(String[] args) { SpringApplication.run(App.class, args); }
@Bean
public RestTemplate restTemplate() { return new RestTemplate(); }
}
@Service
public class OrderService {
@Autowired
private RestTemplate restTemplate;
public Order queryOrder(Long orderId){
Order order = orderMapper.findById(orderId);
// 远程调用
User user = restTemplate.getForObject(
"http://localhost:8081/user/" + order.getUserId(), User.class);
order.setUser(user);
return order;
}
}
只需 Spring-Web 依赖即可,适合“两个独立 Spring Boot 单体”互相调用 。
✅ 方案 2:声明式——OpenFeign(需要 Spring Cloud)
如果想像调用本地接口一样写远程调用,可以用 OpenFeign,但需要引入 Spring Cloud(本质上也是 HTTP)。
步骤 1:依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
步骤 2:启用 Feign
@SpringBootApplication
@EnableFeignClients // 开启 Feign
public class App { }
步骤 3:声明客户端
@FeignClient(name = "user-service", url = "http://localhost:8081")
public interface UserClient {
@GetMapping("/user/{id}")
User getUser(@PathVariable Long id);
}
步骤 4:直接注入使用
@Service
public class OrderService {
@Autowired
private UserClient userClient;
public Order queryOrder(Long orderId){
Order order = orderMapper.findById(orderId);
order.setUser(userClient.getUser(order.getUserId()));
return order;
}
}
这种方式代码最简洁,但引入了 Spring Cloud 依赖,适合后期可能拆微服务的单体 。
✅ 方案 3:最新 JDK 17+ 玩法——HTTP Interfaces(Spring Boot 3)
Spring Boot 3 提供了“声明式 HTTP 客户端”新特性,写法与 Feign 类似,但不依赖 Spring Cloud。
步骤 1:声明接口
public interface UserClient {
@GetExchange("/user/{id}")
User getUser(@PathVariable Long id);
}
步骤 2:生成代理 Bean
@Configuration
public class HttpClientConfig {
@Bean
public UserClient userClient() {
WebClient webClient = WebClient.builder().baseUrl("http://localhost:8081").build();
HttpServiceProxyFactory factory = HttpServiceProxyFactory.builder(WebClientAdapter.forClient(webClient)).build();
return factory.createClient(UserClient.class);
}
}
步骤 3:注入使用
@Service
public class OrderService {
@Autowired
private UserClient userClient;
public Order queryOrder(Long orderId){
Order order = orderMapper.findById(orderId);
order.setUser(userClient.getUser(order.getUserId()));
return order;
}
}
需要 Spring Boot 3 + Java 17,依赖最轻,语法最优雅 。
场景 | 推荐方案 |
---|---|
两个独立 Spring Boot 单体,最快速 | 方案 1 RestTemplate |
单体未来可能拆微服务,需要熔断、负载均衡 | 方案 2 OpenFeign |
项目已升级到 Spring Boot 3 & Java 17,追求简洁 | 方案 3 HTTP Interfaces |
基本上,你就可以完成在“单体架构”里优雅地做远程 HTTP 调用了
* Thanks you *
如果觉得文章内容不错,随手帮忙点个赞、在看、转发一下,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章。
*往期推荐 *
实现如何利用 Kafka 延时删除 用户邮箱的验证码(如何发送邮箱+源码) - 第一期
Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)-第三期
Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)
想要高效处理,那不妨看看 Python的 异步 Asyncio 保证效率翻多倍
银河麒麟 | ubuntu 安装国产达梦DM8数据库(安装+外网通+IDEA连接)
网络设备日志存储到指定的Kiwi-log服务器(图解+软件)
银河麒麟 | ubuntu 安装运用 docker 容器,实现容器化部署项目
银河麒麟 | ubuntu 安装zabbix监控设备信息(亲测包对)
国产操作系统-银河麒麟本地化部署Ollama国产开源的AI大模型Qwen3
Swagger | 手把手带你写自动生成接口文档的爽感(零基础亲测实用)
SpringBoot整合Openfeign接入Kimi Ai!!超简单,居然没多少行代码??(附加兜底教程)
Maven | 站在初学者的角度配置与项目创建(新手必学会)
Spring Ai | 极简代码从零带你一起走进AI项目(中英)
MongoDB | 零基础学习与Springboot整合ODM实现增删改查(附源码)
Openfeign | 只传递城市代码,即可获取该地域实时的天气数据(免费的天气API)
Mongodb | 基于Springboot开发综合社交网络应用的项目案例(中英)
感谢阅读 | 更多内容尽在公棕号 WMCode | 优快云@小Mie不吃饭