0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

介绍SpringCloud中三种服务调用方式

工程师邓生 来源:CSDN 作者:君宝逍遥 2022-09-23 10:52 次阅读

服务测试环境

1.引入Eureka所需的依赖

2.修改配置文件

3.启动服务

4.测试

消费者

1.发现客户端方式

2.Ribbon方式功能的Spring RestTemplate

3.feign客户端方式

本文主要介绍SpringCloud中调用服务的方式:

Spring DiscoveryClient

支持 Ribbon 的 RestTemplate

Feign客户端

服务测试环境

测试中,发现Netflix的Eureka服务层采用。

主要步骤如下:

1.引入Eureka所需的依赖



org.springframework.cloud
spring-cloud-starter-eureka-server

 

org.springframework.cloud
spring-cloud-starter-eureka

2.修改配置文件

服务端:

eureka:
instance:
hostname:eureka9001.com#eureka服务端的实例名称
instance-id:eureka9001
client:
register-with-eureka:false#false表示不向注册中心注册自己
fetch-registry:false##false表示自己就是注册中心,职责就是维护服务实例,并不需要去检索服务
service-url:
defaulteZone:http://127.0.0.1:9001

客户端1:

server:
port:8002
spring:
application:
name:licensingservice
eureka:
instance:
instance-id:licensing-service-8002
prefer-ip-address:true
client:
register-with-eureka:true
fetch-registry:true
service-url:
defaultZone:http://127.0.0.1:9001/eureka/,

客户端2:

server:
port:8002
spring:
application:
name:licensingservice
eureka:
instance:
instance-id:licensing-service-8002
prefer-ip-address:true
client:
register-with-eureka:true
fetch-registry:true
service-url:
defaultZone:http://127.0.0.1:9001/eureka/,

一组微服务的不同实例采办服务名称不同,不同的实例ID不同,不同,spring.application.name和eureka.instance.instance-id。

3.启动服务

服务端:

@SpringBootApplication
@EnableEurekaServer
publicclassEurekaServerPort9001_App{
publicstaticvoidmain(String[]args){
SpringApplication.run(EurekaServerPort9001_App.class,args);
}
}

客户端:

@SpringBootApplication
@RefreshScope
@EnableEurekaClient
publicclassLicenseApplication_8002{
publicstaticvoidmain(String[]args){
SpringApplication.run(LicenseApplication_8002.class,args);
}
}

4.测试

进入到Eureka服务端地址,我这是127.0.0.1:9001,可以查看注册到注册中心的服务。

标签

b42faa5e-3ae9-11ed-9e49-dac502259ad0.png


注意:Eureka通过两次服务检测均到通过,服务将在间隔10秒内成功启动服务注册等待30秒。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

消费者

1.发现客户端方式

服务中既是服务是微信也可以是调用者,消费者配置和上面配置的大体参考一致,依赖及配置服务端启动方式EnableEurekaClient:监听启动。

@SpringBootApplication
@EnableEurekaClient
@EnableDiscoveryClient
publicclassConsumerApplication_7002{
publicstaticvoidmain(String[]args){
SpringApplication.run(ConsumerApplication_7002.class,args);
}
}

核心配置类:

@Component
publicclassConsumerDiscoveryClient{

@Autowired
privateDiscoveryClientdiscoveryClient;

publicServiceInstancegetServiceInstance(){
ListserviceInstances=discoveryClient.getInstances("licensingservice");
if(serviceInstances.size()==0){
returnnull;
}
returnserviceInstances.get(0);
}

publicStringgetUrl(Stringurl){
ServiceInstanceserviceInstance=this.getServiceInstance();
if(serviceInstance==null)
thrownewRuntimeException("404,NOTFOUND");
StringurlR=String.format(url,serviceInstance.getUri().toString());
returnurlR;
}
}

通过DiscoveryClient从尤里卡中获取licensingservice服务的实例,并返回第一个实例。

测试控制器

@RestController
@RequestMapping("test")
publicclassTestController{
//注意必须new,否则会被ribbon拦截器拦截,改变URL行为
privateRestTemplaterestTemplate=newRestTemplate();
@Autowired
privateConsumerDiscoveryClientconsumerDiscoveryClient;
@RequestMapping("/getAllEmp")
publicListgetAllLicense(){
Stringurl=consumerDiscoveryClient.getUrl("%s/test/getAllEmp");
returnrestTemplate.getForObject(url,List.class);
}
}

