Springboot单体架构下如何做 远程调用 (源码)
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:依赖
org.springframework.cloud
spring-cloud-starter-openfeign
步骤 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
@Configurationpublic 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 单体,最快速
单体未来可能拆微服务,需要熔断、负载均衡
项目已升级到 Spring Boot 3 & Java 17,追求简洁
基本上,你就可以完成在“单体架构”里优雅地做远程 HTTP 调用了
* Thanks you *
如果觉得文章内容不错,随手帮忙点个赞、在看、转发一下,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章。
*往期推荐 *
Vue 项目打包部署还存在问题?你知道怎么做吧?
FastAPI 小白教程:从入门级到实战(源码教程)
实现如何利用 Kafka 延时删除 用户邮箱的验证码(如何发送邮箱+源码) - 第一期
Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)-第三期
Docker小白入门教程一篇领你入门(CRUD全命令+无废话版+问题集)
想要高效处理,那不妨看看 Python的 异步 Asyncio 保证效率翻多倍
银河麒麟 | ubuntu 安装国产达梦DM8数据库(安装+外网通+IDEA连接)
网络设备日志存储到指定的Kiwi-log服务器(图解+软件)
银河麒麟 | ubuntu 安装运用 docker 容器,实现容器化部署项目
银河麒麟 | ubuntu 安装zabbix监控设备信息(亲测包对)
国产操作系统-银河麒麟本地化部署Ollama国产开源的AI大模型Qwen3
Ubuntu | 安装 Zabbix 一篇就够了
Swagger | 手把手带你写自动生成接口文档的爽感(零基础亲测实用)
SpringBoot整合Openfeign接入Kimi Ai!!超简单,居然没多少行代码??(附加兜底教程)
SpringBoot接入Kimi实践记录轻松上手
Linux | 零基础Ubuntu搭建JDK
Maven | 站在初学者的角度配置与项目创建(新手必学会)
Spring Ai | 极简代码从零带你一起走进AI项目(中英)
Open Ai | 从零搭建属于你的Ai项目(中英结合)
MongoDB | 零基础学习与Springboot整合ODM实现增删改查(附源码)
Openfeign | 只传递城市代码,即可获取该地域实时的天气数据(免费的天气API)
Redis | 缓存技术对后端的重要性,你知道多少?
Mongodb | 基于Springboot开发综合社交网络应用的项目案例(中英)
感谢阅读 | 更多内容尽在公棕号 WMCode | CSDN@小Mie不吃饭