在找.net core 微服務框架時發現了Steeltoe開源項目,它能夠基於Spring Cloud實現.net core和.net Framework的微服務。正好以前也有學習過SpringBoot,而Spring Cloud是基於SpringBoot的,有了SpringBoot基礎上手入門SpringCloud應該也不難,正好個人第一本書<<Spring快速入門>>即將上架,感興趣的朋友能夠多多支持。本篇主要學習服務註冊與發現組件Eureka。html
在學習以前首先聊一聊爲何會有微服務,它的優缺點是什麼。java
在微服務以前主要是單體應用,單體應用常見的就是一個war文件包含全部功能的應用程序包,每次迭代更新哪怕是更新一行代碼都須要從新打包部署,一樣每次迭代可能都要進行測試,模塊與模塊之間耦合度也比較高,致使可能須要對整個war包進行的測試,若是出現一個bug致使內存溢出,死循環,可能致使整個應用崩潰。二八原則在平常生活中廣泛存在,在軟件領域也同樣,咱們平時瀏覽網頁通常讀的多,寫的少,例如逛博客園,咱們可能瀏覽的比較多,提交數據的頻率比較少,在單體應用中若是要增長瀏覽接口的部署,一樣也會將提交數據的接口部署上去會形成資源浪費,單體應用每每使用統一的技術平臺或方案解決全部的問題,開發語言和框架固定以後後續想引入新框架和技術也比較困難。web
在單體應用中主要是面對單個應用的編程,而在微服務中主要是面對單個功能點的編程,將提供的功能點對外發布,這樣其餘地方能夠不用關心具體用什麼語言什麼技術實現的,直接調用便可。並且每一個功能點能夠獨立部署,是解耦的。假如某個接口調用增多,能夠單獨部署該接口應用,擴展性比較好。某個節點出現故障能夠迅速讓其餘節點頂上,不至於整個應用不可用,容錯性好,某個服務訪問超出服務器承載時也能夠進行限流,後續的CI、CD容器化也比較方便。一樣有優勢也有缺點,微服務會致使對外提供的接口增多,部署數量增多,服務治理帶來新的挑戰,A服務會調用B服務,B服務會調用C服務,若是A服務報錯了,那是A服務致使的仍是B、C服務致使的呢,並且對外提供服務的節點可能會有不少,那是哪一個服務的哪一個節點致使的呢?因此還須要微服務的鏈路追蹤與排查。前面也提到微服務方便擴展,那什麼狀況下須要擴展,哪些服務節點須要擴展,這須要用數聽說話,那就須要對服務進行監控,並且監控的參數指標和維度也是不同的。spring
前面算是導語,下面切回正題,來學習服務註冊與發現組件Eureka。每一個站點都對外提供某些服務,有點相似家裏趕集同樣,有的賣家說賣衣服的,提供賣衣服的接口,有的賣家是賣拖拉機的,提供賣拖拉機的接口,每一個賣家都是獨立分散的,假如每一個賣家都不在一個集市上,那買家可能須要先找到每一個賣家住在什麼地方,哪一個村的叫什麼名字,通常逛一家可能還沒選到合適的,還要多逛幾家,這樣買家就要來回跑,那有了集市以後就不同了,每一個賣家都在集市上提供不一樣的服務,買家只要到固定的集市上找須要的服務便可,就和在沒出現淘寶以前買東西須要到實體商店,有了淘寶以後只要輸入淘寶網址就能找到不一樣商家提供的不一樣服務。Eureka就是有點相似淘寶的功能,它爲服務提供者(賣家)提供了一個集中的平臺,只要註冊一下說明提供什麼服務,服務消費者(買家)不用關心服務提供者在什麼地方,直接調用就行了,是一箇中心化的過程。編程
1、建立Eureka Server瀏覽器
1.引入依賴服務器
SpringCloud使用Eureka也比較容易,建立SpringBoot項目時選中Eureka Server便可,它會在pom.xml中自動引入下面兩個依賴,也能夠本身添加。app
<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>
二、啓動代碼中添加@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); } }
三、配置文件ide
在默認設置下,該服務註冊中心也會將本身做爲客戶端來嘗試註冊它本身,因此咱們須要禁用它的客戶端註冊行爲,在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/,便可看到下面頁面,暫時還未有註冊的實例。
2、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中,這個地方可能還要再留意一下。
3、建立Eureka Client
一、引入依賴
這裏先建立個服務提供者,也就是生產者。在建立時選中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>
二、啓動代碼中添加@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。
4、小結
本篇主要了解了下什麼是Eureka,它的做用,以及如何使用。主要學習Eureka服務端的配置和雙節點配置,將Eureka client註冊到Eureka server中,後續就是要學習如何調用生產者提供的服務了。
最後再推薦下個人新書<<spring 快速入門>>,我的認爲對與Spring初學者來講仍是值得一讀的,雖然以前也沒有過Java的工做經驗,寫這本書的過程也是我二次複習鞏固Spring的過程,我也是以初學者的角度來完成這本書的。本書目錄在前面的博客中,能夠點擊查看。