二、Spring Cloud 之旅 -- Eureka 微服務的釋出與呼叫
上節講了Spring Cloud專案的搭建,這節一起來看看Spring Cloud微服務的釋出與呼叫。本節後面還會演示Eureka的叢集。
內容1:什麼是Eureka? (概念是摘抄《瘋狂Spring Cloud 微服務架構與實戰》一書,感謝這本書作者)
Spring Cloud 整合了Netflix OSS的多個專案,不得不說Spring對第三方、優秀的專案真是無縫整合。 Netflix在Spring Cloud中的代號叫: spring-cloud-netflix. 這個裡面包含多個子模組,這些子模組對Netflix下面的框架進行了封裝,很方便我們使用。這節所演示的Eureka就是Netflix下面很重要的一個框架。
- Eureka 提供基於REST的服務,在叢集中主要用於服務管理
- Eureka 提供基於java語言的客戶端元件,客戶端元件實現了負載均衡的功能
- 可以將業務元件(service provider, service invoker…)註冊到Eureka容器中,這些元件可進行叢集部署,Eureka主要維護這些服務的列表,並自動檢查他們的狀態。
一旦微服務註冊到Eureka中,我們就可以通過非常簡單的方式呼叫了(http://{server-name}/xxxx),並且可以通過Feign客戶端來優雅地實現遠端service呼叫。
內容2:一個簡單的通過Eureka釋出與呼叫微服務demo
廢話不多說,開幹!
建立Eureka Server:
- 建立一個Spring Cloud專案,叫eureka-server, 目錄結構如圖所示(我演示的專案是通過maven構建的,你也可以選擇gradle):
2)在pom.xml中加入以下依賴:
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>
</dependencies>
3) 進入java類檔案目錄: src/main/java -> org.cd.cloud, 會發現根目錄有一個XXXApplication.java結尾的類,這是Spring Boot的啟動類,我們在這個類做一點小改進,就是在類名上面加一個@EnableEurekaServer註解:
4)進入資原始檔目錄: src/main/resource 你會發現有一個application.properties檔案(或application.py),如果沒有這個檔案,則建立一個。這裡面是Spring專案需要的一些配置資訊,比如我們要指定埠和應用名稱,則新增以下配置:
server.port=8761
spring.application.name=eureka-server
5)執行XXXApplication.java 類,就可以啟動Spring Cloud專案啦,啟動之後會發現有點報錯(Connection refused: connect),是因為Eureka會進行自我註冊,這個請看下面解說。瀏覽器輸入:http://localhost:8761/ 便可以訪問了。
6)Connection refused原因:在伺服器啟動時,Eureka Server會把自己當做一個客戶端去註冊Eureka,並且會去抓取資訊,但是它本身只是一個伺服器 並不是客戶端,這樣就衝突了,所以會refuse,需要在application.properties加入以下兩個配置:
eureka.client.register-with-eureka=false
eureka.client.fetch-registry=false
這樣再啟動的時候就不會報錯啦!
建立Eureka Client 1(Service Provider)
1)建立一個叫first-service-provider模組(直接拷貝eureka-server的程式碼都行,簡單粗暴高效),pom.xml裡面我們要做以下改變:
把上一步Eureka Server pom.xml中的eureka-server的dependency可以去掉,換成下面的:(這個dependency是Eureka 客戶端)
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka</artifactId>
</dependency>
</dependencies>
2)在專案啟動類裡面加入下面程式碼:
類名上面加入@EnableEurekaClient註解,這個表示這是一個Eureka客戶端
加入@RestController註解,因為我們要寫一個介面來測試
加入一個message介面,以便一會測試。
3)在application.properties裡面加入以下配置:
spring.application.name=first-service-provider
server.port=8080
eureka.instance.hostname=localhost
eureka.client.service-url.default-zone=http://localhost:8761/eureka/
最後一行表示註冊到Eureka Server
4)好了,大膽啟動這個first-service-provider吧,應該不會有exception,如果有,相信高智商的你處理不在話下。啟動成功後,可以再次訪問http://localhost:8761/ 看看有啥不一樣 ?, 不出意外的話應該可以看到有個新的服務註冊進來啦。
建立Eureka Client 2(Service Invoker)
1)建立一個叫first-service-invoker模組(直接拷貝first-service-provider的程式碼,喜歡這種粗暴),pom.xml裡面記住把artifactId等標識資訊都改成first-service-invoker哈,只是一個ctrlCV戰士基本素養。
2)在專案啟動類裡面加入下面程式碼:
類名上面加入@EnableEurekaClient註解,這個表示這是一個Eureka客戶端
加入@RestController註解,因為我們一會要通過瀏覽器來訪問這個/test介面
將RestTemplate加入到Spring的容器中,並加上@LoadBanlanced註解,這個應該很容易理解,就是為了在使用restTemplate的時候不需要每次都new, 並且它還可以負載均衡。
在/test 介面裡面,我們通過http://{service-name}/xxx 的方式呼叫已經註冊到Eureka的微服務,是不是so方便,不需要指定域名埠號啥的了,呼叫起來也是相當快速。這就是通過Eureka來實現服務之間的釋出與呼叫。
(PS:CSDN的圖片壓縮真是讓人一言難盡...)
3)在application.properties裡面加入以下配置(改了port和applicationName):
spring.application.name=first-service-invoker
server.port=9000
eureka.instance.hostname=localhost
eureka.client.service-url.default-zone=http://localhost:8761/eureka/
最後一行表示註冊到Eureka Server
4)啟動first-service-invoker,然後可以看到http://localhost:8761/又有服務註冊進來了。在瀏覽器訪問http://localhost:9000/test (這個是剛才first-service-invoker裡面的介面,我們通過瀏覽器訪問invoker的介面,然後Invoker通過Eureka,很輕鬆的訪問到了service provider裡面的資料。最終可以在瀏覽器看到service provider 裡面API返回的資訊)
好了,光榮宣佈,本小節結束,休息一會喝口水 廣告之後更加精彩!接下來我們要體驗Eureka更高階一點的技能!
。。。。。
。。。。
。。。
。。
。
內容3:Eureka叢集搭建
為了方便演示叢集,需要多個hostname,所以請先進入 C:\Windows\System32\drivers\etc 這個目錄,找到hosts檔案,然後加入或修改以下內容:
127.0.0.1 localhost localhost1 localhost2
我們把本機指定幾個別名。
改進Eureka Server:
1)pom.xml保持不變,註釋掉application.properties裡面的所有內容(沒錯, 廢棄它),建立一個application-server1.properties 和 application-server2.properties.
2) 在application-server1.properties裡面加入以下配置:
server.port=8761
spring.application.name=eureka-server
eureka.instance.hostname=localhost1
eureka.client.service-url.default-zone=http://localhost2:8762/eureka/
注意最後一行,我們一會會啟動兩個Eureka Server例項,這樣的話就會有兩個埠,localhost1:8761表示第一個Eureka Server,localhost2:8762表示第二個Eureka Server。我們要將Eureka Server1 註冊到Server2上,將Server2註冊到Server1上,所以這裡的service-url.default-zone是分別指向另一個Eureka Server。
在application-server2.properties裡面加入以下配置:
server.port=8762
spring.application.name=eureka-server
eureka.instance.hostname=localhost2
eureka.client.service-url.default-zone=http://localhost1:8761/eureka/
3)在啟動類加入以下程式碼來手動確定啟用哪個profile:
4)修改完成後,執行兩次這個啟動類,分別輸入:server1 和 server2 來啟動兩個Eureka Server。 第一個在啟動的時候會報錯,這是正常現象,因為它要註冊第二個Eureka Server,但此時第二個還未執行起來。
5)兩次執行完成後,在瀏覽器訪問http://localhost1:8761/ 和 http://localhost2:8762 試試。
改進Eureka Client 1(Service Provider)
1)修改first-service-provider -> application.properties裡面的這個屬性:
eureka.client.service-url.default-zone=http://localhost:8761/eureka/, http://localhost:8762/eureka/
讓這個微服務分別註冊8761埠和8762埠的Eureka Server
2)想辦法啟動這個微服務兩次(埠號不能一樣,否則會衝突)。作為大佬的你肯定會有各種辦法,我在這裡列舉一個:可以再啟動類裡面加入Scanner,手動輸入埠號,執行兩次first-service-provider構建出來的jar檔案, 比如第一次輸入8080執行,第二次輸入8081執行。為啥不能直接想上面那樣在IDE裡面執行兩次啟動類的main方法呢,原因貌似是標記過@EnableEurekaClient的啟動類只能執行一次,再次執行IDE會提示已經有相同的專案在執行 巴拉巴拉的(反正我的是這樣)
Eureka Client 1(Service Invoker)
這個微服務不做改動
下面我們就來體驗一下這個時候再訪問http://localhost:9000/test介面會出現什麼情況:
會發現/test介面裡面請求service provide微服務裡面的/message介面的時候,埠號不斷的切換成8080和8081。 這是Eureka的負載均衡機制會將請求分配到不同的微服務上,以緩解某個微服務的壓力,體現叢集的優勢。
相關文章
- 【Spring Cloud】Eureka實現微服務釋出與呼叫SpringCloud微服務
- Spring Cloud微服務-基於Eureka的feign呼叫(1)SpringCloud微服務
- Eureka的微服務之間呼叫微服務
- Eureka實現微服務的呼叫微服務
- spring cloud微服務架構-Eureka保護機制SpringCloud微服務架構
- Eureka-實現微服務的呼叫微服務
- 初識Spring Cloud Eureka(三)(Eureka客戶端之間 服務的相互呼叫)SpringCloud客戶端
- Spring Cloud+ Eureka微服務基礎專案搭建(已實現呼叫增刪改查微服務,持續更新)SpringCloud微服務
- Spring Cloud之微服務之間相互呼叫、如何讓一個微服務呼叫另外一個微服務SpringCloud微服務
- 服務治理: Spring Cloud EurekaSpringCloud
- [譯] JWT 與 Spring Cloud 微服務JWTSpringCloud微服務
- Eureka微服務之間呼叫-feign微服務
- (十七)spring cloud微服務分散式雲架構-eureka 基礎SpringCloud微服務分散式架構
- Spring Cloud分散式微服務雲架構原始碼分析 — EurekaSpringCloud分散式微服務架構原始碼
- Spring Cloud(一) 服務的註冊與發現(Eureka)SpringCloud
- (十四)spring cloud微服務分散式雲架構-服務註冊與發現(Eureka、Consul)SpringCloud微服務分散式架構
- Java Spring Cloud 與響應式微服務(二)賬戶服務建立JavaSpringCloud微服務
- 學習Spring Cloud與微服務之路三SpringCloud微服務
- Spring Cloud服務發現元件EurekaSpringCloud元件
- Spring Cloud Eureka 實現服務註冊與發現SpringCloud
- Spring Cloud 系列(一)Eureka 服務註冊與發現SpringCloud
- 微服務~Eureka實現的服務註冊與發現及服務之間的呼叫微服務
- 129、springcloud-eureka-client微服務的互相呼叫SpringGCCloudclient微服務
- spring cloud微服務分散式雲架構- Eureka伺服器搭建及配置SpringCloud微服務分散式架構伺服器
- Spring Cloud系列(二):Eureka應用詳解SpringCloud
- 微服務Spring Cloud與Kubernetes比較微服務SpringCloud
- Spring Cloud 入門教程 – Eureka服務註冊與發現SpringCloud
- Spring Cloud 入門教程 - Eureka服務註冊與發現SpringCloud
- spring cloud 微服務實戰SpringCloud微服務
- 4、Spring Cloud EurekaSpringCloud
- 【Spring Cloud】之 EurekaSpringCloud
- spring cloud 和 阿里微服務spring cloud AlibabaSpringCloud阿里微服務
- 微服務Spring Cloud17_Spring Cloud概述3微服務SpringCloud
- spring cloud構建網際網路分散式微服務雲平臺-服務提供與呼叫SpringCloud分散式微服務
- Spring Cloud 微服務的那點事SpringCloud微服務
- 基於Spring Cloud的微服務落地SpringCloud微服務
- Spring Cloud 系列(二)Eureka 高可用註冊中心SpringCloud
- spring cloud分散式微服務:Spring Cloud ConfigSpringCloud分散式微服務