0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

介紹SpringCloud中三種服務(wù)調(diào)用方式

工程師鄧生 ? 來源:CSDN ? 作者:君寶逍遙 ? 2022-09-23 10:52 ? 次閱讀

服務(wù)測試環(huán)境

1.引入Eureka所需的依賴

2.修改配置文件

3.啟動服務(wù)

4.測試

消費者

1.發(fā)現(xiàn)客戶端方式

2.Ribbon方式功能的Spring RestTemplate

3.feign客戶端方式

本文主要介紹SpringCloud中調(diào)用服務(wù)的方式:

Spring DiscoveryClient

支持 Ribbon 的 RestTemplate

Feign客戶端

服務(wù)測試環(huán)境

測試中,發(fā)現(xiàn)Netflix的Eureka服務(wù)層采用。

主要步驟如下:

1.引入Eureka所需的依賴



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

 

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

2.修改配置文件

服務(wù)端:

eureka:
instance:
hostname:eureka9001.com#eureka服務(wù)端的實例名稱
instance-id:eureka9001
client:
register-with-eureka:false#false表示不向注冊中心注冊自己
fetch-registry:false##false表示自己就是注冊中心,職責(zé)就是維護服務(wù)實例,并不需要去檢索服務(wù)
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/,

一組微服務(wù)的不同實例采辦服務(wù)名稱不同,不同的實例ID不同,不同,spring.application.name和eureka.instance.instance-id。

3.啟動服務(wù)

服務(wù)端:

@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服務(wù)端地址,我這是127.0.0.1:9001,可以查看注冊到注冊中心的服務(wù)。

標簽

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


注意:Eureka通過兩次服務(wù)檢測均到通過,服務(wù)將在間隔10秒內(nèi)成功啟動服務(wù)注冊等待30秒。

基于 Spring Boot + MyBatis Plus + Vue & Element 實現(xiàn)的后臺管理系統(tǒng) + 用戶小程序,支持 RBAC 動態(tài)權(quán)限、多租戶、數(shù)據(jù)權(quán)限、工作流、三方登錄、支付、短信、商城等功能

消費者

1.發(fā)現(xiàn)客戶端方式

服務(wù)中既是服務(wù)是微信也可以是調(diào)用者,消費者配置和上面配置的大體參考一致,依賴及配置服務(wù)端啟動方式EnableEurekaClient:監(jiān)聽啟動。

@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服務(wù)的實例,并返回第一個實例。

測試控制器

@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);
}
}

測試:

調(diào)試信息

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

從該圖可以看到licensingservice,擁有兩個服務(wù)實例,并可以查看實例信息。

頁面返回信息

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

成功查詢到數(shù)據(jù)庫存儲信息。

2.Ribbon方式功能的Spring RestTemplate

同上。

核心配置類:

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

@Bean
@LoadBalanced//告訴Spring創(chuàng)建一個支持Ribbon負載均衡的RestTemplate
publicRestTemplaterestTemplate(){
returnnewRestTemplate();
}

設(shè)置均衡方式為輪詢方式。

測試類:

@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);
}
}

測試結(jié)果:

第一次:

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

第二次:

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

第三次:

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

因為采用輪詢平均方式分別使用不同的服務(wù)實例,未區(qū)別,將名稱確定了一定的。

這上面,Ribbon 是對第一種方式的封裝方式和不同的負載率。 Feign的方式則大大降低了開發(fā)客戶端和提升速度。

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;
}
};
}
}

注采用接口模式,通過指定服務(wù)名以及方法,在服務(wù)開發(fā)結(jié)果不佳時,方便返回默認的,而不是一個不友好的錯誤。

主啟動類:

@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);
}
}

測試結(jié)果:

正常測試:

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

關(guān)閉兩個實例,模擬服務(wù)實例死亡:

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

假裝能夠故障服務(wù)調(diào)用,也可以實現(xiàn)調(diào)用的服務(wù)時,友好的信息。

以此方式,由低上,從不同層次實現(xiàn)了SpringCloud中的微服務(wù)相互引用。




審核編輯:劉清

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 模擬器件
    +關(guān)注

    關(guān)注

    2

    文章

    107

    瀏覽量

    23225
  • 服務(wù)端
    +關(guān)注

    關(guān)注

    0

    文章

    66

    瀏覽量

    7025

原文標題:SpringCloud 三種服務(wù)調(diào)用方式,你學(xué)會了嗎?