测试:

调试信息

b4590b2e-3ae9-11ed-9e49-dac502259ad0.png

从该图可以看到licensingservice,拥有两个服务实例,并可以查看实例信息。

页面返回信息

b482f33a-3ae9-11ed-9e49-dac502259ad0.png

成功查询到数据库存储信息。

2.Ribbon方式功能的Spring RestTemplate

同上。

核心配置类:

//指明负载均衡算法
@Bean
publicIRuleiRule(){
returnnewRoundRobinRule();
}

@Bean
@LoadBalanced//告诉Spring创建一个支持Ribbon负载均衡的RestTemplate
publicRestTemplaterestTemplate(){
returnnewRestTemplate();
}

设置均衡方式为轮询方式。

测试类:

@RestController
@RequestMapping("rest")
publicclassConsumerRestController{

@Autowired
privateRestTemplaterestTemplate;
privatefinalstaticStringSERVICE_URL_PREFIX="http://LICENSINGSERVICE";

@RequestMapping("/getById")
publicEmpgetById(Longid){
MultiValueMapparamMap=newLinkedMultiValueMap();
paramMap.add("id",id);
returnrestTemplate.postForObject(SERVICE_URL_PREFIX+"/test/getById",paramMap,Emp.class);
}
}

测试结果:

第一次:

b49c7652-3ae9-11ed-9e49-dac502259ad0.png

第二次:

b4c0d1aa-3ae9-11ed-9e49-dac502259ad0.png

第三次:

b49c7652-3ae9-11ed-9e49-dac502259ad0.png

因为采用轮询平均方式分别使用不同的服务实例,未区别,将名称确定了一定的。

这上面,Ribbon 是对第一种方式的封装方式和不同的负载率。 Feign的方式则大大降低了开发客户端和提升速度。

3.feign客户端方式

引入依赖:


org.springframework.cloud
spring-cloud-starter-feign

主要代码:

@FeignClient(value="LICENSINGSERVICE",fallbackFactory=ServiceImp.class)
publicinterfaceServiceInterface{

@RequestMapping("/test/getById")
EmpgetById(@RequestParam("id")Longid);

@RequestMapping("/test/getLicenseById")
LicensegetLicenseById(@RequestParam("id")Longid);

@RequestMapping("/test/getAllEmp")
ListgetAllLicense();
}
@Component
publicclassServiceImpimplementsFallbackFactory{

@Override
publicServiceInterfacecreate(Throwablethrowable){
returnnewServiceInterface(){
@Override
publicEmpgetById(Longid){
Empemp=newEmp();
emp.setName("iamfeignfallbackcreate");
returnemp;
}

@Override
publicLicensegetLicenseById(Longid){
returnnull;
}

@Override
publicListgetAllLicense(){
returnnull;
}
};
}
}

注采用接口模式,通过指定服务名以及方法,在服务开发结果不佳时,方便返回默认的,而不是一个不友好的错误。

主启动类:

@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
publicclassConsumer_feign_Application_7004{
publicstaticvoidmain(String[]args){
SpringApplication.run(Consumer_feign_Application_7004.class,args);
}
}

测试类:

@RestController
@RequestMapping("rest")
publicclassConsumerRestController{
@Autowired
privateServiceInterfaceserviceInterface;

@Autowired
privateRestTemplaterestTemplate;
@RequestMapping("/getById")
publicEmpgetById(Longid){
returnserviceInterface.getById(id);
}
}

测试结果:

正常测试:

b49c7652-3ae9-11ed-9e49-dac502259ad0.png

关闭两个实例,模拟服务实例死亡:

b550ba36-3ae9-11ed-9e49-dac502259ad0.png

假装能够故障服务调用,也可以实现调用的服务时,友好的信息。

以此方式,由低上,从不同层次实现了SpringCloud中的微服务相互引用。




审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 模拟器件
    +关注

    关注

    2

    文章

    106

    浏览量

    23209
  • 服务端
    +关注

    关注

    0

    文章

    66

    浏览量

    7004

