四、RestTemplate服务通信
紧接着上面得微服务,我们使用两个服务进行调用演示,他们的调用关系应该是:浏览器 -> 订单服务 -> 用户服务,如下图:
这里订单服务通过RestTemplate向用户服务发起调用,目的是要获取到用户服务返回的User对象,最终是需要浏览器获取到User。
1、RestTemplate介绍
微服务的通信协议主流的有RPC,Http,SpringCloud是基于Http Restful 风格 ,在Java中发起一个Http请求的方式很多,比如 Apache的HttpClient , OKHttp等等 。Spring为我们封装了一个基于Restful的使用非常简单的Http客户端工具 RestTemplate ,我们就用它来实订单服务和用户服务的通信。需要注意的是,RestTmplate本身不具备服务发现和负载均衡器的功能,我们本章的案例只是演示在订单服务中使用RestTemplate基于ip和端口的方式向用户服务发起调用,即:不走注册中心,不使用服务发现方式。
2、创建公共得模块
这里我使用UserTo作为需要传递信息得对象
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UserTo {
private Long id;
private String username;
private String desc;
}
注意这里我们需要导入lombok得maven插件,可以直接将依赖导入到父模块中,我在这里只是导入到需要得模块中
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
3、将公共模块导入到用户、订单模块中
<!--导入实体类-->
<dependency>
<groupId>cn.itsource</groupId>
<artifactId>springcloud-common</artifactId>
<version>${my.version}</version>
</dependency>
4、修改用户服务
需要写controller返回UserTo对象
@RestController
public class UserController {
@GetMapping("user/{id}")
public UserTo getUserById(@PathVariable("id") Long id) {
return new UserTo(id, "张三", "这是测试得内容");
}
}
5、修改订单服务
这里不光要写controller还需要使用到RestTemplate向用户服务发送请求,也就在微服务之间进行通信
需要现在订单服务得主配置类OrderServerApplication1030加入以下内容
//手动配置一个RestTemplate,Spring封装的一个基于Restful风格的http客户端工具,交给spring进行管理
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
再添加controller
@RestController
public class OrderController {
//注入在配置类中定义得RestTemplate
@Autowired
private RestTemplate restTemplate;
@GetMapping("order/{id}")
public UserTo getUserToById(@PathVariable("id")Long id) {
//目标得资源路径,是调用得user服务中controller得路径
String url = "http://localhost:1020/user/" + id;
//发送http请求
return restTemplate.getForObject(url, UserTo.class);
}
}
这里的url是用户服务获取UserTo资源的路径,通过RestTmplate发起Http调用,拿到UserTo对象后返回给浏览器。