二、Spring Cloud 之旅 -- Eureka 微服務的釋出與呼叫

咚!發表於2019-03-03

上節講了Spring Cloud專案的搭建,這節一起來看看Spring Cloud微服務的釋出與呼叫。本節後面還會演示Eureka的叢集。

內容1:什麼是Eureka? (概念是摘抄《瘋狂Spring Cloud 微服務架構與實戰》一書,感謝這本書作者)

Spring Cloud 整合了Netflix OSS的多個專案,不得不說Spring對第三方、優秀的專案真是無縫整合。 Netflix在Spring Cloud中的代號叫: spring-cloud-netflix. 這個裡面包含多個子模組,這些子模組對Netflix下面的框架進行了封裝,很方便我們使用。這節所演示的Eureka就是Netflix下面很重要的一個框架。

  1. Eureka 提供基於REST的服務,在叢集中主要用於服務管理
  2. Eureka 提供基於java語言的客戶端元件客戶端元件實現了負載均衡的功能
  3. 可以將業務元件(service provider, service invoker…)註冊到Eureka容器中,這些元件可進行叢集部署,Eureka主要維護這些服務的列表,並自動檢查他們的狀態

 

一旦微服務註冊到Eureka中,我們就可以通過非常簡單的方式呼叫了(http://{server-name}/xxxx),並且可以通過Feign客戶端來優雅地實現遠端service呼叫。

 

內容2:一個簡單的通過Eureka釋出與呼叫微服務demo

廢話不多說,開幹!

建立Eureka Server:

  1. 建立一個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的負載均衡機制會將請求分配到不同的微服務上,以緩解某個微服務的壓力,體現叢集的優勢。

 

相關文章