文章出處:【微信號:芋道源碼,微信公眾號:芋道源碼】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    伺服電機的三種控制方式

    伺服電機控制方式有脈沖、模擬量和通訊這三種,在不同的應(yīng)用場景下,我們該如何選擇伺服電機的控制方式呢?
    發(fā)表于 08-17 11:01 ?7138次閱讀

    FPGA中三種常用復(fù)位電路

    在FPGA設(shè)計中,復(fù)位電路是非常重要的一部分,它能夠確保系統(tǒng)從初始狀態(tài)開始啟動并保證正確運行。本文將分別介紹FPGA中三種常用復(fù)位電路:同步復(fù)位、異步復(fù)位和異步復(fù)位同步釋放,以及相應(yīng)的Verilog代碼示例。
    發(fā)表于 05-14 14:44 ?2648次閱讀
    FPGA<b class='flag-5'>中三種</b>常用復(fù)位電路

    三種復(fù)位方式比較

    三種復(fù)位方式比較
    發(fā)表于 08-16 17:31

    步進電機的三種驅(qū)動方式

    步進電機的三種驅(qū)動方式
    發(fā)表于 01-12 17:03

    STM32的三種boot模式介紹

    淺識STM32的三種boot模式文章目錄淺識STM32的三種boot模式任務(wù)摘要一、認識boot1.三種BOOT模式介紹2.開發(fā)BOOT模式選擇3.STM32
    發(fā)表于 12-10 07:46

    STM32三種啟動方式是什么

    STM32三種啟動方式是什么
    發(fā)表于 12-15 07:16

    發(fā)電機勵磁方式有哪些_三種發(fā)電機勵磁方式

    本文首先介紹了勵磁系統(tǒng)的原理,其次介紹了勵磁系統(tǒng)的組成和發(fā)電機獲得勵磁電流的三種方式,最后介紹了發(fā)電機勵磁的
    的頭像 發(fā)表于 05-09 11:27 ?7.8w次閱讀
    發(fā)電機勵磁<b class='flag-5'>方式</b>有哪些_<b class='flag-5'>三種</b>發(fā)電機勵磁<b class='flag-5'>方式</b>

    壓供電系統(tǒng)的三種運行方式

    我國低壓供電系統(tǒng)的三種運行方式:國低壓供電系統(tǒng)主要有三種運行方式:TN系統(tǒng)、TT系統(tǒng)、lT系統(tǒng)。
    發(fā)表于 05-26 17:06 ?1.1w次閱讀
    壓供電系統(tǒng)的<b class='flag-5'>三種</b>運行<b class='flag-5'>方式</b>

    三種常見的服務(wù)器詳細介紹

    服務(wù)器是現(xiàn)實中常被討論的設(shè)備之一,因為服務(wù)器與現(xiàn)代生活息息相關(guān)。按照服務(wù)器的用途,服務(wù)器可細分為諸多類別。為增進大家對服務(wù)器的了解程度,本文
    的頭像 發(fā)表于 11-14 10:30 ?8456次閱讀

    伺服電機的三種控制方式該如何應(yīng)用

    一般伺服都有三種控制方式:速度控制方式,轉(zhuǎn)矩控制方式,位置控制方式。大多數(shù)人想知道的就是這三種
    的頭像 發(fā)表于 12-14 23:12 ?5444次閱讀

    如何應(yīng)用伺服電機的三種控制方式

    一般伺服都有三種控制方式:速度控制方式,轉(zhuǎn)矩控制方式,位置控制方式。大多數(shù)人想知道的就是這三種
    發(fā)表于 01-22 06:30 ?7次下載
    如何應(yīng)用伺服電機的<b class='flag-5'>三種</b>控制<b class='flag-5'>方式</b>

    FPGA應(yīng)用之vivado三種常用IP核的調(diào)用

    今天介紹的是vivado的三種常用IP核:時鐘倍頻(Clocking Wizard),實時仿真(ILA),ROM調(diào)用(Block Memory)。
    發(fā)表于 02-02 10:14 ?3617次閱讀

    Redis實現(xiàn)限流的三種方式分享

    當然,限流有許多種實現(xiàn)的方式,Redis具有很強大的功能,我用Redis實踐了三種的實現(xiàn)方式,可以較為簡單的實現(xiàn)其方式
    的頭像 發(fā)表于 02-22 09:52 ?1105次閱讀

    光伏發(fā)電系統(tǒng)中三種DC-DC轉(zhuǎn)換電路的研究

    電子發(fā)燒友網(wǎng)站提供《光伏發(fā)電系統(tǒng)中三種DC-DC轉(zhuǎn)換電路的研究.pdf》資料免費下載
    發(fā)表于 11-06 10:21 ?0次下載
    光伏發(fā)電系統(tǒng)<b class='flag-5'>中三種</b>DC-DC轉(zhuǎn)換電路的研究

    介紹三種建模方式

    據(jù)量大,而是指樣本的完備性。還有就是大數(shù)據(jù)或者AI被專業(yè)學(xué)者或者行業(yè)工程師所詬病的就是,純粹的數(shù)據(jù)驅(qū)動搞不出所以然出來,需要領(lǐng)域知識(即Domain Knowledge)的協(xié)助。此外,還有第三種建模方式就是混合驅(qū)動,即基礎(chǔ)物理模型加上數(shù)據(jù)驅(qū)動的
    的頭像 發(fā)表于 01-23 10:48 ?2076次閱讀