SpringCloud 极简入门 | 第三篇:RestTemplate服务通信

1.如何实现服务通信

1.1.流程说明

上一章节我们对Eureka Server做了高可用集群搭建,这一章节我们来实现简单版的服务通信。

目前除了Eureka Server以外我们的微服务有订单服务springcloud-order-server-1030,和用户服务springcloud-user-server-1020 , 我们就用这两个服务来演示微服务的通信,他们的调用关系应该是:浏览器 -> 订单服务 -> 用户服务,如下图:

这里订单服务通过RestTemplate向用户服务发起调用,目的是要获取到用户服务返回的User对象,最终是需要浏览器获取到User。

1.2.解决方案

用户服务需要提供User对象,我们需要为其编写Controller接口,编写相关方法返回User,订单服务需要从用户服务获取到User对象,而浏览器需要访问订单服务获取到User对象,所以订单服务也需要编写Controller接口供浏览器来调用。

我们发现不管是用户服务还是订单服务都需要用到User对象,那么是不是在用户服务和订单服务都需要创建User的模型?当然没必要,公共的东西就是要抽取,所以我们会把User对象封装在一个公共的模块 springcloud-user-common中然后让用户服务和订单服务都去依赖这个模块。

1.3.RestTemplate介绍

微服务的通信协议主流的有RPC,Http,SpringCloud是基于Http Restful 风格 ,在Java中发起一个Http请求的方式很多,比如 Apache的HttpClient , OKHttp等等 。Spring为我们封装了一个基于Restful的使用非常简单的Http客户端工具 RestTemplate ,我们就用它来实订单服务和用户服务的通信。需要注意的是,RestTmplate本身不具备服务发现和负载均衡器的功能,我们本章的案例只是演示在订单服务中使用RestTemplate基于ip和端口的方式向用户服务发起调用,即:不走注册中心,不使用服务发现方式。5.4.编码实战

2.编码实战

2.1.搭建公共模块

创建工程模块 springcloud-user-common ,效果如下:

springcloud-parent
    springcloud-eureka-server-1010
    springcloud-order-server-1030
    springcloud-user-common //公共User模块
    springcloud-user-server-1020

在springcloud-user-common中创建User对象如下

public class User {
    private Long id;
    private String username;
    private String desc;
​
    public User() {
    }
​
    public User(Long id, String username, String desc) {
        this.id = id;
        this.username = username;
        this.desc = desc;
    }
​
    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 getDesc() {
        return desc;
    }
​
    public void setDesc(String desc) {
        this.desc = desc;
    }
}
2.2.用户和订单依赖User模块

修改工程springcloud-order-server-1030 , springcloud-user-server-1020在他们的pom.xml都导入springcloud-user-common 模块

<dependency>
     <groupId>cn.itsource.springboot</groupId>
     <artifactId>springcloud-user-common</artifactId>
     <version>1.0-SNAPSHOT</version>
</dependency>
2.3.用户服务返回User

修改 springcloud-user-server-1020 工程,编写controller,返回User对象

//用户服务:暴露接口给订单访问
@RestController
public class UserController {
    //订单服务来调用这个方法      http://localhost:1020/user/10
    // @GetMapping(value = "/user/{id}" )
    @RequestMapping(value = "/user/{id}",method = RequestMethod.GET)
    public User getById(@PathVariable("id")Long id){
        //根据id去数据库查询User
        return  new User(id,"zs:"+id,"我是zs");
    }
}
2.4.订单服务获取User

在订单服务中需要使用RestTemplate调用用户服务,我们需要把RestTmplate配置成Bean方便使用(当然也可以不创建Bean,用的时候直接new对象也可以) ,修改工程springcloud-order-server-1030在主配置类配置RestTemplate如下:

​
/**
 * 订单的启动类
 */
@SpringBootApplication
@EnableEurekaClient
public class OrderServerApplication{
    //配置一个RestTemplate ,Spring封装的一个机遇Restful风格的http客户端 工具
    @Bean
    public RestTemplate restTemplate(){
        return new RestTemplate();
    }
​
    public static void main( String[] args ){
        SpringApplication.run(OrderServerApplication1030.class);
    }
}

创建controller,通过RestTemplate调用用户服务,代码如下:

​
//订单服务
@RestController
public class OrderController {
​
    //需要配置成Bean
    @Autowired
    private RestTemplate  restTemplate ;
​
    //浏览器调用该方法
    @RequestMapping(value = "/order/{id}",method = RequestMethod.GET)
    public User getById(@PathVariable("id")Long id){
        //发送http请求调用 user的服务,获取user对象 : RestTemplate
        //目标资源路径:user的ip,user的端口,user的Controller路径
        String url = "http://localhost:1020/user/"+id;
       
        //发送http请求
        return restTemplate.getForObject(url, User.class);
​
    }
}

这里的url是用户服务获取user资源的路径,通过RestTmplate发起Http调用,拿到User对象后返回给浏览器。

2.5.测试服务通信

依次启动Eureka Server注册中心(不启动也行) , 用户服务 ,订单服务 , 浏览器访问订单服务:http://localhost:1030/order/1 , 返回结果:

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值