Spring Cloud 如何实现服务间的调用 4.2.3
如果存在多个服务时,要怎么通过注册中心来实现服务之间的调用呢?接下来将通过一个用户和订单之间的调用案例,来演示Eureka Server中服务之间的调用。
搭建订单服务工程
在父工程xcservice-springcloud中,创建Maven子模块xcservice-eureka-order
(1)在pom.xml中,添加spring-cloud-starter-eureka依赖,其代码如下。
文件4-8 application.yml
文件4-9 Order.java
文件4-10 OrderController.java
(1)在pom.xml中,添加spring-cloud-starter-eureka依赖,其代码如下。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency>
(2)编写配置文件。在配置文件中添加Eureka服务实例的端口号、服务端地址等信息,如文件4-8所示。
文件4-8 application.yml
server:
port: 7900 # 指定该Eureka实例的端口号
eureka:
instance:
prefer-ip-address: true # 是否显示主机的IP
#instance-id: ${spring.cloud.client.ipAddress}:${server.port} #将Status中的显示内容也以“IP:端口号”的形式显示
client:
service-url:
defaultZone: http://localhost:8761/eureka/ # 指定Eureka服务端地址
spring:
application:
name: xcservice-eureka-order # 指定应用名称
(3)创建订单实体类。
文件4-9 Order.java
package com.xc.xcserviceeurekaorder.po; public class Order { private String id; private Double price; private String receiverName; private String receiverAddress; private String receiverPhone; ... }
(4)创建订单控制器类。
文件4-10 OrderController.java
package com.xc.xcserviceeurekaorder.controller; import com.xc.xcserviceeurekaorder.po.Order; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; @RestController public class OrderController { /** * 通过id查询订单 */ @GetMapping("/order/{id}") public String findOrderById(@PathVariable String id) { Order order = new Order(); order.setId("123"); order.setPrice(23.5); order.setReceiverAddress("beijing"); order.setReceiverName("xiaoqiang"); order.setReceiverPhone("13422343311"); return order.toString(); } }
(5)在引导类中添加@EnableEurekaClient注解。
编写用户服务功能
(1)在xcservice-eureka-user工程的引导类中,创建RestTemplate的Spring实例,其代码如下:
(2)创建用户控制器类
文件4-11 UserController.java
3. 启动服务应用,测试服务调用
分别启动服务注册中心应用、订单服务应用和用户服务应用
@Bean public RestTemplate restTemplate() { return new RestTemplate(); }
在上述代码中,RestTemplate是Spring提供的用于访问Rest服务的客户端实例,它提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
(2)创建用户控制器类
文件4-11 UserController.java
package com.xc.xcserviceeurekauser.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.client.RestTemplate; @RestController public class UserController { @Autowired private RestTemplate restTemplate; /** * http://localhost:8000/findOrdersByUser/1 * 查找与用户相关的订单 */ @GetMapping("/findOrdersByUser/{id}") public String findOrdersByUser(@PathVariable String id) { // 假设用户只有一个订单,并且订单id为123 int oid = 123; return restTemplate.getForObject("http://localhost:7900/order/" + oid, String.class); } }
在上述代码中,当用户查询订单时,首先会通过用户id查询与用户相关的所有订单(由于这里主要是演示服务的调用,所以省略了查询方法,并且自定义了一个oid为123的订单,来模拟查询出的结果)。然后通过restTemplate对象的getForObject()方法调用了订单服务中的查询订单方法来查询订单id为123的订单信息。
3. 启动服务应用,测试服务调用
分别启动服务注册中心应用、订单服务应用和用户服务应用

当通过浏览器访问地址http://localhost:8000/findOrdersByUser/1(1表示用户id)后,浏览器的显示效果。
Order{id='123', price=23.5, receiverName='xiaoqiang', receiverAddress='beijing', receiverPhone='13422343311'}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
2018-07-14 mysql json 使用 类型 查询 函数
2018-07-14 java 子类强转父类 父类强转子类
2018-07-14 java UUID