SpringCloud极简入门-使用RestTemplate实现服务通信

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

五.使用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和端口的方式向用户服务发起调用,即:不走注册中心,不使用服务发现方式。

2.服务通信实战

2.1.搭建公共User模块

创建工程模块 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对象如下:

packagecn.itsource.springboot.domain;
publicclassUser {
privateLongid;
privateStringusername;
privateStringdesc;
publicUser() {
    }
publicUser(Longid, Stringusername, Stringdesc) {
this.id=id;
this.username=username;
this.desc=desc;
    }
publicLonggetId() {
returnid;
    }
publicvoidsetId(Longid) {
this.id=id;
    }
publicStringgetUsername() {
returnusername;
    }
publicvoidsetUsername(Stringusername) {
this.username=username;
    }
publicStringgetDesc() {
returndesc;
    }
publicvoidsetDesc(Stringdesc) {
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对象

//用户服务:暴露接口给订单访问@RestControllerpublicclassUserController {
//订单服务来调用这个方法      http://localhost:1020/user/10// @GetMapping(value = "/user/{id}" )@RequestMapping(value="/user/{id}",method=RequestMethod.GET)
publicUsergetById(@PathVariable("id")Longid){
//根据id去数据库查询UserreturnnewUser(id,"zs:"+id,"我是zs");
    }
}

2.4.订单服务获取User

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

/*** 订单的启动类*/@SpringBootApplication@EnableEurekaClientpublicclassOrderServerApplication1030{
//配置一个RestTemplate ,Spring封装的一个机遇Restful风格的http客户端 工具@BeanpublicRestTemplaterestTemplate(){
returnnewRestTemplate();
    }
publicstaticvoidmain( String[] args )
    {
SpringApplication.run(OrderServerApplication1030.class);
    }
}

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

//订单服务@RestControllerpublicclassOrderController {
//需要配置成Bean@AutowiredprivateRestTemplaterestTemplate ;
//浏览器调用该方法@RequestMapping(value="/order/{id}",method=RequestMethod.GET)
publicUsergetById(@PathVariable("id")Longid){
//发送http请求调用 user的服务,获取user对象 : RestTemplate//目标资源路径:user的ip,user的端口,user的Controller路径Stringurl="http://localhost:1020/user/"+id;
//发送http请求returnrestTemplate.getForObject(url, User.class);
    }
}

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

2.5.测试服务通信

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

3.做个小结

虽然这里我们基于RestTemplate实现了订单服务和用户服务的通信,但是我们在请求用户服务的时候是使用ip地址和端口的方式,在之前的Eureka章节我们说到,Eureka的目的就是用来管理微服务的通信地址,服务之间可以使用服务名发起调用,很显然我们还咩有满足这一情况。在下一章节我们将使用Ribbon客户端负载均衡配合RestTmplate使用服务发现的方式时间服务的通信。

目录
相关文章
|
27天前
|
Dubbo Java 应用服务中间件
Spring Cloud Dubbo:微服务通信的高效解决方案
【10月更文挑战第15天】随着信息技术的发展,微服务架构成为企业应用开发的主流。Spring Cloud Dubbo结合了Dubbo的高性能RPC和Spring Cloud的生态系统,提供高效、稳定的微服务通信解决方案。它支持多种通信协议,具备服务注册与发现、负载均衡及容错机制,简化了服务调用的复杂性,使开发者能更专注于业务逻辑的实现。
51 2
|
1月前
|
存储 数据可视化 Java
基于MicrometerTracing门面和Zipkin实现集成springcloud2023的服务追踪
Sleuth将会停止维护,Sleuth最新版本也只支持springboot2。作为替代可以使用MicrometerTracing在微服务中作为服务追踪的工具。
91 1
|
6天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
34 3
|
30天前
|
Dubbo Java 应用服务中间件
Dubbo学习圣经:从入门到精通 Dubbo3.0 + SpringCloud Alibaba 微服务基础框架
尼恩团队的15大技术圣经,旨在帮助开发者系统化、体系化地掌握核心技术,提升技术实力,从而在面试和工作中脱颖而出。本文介绍了如何使用Dubbo3.0与Spring Cloud Gateway进行整合,解决传统Dubbo架构缺乏HTTP入口的问题,实现高性能的微服务网关。
|
2月前
|
消息中间件 存储 Java
SpringCloud基础9——服务异步通信-高级篇
消息可靠性、死信交换机、惰性队列、MQ集群
SpringCloud基础9——服务异步通信-高级篇
|
2月前
|
Java API 对象存储
微服务魔法启动!Spring Cloud与Netflix OSS联手,零基础也能创造服务奇迹!
这段内容介绍了如何使用Spring Cloud和Netflix OSS构建微服务架构。首先,基于Spring Boot创建项目并添加Spring Cloud依赖项。接着配置Eureka服务器实现服务发现,然后创建REST控制器作为API入口。为提高服务稳定性,利用Hystrix实现断路器模式。最后,在启动类中启用Eureka客户端功能。此外,还可集成其他Netflix OSS组件以增强系统功能。通过这些步骤,开发者可以更高效地构建稳定且可扩展的微服务系统。
56 1
|
1月前
|
负载均衡 Java API
【Spring Cloud生态】Spring Cloud Gateway基本配置
【Spring Cloud生态】Spring Cloud Gateway基本配置
37 0
|
2月前
|
SpringCloudAlibaba API 开发者
新版-SpringCloud+SpringCloud Alibaba
新版-SpringCloud+SpringCloud Alibaba
|
3月前
|
资源调度 Java 调度
Spring Cloud Alibaba 集成分布式定时任务调度功能
定时任务在企业应用中至关重要,常用于异步数据处理、自动化运维等场景。在单体应用中,利用Java的`java.util.Timer`或Spring的`@Scheduled`即可轻松实现。然而,进入微服务架构后,任务可能因多节点并发执行而重复。Spring Cloud Alibaba为此发布了Scheduling模块,提供轻量级、高可用的分布式定时任务解决方案,支持防重复执行、分片运行等功能,并可通过`spring-cloud-starter-alibaba-schedulerx`快速集成。用户可选择基于阿里云SchedulerX托管服务或采用本地开源方案(如ShedLock)
122 1
|
1月前
|
JSON SpringCloudAlibaba Java
Springcloud Alibaba + jdk17+nacos 项目实践
本文基于 `Springcloud Alibaba + JDK17 + Nacos2.x` 介绍了一个微服务项目的搭建过程,包括项目依赖、配置文件、开发实践中的新特性(如文本块、NPE增强、模式匹配)以及常见的问题和解决方案。通过本文,读者可以了解如何高效地搭建和开发微服务项目,并解决一些常见的开发难题。项目代码已上传至 Gitee,欢迎交流学习。
125 1
Springcloud Alibaba + jdk17+nacos 项目实践