在找.net core 微服務框架時發現了Steeltoe開源專案,它可以基於Spring Cloud實現.net core和.net Framework的微服務。正好之前也有學習過SpringBoot,而Spring Cloud是基於SpringBoot的,有了SpringBoot基礎上手入門SpringCloud應該也不難,正好我的第一本書<<Spring快速入門>>即將上架,感興趣的朋友可以多多支援。本篇主要學習服務註冊與發現元件Eureka。
在學習之前首先聊一聊為什麼會有微服務,它的優缺點是什麼。
在微服務之前主要是單體應用,單體應用常見的就是一個war檔案包含所有功能的應用程式包,每次迭代更新哪怕是更新一行程式碼都需要重新打包部署,同樣每次迭代可能都要進行測試,模組與模組之間耦合度也比較高,導致可能需要對整個war包進行的測試,如果出現一個bug導致記憶體溢位,死迴圈,可能導致整個應用崩潰。二八原則在日常生活中普遍存在,在軟體領域也一樣,我們平時瀏覽網頁一般讀的多,寫的少,例如逛部落格園,我們可能瀏覽的比較多,提交資料的頻率比較少,在單體應用中如果要增加瀏覽介面的部署,同樣也會將提交資料的介面部署上去會造成資源浪費,單體應用往往使用統一的技術平臺或方案解決所有的問題,開發語言和框架固定之後後續想引入新框架和技術也比較困難。
在單體應用中主要是面對單個應用的程式設計,而在微服務中主要是面對單個功能點的程式設計,將提供的功能點對外發布,這樣其他地方可以不用關心具體用什麼語言什麼技術實現的,直接呼叫即可。而且每個功能點可以獨立部署,是解耦的。假如某個介面呼叫增多,可以單獨部署該介面應用,擴充套件性比較好。某個節點出現故障可以迅速讓其他節點頂上,不至於整個應用不可用,容錯性好,某個服務訪問超出伺服器承載時也可以進行限流,後續的CI、CD容器化也比較方便。同樣有優點也有缺點,微服務會導致對外提供的介面增多,部署數量增多,服務治理帶來新的挑戰,A服務會呼叫B服務,B服務會呼叫C服務,如果A服務報錯了,那是A服務導致的還是B、C服務導致的呢,而且對外提供服務的節點可能會有很多,那是哪個服務的哪個節點導致的呢?所以還需要微服務的鏈路追蹤與排查。前面也提到微服務方便擴充套件,那什麼情況下需要擴充套件,哪些服務節點需要擴充套件,這需要用資料說話,那就需要對服務進行監控,而且監控的引數指標和維度也是不一樣的。
前面算是導語,下面切回正題,來學習服務註冊與發現元件Eureka。每個站點都對外提供某些服務,有點類似家裡趕集一樣,有的賣家說賣衣服的,提供賣衣服的介面,有的賣家是賣拖拉機的,提供賣拖拉機的介面,每個賣家都是獨立分散的,假如每個賣家都不在一個集市上,那買家可能需要先找到每個賣家住在什麼地方,哪個村的叫什麼名字,一般逛一家可能還沒選到合適的,還要多逛幾家,這樣買家就要來回跑,那有了集市之後就不一樣了,每個賣家都在集市上提供不同的服務,買家只要到固定的集市上找需要的服務即可,就和在沒出現淘寶之前買東西需要到實體商店,有了淘寶之後只要輸入淘寶網址就能找到不同商家提供的不同服務。Eureka就是有點類似淘寶的功能,它為服務提供者(賣家)提供了一個集中的平臺,只要註冊一下說明提供什麼服務,服務消費者(買家)不用關心服務提供者在什麼地方,直接呼叫就好了,是一箇中心化的過程。
一、建立Eureka Server
1.引入依賴
SpringCloud使用Eureka也比較容易,建立SpringBoot專案時選中Eureka Server即可,它會在pom.xml中自動引入下面兩個依賴,也可以自己新增。
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter</artifactId> </dependency> <!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
2、啟動程式碼中新增@EnableEurekaServer註解
package com.example.demo; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
3、配置檔案
在預設設定下,該服務註冊中心也會將自己作為客戶端來嘗試註冊它自己,所以我們需要禁用它的客戶端註冊行為,在application.properties新增以下配置:
spring.application.name=spring-cloud-eureka eureka.client.register-with-eureka=false eureka.client.fetch-registry=false eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/ server.port=8088
eureka.client.register-with-eureka :表示是否將自己註冊到Eureka Server,預設為true。
eureka.client.fetch-registry :表示是否從Eureka Server獲取註冊資訊,預設為true。
eureka.client.serviceUrl.defaultZone :設定與Eureka Server互動的地址,查詢服務和註冊服務都需要依賴這個地址。預設是http://localhost:8761/eureka ;多個地址可使用 , 分隔。
4.啟動應用
在瀏覽器輸入http://localhost:8088/,即可看到下面頁面,暫時還未有註冊的例項。
二、Eureka叢集
這裡使用兩個節點來構建Eureka註冊中心,首先新增兩個配置檔案application-peer1.properties、application-peer2.properties.分別啟動了8000、8001埠。同時
eureka.client.serviceUrl.defaultZone為對方的地址。
application-peer1.properties:
spring.application.name=spring-cloud-eureka server.port=8000 eureka.client.serviceUrl.defaultZone=http://localhost:8001/eureka/
application-peer2.properties:
spring.application.name=spring-cloud-eureka server.port=8001 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/
application.properties:
spring.application.name=spring-cloud-eureka eureka.client.register-with-eureka=false eureka.client.fetch-registry=false
將Eureka Server專案打包,mvn clean package,會生成EurekaServer-0.0.1-SNAPSHOT.jar包。
在EurekaServer-0.0.1-SNAPSHOT.jar的目錄下,分別執行下面兩句命令,啟動兩個EurekaServer例項。
java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar EurekaServer-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
然後在瀏覽器中輸入http://localhost:8001/和http://localhost:8000/就會發現你中有我我中有你。這裡也都是參考純潔的微笑大神的:http://www.ityouknow.com/springcloud/2017/05/10/springcloud-eureka.html。在裡面介紹說註冊中心會出現在available-replicas中,但我這邊的測試並未在available-replicas中,看它的評論裡也有一些也是未出現在available-replicas中,這個地方可能還要再留意一下。
三、建立Eureka Client
1、引入依賴
這裡先建立個服務提供者,也就是生產者。在建立時選中Eureka Client,專案會自動引入下面的spring-cloud-starter-netflix-eureka-client依賴。由於要提供服務,所以這裡又引入了spring-boot-starter-web。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
2、啟動程式碼中新增@EnableDiscoveryClient註解
與上面新增@EnableEurekaServer類似,這裡新增@EnableDiscoveryClient註解。
3.配置檔案
這裡提供配置了eureka互動地址,這裡為兩個,將服務註冊到eureka兩個例項中。
spring.application.name=spring-cloud-producer server.port=9000 eureka.client.serviceUrl.defaultZone=http://localhost:8000/eureka/,http://localhost:8001/eureka/
4.增加服務HelloController
package com.example.demo; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @RequestMapping("/hello") public String index(@RequestParam String name) { return "hello "+name+",this is first messge"; } }
5.啟動應用就可在http://localhost:8000/和http://localhost:8001/中看到最近註冊到Eureka的例項spring-cloud-producer。
四、小結
本篇主要了解了下什麼是Eureka,它的作用,以及如何使用。主要學習Eureka服務端的配置和雙節點配置,將Eureka client註冊到Eureka server中,後續就是要學習如何呼叫生產者提供的服務了。
最後再推薦下我的新書<<spring 快速入門>>,個人認為對與Spring初學者來說還是值得一讀的,雖然之前也沒有過Java的工作經驗,寫這本書的過程也是我二次複習鞏固Spring的過程,我也是以初學者的角度來完成這本書的。本書目錄在前面的部落格中,可以點選檢視。