在微服務架構(gòu)中,業(yè)務都會被拆分成一個獨立的服務,服務與服務的通訊是基于httprestful的。Springcloud有兩種服務調(diào)用方式,一種是ribbon+restTemplate模式,另一種是feign模式:
Ribbon+RestTemplate
Ribbon是一個基于HTTP和TCP客戶端的負載均衡的工具。它可以 在客戶端 配置RibbonServerList(服務端列表),使用HttpClient或RestTemplate模擬http請求,步驟比較繁瑣。
Feign
Feign是在Ribbon的基礎上進行了一次改進,是一個使用起來更加方便的HTTP客戶端。采用接口的方式,只需要創(chuàng)建一個接口,然后在上面添加注解即可,將需要調(diào)用的其他服務的方法定義成抽象方法即可,不需要自己構(gòu)建 http請求。然后就像是調(diào)用自身工程的方法調(diào)用,而感覺不到是調(diào)用遠程方法,使得編寫客戶端變得非常容易。
Feign和RestTemplate都內(nèi)置了Ribbon
在SpringCloud中,有多個組件可以起到服務發(fā)現(xiàn)代理的作用,但一般比較常用、較專業(yè)、可用性較高的是Eureka,Eureka分為Server和Client,Server是注冊中心,Client是注冊/調(diào)用方,接下來我們構(gòu)建EurekaServer來啟動一個服務發(fā)現(xiàn)代理。
1.創(chuàng)建一個maven項目,在pom.xml添加依賴jar文件
2.創(chuàng)建application.yml文件
接下來,需要創(chuàng)建src/main/resources/application.yml文件(或application.properties,兩者作用是一樣的,但.yml文件為樹形結(jié)構(gòu),更容易理解)。添加如下配置:
###服務端口號
server:
port:1011
###服務名稱
spring:
application:
name:app-eureka-center
eureka:
instance:
#注冊中心地址
hostname:192.168.199.101
###客戶端調(diào)用地址
client:
serviceUrl:
defaultZone:http://192.168.199.101:1011/eureka/
###是否將自己注冊到Eureka服務中,因為該應用本身就是注冊中心,不需要再注冊自己(集群的時候為true)
register-with-eureka:false
###是否從Eureka中獲取注冊信息,因為自己為注冊中心,不會在該應用中的檢索服務信息
fetch-registry:false
server:
enable-self-preservation:true
3.創(chuàng)建服務啟動類
這一步是在啟動類中添加@EnableEurekaServer注解,就可以讓此應用程序成為一個Eureka服務。
@SpringBootApplication
@EnableEurekaServer//申明這是一個Eureka服務
publicclass SncApplication {
publicstatic void main(String[] args) {
SpringApplication.run(SncApplication.class,args);
}
}
4.項目結(jié)構(gòu)圖
5.測試訪問Eureka注冊中心
如上圖顯示,注冊中心已搭建成功
1.創(chuàng)建一個maven項目,在pom.xml中導入依賴jar
上面的pom文件為非完整版,只把其中的重要配置貼出來了
2.創(chuàng)建application.properties文件
在src/main/java/resources/application.yml創(chuàng)建如下配置:
spring.application.name=base-user-center
server.port=10011
eureka.client.serviceUrl.defaultZone=http://192.168.199.101:1011/eureka/
3.創(chuàng)建UserController接口
@RestController
@RequestMapping("/user")
publicclass UserController {
@RequestMapping("/getUserList")
@ResponseBody
publicModelMap getUserList() {
ModelMapmodelMap = new ModelMap();
List
userList.add("用戶1");
userList.add("用戶2");
userList.add("用戶3");
modelMap.put("data",userList);
returnmodelMap;
}
}
4.創(chuàng)建啟動類
@SpringBootApplication
@EnableFeignClients
@EnableEurekaClient
publicclass SncApplication {
publicstatic void main(String[] args) {
SpringApplication.run(SncApplication.class,args);
}
}
5.測試服務是否正常
如上圖顯示,接口服務正常
6.在eureka注冊中心上的效果
在這個demo中,我創(chuàng)建了一個名叫base-user-center的服務,在啟動后,可以在Eureka管理界面看到該服務。
可以看到本地啟動的base-user-center服務已經(jīng)注冊成功
服務注冊成功后,我們可以使用另外的服務客戶端來查找和調(diào)用該服務base-user-center,而不用知道該服務的位置。現(xiàn)在我們創(chuàng)建另一個服務,讓這兩個服務互相調(diào)用。
為了實現(xiàn)這個目的,我們需要引入客戶端庫。能夠?qū)崿F(xiàn)服務查找和調(diào)用功能的在SpringCloud中有三個客戶端,分別為:
Spring DiscoveryClient.
RestTemplate
Netflix Feign
下面我們使用Feign來實現(xiàn)服務調(diào)用。
1.創(chuàng)建一個maven項目,在pom.xml中導入依賴jar文件
2.創(chuàng)建application.properties文件
spring.application.name=snc-kanban-service
server.port=30006
eureka.client.serviceUrl.defaultZone=http://192.168.199.101:1011/eureka/
3.創(chuàng)建feign客戶端接口
我們通過@FeignClient注解來標志服務,其中的name為在Eureka中注冊的應用ID。在這個接口中的send方法中,我們加上@RequestMapping注解來將此方法的實現(xiàn)映射到url。參數(shù)的傳遞通過@PathVariable注解將接口參數(shù)映射到url參數(shù)。遠程接口的返回值將自動映射到接口返回值。
@FeignClient(name= "BASE-USER-CENTER")
publicinterface UserService {
@RequestMapping(value= "/user/getUserList")
publicModelMap getUserList();
}
4.創(chuàng)建消費者接口
@RestController
@RequestMapping("/order")
publicclass OrderController {
@Autowired
UserServiceuserService;
@RequestMapping("/getUserList")
publicModelMap getUserList() {
returnuserService.getUserList();
}
5.創(chuàng)建啟動類
@SpringBootApplication
@EnableEurekaClient
@EnableFeignClients
publicclass SncApplication {
publicstatic void main(String[] args) {
SpringApplication.run(SncApplication.class,args);
}
}
6.測試消費者調(diào)用服務提供者接口
如上圖所示,消費者成功調(diào)用了服務者提供的接口
在上面的過程中,我們構(gòu)建了一整個服務注冊發(fā)現(xiàn)調(diào)用流程,在其中可以發(fā)現(xiàn)很多問題,比如Eureka掛掉怎么辦,客戶端聯(lián)系不上Eureka怎么辦,似乎這樣的架構(gòu)是非常脆弱的,但SpringCloud提供了一系列的機制來保證可用性,下面來進行分析。
1.服務發(fā)現(xiàn)集群
每個服務實例啟動時會通過一個或多個服務發(fā)現(xiàn)代理進行注冊它們的IP等信息,但即使只在一個服務發(fā)現(xiàn)節(jié)點注冊。由于服務發(fā)現(xiàn)代理間使用了數(shù)據(jù)傳播的點對點模型,每個節(jié)點的數(shù)據(jù)都會同步到服務發(fā)現(xiàn)集群中的所有節(jié)點。
在注冊成功后,每個服務實例會按時間間隔發(fā)送心跳包,來推送自身的狀態(tài),一段時間沒有發(fā)送心跳包時,會被從服務實例池中移除。
通過這樣的方式,即使單個服務發(fā)現(xiàn)代理節(jié)點宕機,其他節(jié)點也能繼續(xù)提供同樣的服務。
2.客戶端負載均衡
上圖是加入了客戶端緩存和負載均衡,和直接請求服務發(fā)現(xiàn)代理相比,進行了如下優(yōu)化:
首先請求服務發(fā)現(xiàn)代理,獲取它請求的服務的所有實例,并在本地進行緩存。
當需要調(diào)用該服務時,首先從緩存中查找所有實例信息,再使用負載均衡算法,選擇一個實例進行調(diào)用。
客戶端將定期請求服務發(fā)現(xiàn)代理,刷新緩存數(shù)據(jù)。
如果本地緩存數(shù)據(jù)錯誤,請求到了錯誤的實例,本地緩存將會失效,并重新請求服務發(fā)現(xiàn)代理的數(shù)據(jù)。
通過以上的機制,能最大程度地保證客戶端能夠正確地查找到所需服務的實例信息。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/130165.html
摘要:下一代服務端開發(fā)下一代服務端開發(fā)第部門快速開始第章快速開始環(huán)境準備,,快速上手實現(xiàn)一個第章企業(yè)級服務開發(fā)從到語言的缺點發(fā)展歷程的缺點為什么是產(chǎn)生的背景解決了哪些問題為什么是的發(fā)展歷程容器的配置地獄是什么從到下一代企業(yè)級服務開發(fā)在移動開發(fā)領域 《 Kotlin + Spring Boot : 下一代 Java 服務端開發(fā) 》 Kotlin + Spring Boot : 下一代 Java...
摘要:既然要組集群那就涉及諸如的資源調(diào)度管理等等一系列問題。目前涉及集群的三個主要的技術(shù)無外乎三種。從本文開始作者將會一一實踐這幾種主要的集群技術(shù),話不多說,現(xiàn)在開始。完全運行于內(nèi)存中,體積小,啟動快。 showImg(https://segmentfault.com/img/remote/1460000015723680); 前言 相信Docker技術(shù)大家都有所了解,單個Docker能發(fā)...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級緩存和二級緩存。默認開啟一級緩存。證明了一級緩存只是在數(shù)據(jù)庫會話內(nèi)部共享的。但是,整合到中后,一級緩存就會被關閉。根據(jù)時間表比如沒有刷新間隔緩存不會以任何時間順序來刷新。 倉庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵 學習SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級緩存和二級緩存。默認開啟一級緩存。證明了一級緩存只是在數(shù)據(jù)庫會話內(nèi)部共享的。但是,整合到中后,一級緩存就會被關閉。根據(jù)時間表比如沒有刷新間隔緩存不會以任何時間順序來刷新。 倉庫地址:spring-boot-learning歡迎star、fork,給作者一些鼓勵 學習SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機...
摘要:本文章的源碼再文章末尾什么是查詢緩存有一級緩存和二級緩存。默認開啟一級緩存。證明了一級緩存只是在數(shù)據(jù)庫會話內(nèi)部共享的。但是,整合到中后,一級緩存就會被關閉。根據(jù)時間表比如沒有刷新間隔緩存不會以任何時間順序來刷新。 學習SpringBoot集成Mybatis的第二章,了解到Mybatis自帶的緩存機制,在部署的時候踩過了一些坑。在此記錄和分享一下Mybatis的緩存作用。 本文章的源碼再...
閱讀 1353·2023-01-11 13:20
閱讀 1699·2023-01-11 13:20
閱讀 1211·2023-01-11 13:20
閱讀 1902·2023-01-11 13:20
閱讀 4161·2023-01-11 13:20
閱讀 2751·2023-01-11 13:20
閱讀 1397·2023-01-11 13:20
閱讀 3664·2023-01-11 13:20