简介
Spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接,我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
前期准备
在SpringCloud环境下创建用户服务
和订单服务
两个模块,引入以下依赖:
<dependencies> <!--引入SpringBoot依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!--引入Consul依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-consul-discovery</artifactId> <version>3.0.3</version> </dependency> <!--引入健康状况监控依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!--引入Lombok依赖--> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency> </dependencies>
修改用户服务的配置文件,主要配置服务名、注册中心的信息。注册中心这里使用的是Consul,所以需要先把Consul服务端启动。
# 服务端口 server.port=8082 # 指定服务名称 唯一标识(不可以出现下划线) spring.application.name=USERS # 指定Consul服务端信息 spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.service-name=${spring.application.name} # 关闭Consul了服务的健康检查[不推荐] # spring.cloud.consul.discovery.register-health-check=false
修改订单服务配置文件
# 服务端口 server.port=8083 # 指定服务名称 唯一标识(不可以出现下划线) spring.application.name=ORDERS # 指定Consul服务端信息 spring.cloud.consul.host=localhost spring.cloud.consul.port=8500 spring.cloud.consul.discovery.service-name=${spring.application.name} # 关闭Consul了服务的健康检查[不推荐] # spring.cloud.consul.discovery.register-health-check=false
在各自的启动类上面添加@EnableDiscoveryClient
注解。
启动两个项目,之后访问Consul的Web页面可以看到两个服务已经成功的注册到了Consul
编写测试接口
在订单服务中编写一个获取订单号的测试接口
@RestController @RequestMapping("/orders") public class OrderController { @Value("${server.port}") private int port; /** * 获取我的订单 */ @GetMapping("/uId/{id}") public String getOrdersByUserId(@PathVariable("id") Integer id){ return "20210726120030X"+id+"P"+port; } }
private int port
成员变量是方便搭建订单服务集群的时候看到效果,因为搭建集群需要使用多个端口要运行订单服务。
在用户服务中编写测试接口,接口中使用RestTemplate调用订单服务的接口
接口地址:http://localhost:8083/orders/uId/1 返回数据:20210726120030X1P8083
@Slf4j @RestController @RequestMapping("/users") public class UserController { /** * 获取用户的订单 */ @GetMapping("/id/{id}/orders") public String getUserOrders(@PathVariable("id") Integer id){ RestTemplate restTemplate = new RestTemplate(); return restTemplate.getForObject("http://localhost:8083/orders/uId/"+id, String.class); } }
之后在浏览器中访问http://localhost:8082/users/id/2/orders
返回数据:20210726120030X2P8083
不足之处
- RestTemplate是直接基于服务地址调用没有在服务注册中心获取服务。
- 没有办法完成服务的负载均衡以及心跳检测。
- 直接在代码中编写服务的地址以及请求,硬编码不利于维护。