6年架構(gòu)師帶你學(xué)習(xí)微服務(wù)的注冊與發(fā)現(xiàn):服務(wù)發(fā)現(xiàn)的意義
服務(wù)發(fā)現(xiàn)的意義
服務(wù)發(fā)現(xiàn),意味著用戶發(fā)布的服務(wù)可以讓其他人找得到。在互聯(lián)網(wǎng)里面,最常用的服務(wù)發(fā)現(xiàn)機制莫過于域名。通過域名,用戶可以發(fā)現(xiàn)該域名所對應(yīng)的IP,繼而能夠找到發(fā)布到這個IP的服務(wù)。
域名和主機的關(guān)系并非是一對一的,有可能多個域名都映射到了同一個IP下面。DNS ( DomainName System, 域名系統(tǒng))是因特網(wǎng)的一項核心服務(wù) ,它作為可以將域名和IP地址相互映射的一個分布式數(shù)據(jù)庫,能夠使人更方便地訪問互聯(lián)網(wǎng),而不用去記住能夠被機器直接讀取的IP地址串。
那么,在局域網(wǎng)內(nèi),是否也可以通過設(shè)置相應(yīng)的主機名來讓其他主機訪問到呢?答案是肯定的。

通過URI來訪問服務(wù)
用戶要訪問某個服務(wù),勢必要通過URI來找到那個服務(wù)。URI ( Uniform Resource Identifier,統(tǒng)一資源標識符)是一個用于標識某- -互聯(lián)網(wǎng)資源名稱的字符串。例如,調(diào)用天氣數(shù)據(jù)API,用戶將發(fā)送一個GET請求到所發(fā)布的URI。
http:// localhost: 8080/weather/cityId/ {cityId}
這個URI包括以下內(nèi)容。
● http是使用的通信協(xié)議。
●localhost是主機名稱,這里特指本地主機。
● 8080是程序啟動后占用的端口號。
● 端口號后面的字符串,就是主機資源的具體地址。
通過上面的講解,已經(jīng)知道了localhost 其實是IP地址為127.0.0.1的主機名稱。也就是說,訪
問htt:o/cahost:.808/weatercit.ld/ {cityId}等同于訪問ht://7.1.8080/weatherlcitytd/ {cityId}。
知道了URI的作用之后,那么進行服務(wù)之間的調(diào)用看上去好像易如反掌。
在之前的天氣預(yù)報微服務(wù)中依賴了天氣數(shù)據(jù)API微服務(wù),那么在調(diào)用方的代碼里面,增加
REST客戶端來調(diào)用服務(wù)即可。于是很快就寫出了如下的代碼。
★天氣預(yù)報服務(wù).
k asince 1.0.0 2017年10月25日
★@author "https:/ /waylau. com">way Lau
@Service
public class WeatherReportServiceImpl implements Wea therReportService {
@Override
public Weather getDataByCityId(String cityId)
//由天氣數(shù)據(jù)API微服務(wù)來提供數(shù)據(jù)
String uri = "http://127.0.0.1 : 8080/weather/cityId/" + cityId;
ResponseEntity response = restTemplate.getForEntity (uri,
String.class) ;
String data = response.getBody() ;
}
} 那么,這么做會存在什么問題呢?

通過IP訪問服務(wù)的弊端
首先,一個比較大的問題是,IP 是與一臺特定的主機關(guān)聯(lián)的。IP 必須唯- - ,不然會產(chǎn)生混淆。
其次,要讓服務(wù)的調(diào)用方記住服務(wù)方的IP地址很難。特別是當(dāng)雙方都還沒有正式上線部署的時候,根本無法提前獲知服務(wù)提供方的IP地址。IP 地址是相對變化的!
最后一點是,通過IP地址很難做到負載均衡。設(shè)想下,服務(wù)提供方提供了兩個服務(wù)實例,分別部署到兩臺主機里面,那么用戶要訪問哪個IP呢?固定-一個IP,那么另一個主機對用戶來說,就沒有任何作用,因為根本沒有實現(xiàn)負載均衡。
需要服務(wù)的注冊和發(fā)現(xiàn)
知道了上面的問題,用戶就能更好地理解需要服務(wù)的注冊和發(fā)現(xiàn)機制的原因。服務(wù)注冊和發(fā)現(xiàn)正像互聯(lián)網(wǎng)上的DNS,可以讓用戶啟動的每個微服務(wù)都把自己注冊進-一個服務(wù)注冊表(或稱為注冊中心),當(dāng)其他微服務(wù)需要調(diào)用這個服務(wù)的時候,就通過服務(wù)的名稱來獲取到這個服務(wù)。因為多個服務(wù)實例都是映射到同--個服務(wù)名稱的,所以通過服務(wù)名稱來訪問,就可以使用其中的任何-一個服務(wù)實例,也就可以實現(xiàn)負載均衡了。
使用Eureka
在Spring Cloud技術(shù)棧中,Eureka 作為服務(wù)注冊中心,對整個微服務(wù)架構(gòu)起著最核心的整合作用。Eureka是Netflix開源的一 款提供服務(wù)注冊和發(fā)現(xiàn)的產(chǎn)品。
Eureka的項目主頁為
htps:p:/ithub.com/spring-cloud/spring-cloud-netafix,有興趣的讀者也可以去查看源碼。
本節(jié)將著重講解如何通過Eureka 來實現(xiàn)微服務(wù)的注冊與發(fā)現(xiàn)。選擇使用Eureka 的原因,大致總結(jié)了以下幾個方面。
1.完整的服務(wù)注冊和發(fā)現(xiàn)機制
Eureka提供了完整的服務(wù)注冊和發(fā)現(xiàn)機制,并且也經(jīng)受住了Netflix自己的生產(chǎn)環(huán)境考驗,使用起來相對會比較省心。
2.和Spring Cloud無縫集成
Spring Cloud有一套非常 完善的開源代碼來整合Eureka,所以在Spring Boot中應(yīng)用起來非常方便,與Spring框架兼容性好。
3.高可用性
Eureka還支持在應(yīng)用自身的容器中啟動,也就是說應(yīng)用啟動之后,既充當(dāng)了Eureka客戶端的角色,同時也是服務(wù)的提供者。這樣就極大地提高了服務(wù)的可用性,同時也盡可能地減少了外部依賴。
4.開源
由于代碼是開源的,因此非常便于開發(fā)人員了解它的實現(xiàn)原理和排查問題。同時,廣“大開發(fā)者也能持續(xù)為該項目進行貢獻。
本篇文章給大家講解的內(nèi)容是服務(wù)發(fā)現(xiàn)的意義
下篇文章給大家講解如何集成Eureka Server;
覺得文章不錯的朋友可以轉(zhuǎn)發(fā)此文關(guān)注小編;
感謝大家的支持!

本文就是愿天堂沒有BUG給大家分享的內(nèi)容,大家有收獲的話可以分享下,想學(xué)習(xí)更多的話可以到微信公眾號里找我,我等你哦。
