前面我们已经搭建好了User和Order模块,这里我们来简单实现他们之间的服务通信。再User模块新建一个Web.controller的包。写一个controller类,返回一个User对象,所以我们这里需要一个User对象,这里对象能够被所有的子模块都能获取到。哪个模块需要的时候我们就引入依赖就可以了。
so 先新建一个子模块,不需要引任何的依赖。里面只需要一个domain,写一个User实体类
public class User {
private Long id;
private String username;
private String password;
private String intro;
public User() {
}
public User(Long id, String username, String password, String intro) {
this.id = id;
this.username = username;
this.password = password;
this.intro = intro;
}
public String getIntro() {
return intro;
}
public void setIntro(String intro) {
this.intro = intro;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
在user-server模块和order-server引入 user,当然该jar也可以在父模块管理起来
<dependency>
<groupId>cn.wly</groupId>
<artifactId>springcloud-user-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
创建UserController;返回一个Json格式的User对象,
@RestController //该注解等同于@Controller和@ResponseBody
public class UserController {
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Long id){
return new User(1L,"java","123456","测试");
}
}
源码:

重启Userserver,在浏览器访问;http://peer1:1020/user/1,拿到结果

需求
这里是使用user访问,接下来我们要使用order访问user拿到User对象
浏览器 -> order服务 -> user服务
那么怎么实现服务之间的通信呢,我们先来了解一下:

springcloud使用的Restful风格,这里订单服务通过RestTemplate向用户服务发起调用,目的是要获取到用户服务返回的User对象,最终是需要浏览器获取到User。
订单服务需要从用户服务获取到User对象,而浏览器需要访问订单服务获取到User对象,所以订单服务也需要编写Controller接口供浏览器来调用。
RestTemplate介绍
微服务的通信协议主流的有RPC,Http,SpringCloud是基于Http Restful 风格 ,在Java中发起一个Http请求的方式很多,比如 Apache的HttpClient , OKHttp等等 。Spring为我们封装了一个基于Restful的使用非常简单的Http客户端工具 RestTemplate ,我们就用它来实订单服务和用户服务的通信。需要注意的是,RestTmplate本身不具备服务发现和负载均衡器的功能,我们这里的案例只是演示在订单服务中使用RestTemplate基于ip和端口的方式向用户服务发起调用,即:不走注册中心,不使用服务发现方式。
实现
我们既然要使用RestTemplate发请求,那么就要先拿到它,所以在主配置类用bean的方式来创建一个RestTemplate;交给spring容器管理,在controller里面就可以自动注入一个来使用:
@Bean
public RestTemplate template(){
return new RestTemplate();
}
在controller注入,然后使用它发请求,代码如下:
@RestController
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
public User getUserById(@PathVariable("id") Long id) {
String url = "http://localhost:1020/user/" + id;
return restTemplate.getForObject(url, User.class);
}
}
重启order服务,然后浏览器访问 peer1:1030/order/1

拿到结果,说明服务之间通信成功。
1万+



被折叠的 条评论
为什么被折叠?