原文标题:SpringCloud 三种服务调用方式,你学会了吗?

文章出处:【微信号:芋道源码,微信公众号:芋道源码】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    伺服电机的三种控制方式

    伺服电机控制方式有脉冲、模拟量和通讯这三种,在不同的应用场景下,我们该如何选择伺服电机的控制方式呢?
    发表于 08-17 11:01 7096次阅读

    FPGA中三种常用复位电路

    在FPGA设计中,复位电路是非常重要的一部分,它能够确保系统从初始状态开始启动并保证正确运行。本文将分别介绍FPGA中三种常用复位电路:同步复位、异步复位和异步复位同步释放,以及相应的Verilog代码示例。
    发表于 05-14 14:44 2562次阅读
    FPGA<b class='flag-5'>中三种</b>常用复位电路

    三种复位方式比较

    三种复位方式比较
    发表于 08-16 17:31

    步进电机的三种驱动方式

    步进电机的三种驱动方式
    发表于 01-12 17:03

    STM32的三种boot模式介绍

    浅识STM32的三种boot模式文章目录浅识STM32的三种boot模式任务摘要一、认识boot1.三种BOOT模式介绍2.开发BOOT模式选择3.STM32
    发表于 12-10 07:46

    STM32三种启动方式是什么

    STM32三种启动方式是什么
    发表于 12-15 07:16

    发电机励磁方式有哪些_三种发电机励磁方式

    本文首先介绍了励磁系统的原理,其次介绍了励磁系统的组成和发电机获得励磁电流的三种方式,最后介绍了发电机励磁的
    的头像 发表于 05-09 11:27 7.8w次阅读
    发电机励磁<b class='flag-5'>方式</b>有哪些_<b class='flag-5'>三种</b>发电机励磁<b class='flag-5'>方式</b>

    压供电系统的三种运行方式

    我国低压供电系统的三种运行方式:国低压供电系统主要有三种运行方式:TN系统、TT系统、lT系统。
    发表于 05-26 17:06 1.1w次阅读
    压供电系统的<b class='flag-5'>三种</b>运行<b class='flag-5'>方式</b>

    三种常见的服务器详细介绍

    服务器是现实中常被讨论的设备之一,因为服务器与现代生活息息相关。按照服务器的用途,服务器可细分为诸多类别。为增进大家对服务器的了解程度,本文
    的头像 发表于 11-14 10:30 8391次阅读

    伺服电机的三种控制方式该如何应用

    一般伺服都有三种控制方式:速度控制方式,转矩控制方式,位置控制方式。大多数人想知道的就是这三种
    的头像 发表于 12-14 23:12 5349次阅读

    如何应用伺服电机的三种控制方式

    一般伺服都有三种控制方式:速度控制方式,转矩控制方式,位置控制方式。大多数人想知道的就是这三种
    发表于 01-22 06:30 7次下载
    如何应用伺服电机的<b class='flag-5'>三种</b>控制<b class='flag-5'>方式</b>

    FPGA应用之vivado三种常用IP核的调用

    今天介绍的是vivado的三种常用IP核:时钟倍频(Clocking Wizard),实时仿真(ILA),ROM调用(Block Memory)。
    发表于 02-02 10:14 3507次阅读

    Redis实现限流的三种方式分享

    当然,限流有许多种实现的方式,Redis具有很强大的功能,我用Redis实践了三种的实现方式,可以较为简单的实现其方式
    的头像 发表于 02-22 09:52 1072次阅读

    光伏发电系统中三种DC-DC转换电路的研究

    电子发烧友网站提供《光伏发电系统中三种DC-DC转换电路的研究.pdf》资料免费下载
    发表于 11-06 10:21 0次下载
    光伏发电系统<b class='flag-5'>中三种</b>DC-DC转换电路的研究

    介绍三种建模方式

    据量大,而是指样本的完备性。还有就是大数据或者AI被专业学者或者行业工程师所诟病的就是,纯粹的数据驱动搞不出所以然出来,需要领域知识(即Domain Knowledge)的协助。此外,还有第三种建模方式就是混合驱动,即基础物理模型加上数据驱动的
    的头像 发表于 01-23 10:48 1802次阅读