> 技术文档 > Springboot单体架构下如何做 远程调用 (源码)

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)

@SpringBootApplicationpublic class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @Bean public RestTemplate restTemplate() { return new RestTemplate(); }}@Servicepublic 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 // 开启 Feignpublic class App { }

步骤 3:声明客户端​​​​​​​

@FeignClient(name = \"user-service\", url = \"http://localhost:8081\")public interface UserClient { @GetMapping(\"/user/{id}\") User getUser(@PathVariable Long id);}

步骤 4:直接注入使用​​​​​​​

@Servicepublic 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:注入使用​​​​​​​

@Servicepublic 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 *

如果觉得文章内容不错,随手帮忙点个赞在看转发一下,如果想第一时间收到推送,也可以给我个星标⭐~谢谢你看我的文章。


*往期推荐 *

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不吃饭

邯郸房产信息港