SpringCloud系列四:Eureka 服務發現框架(定義 Eureka 服務端、Eureka 服務信息、Eureka 發現管理、Eureka 安全配置、Eureka-HA(高可用) 機制、Eureka 服務打包部署)
1、概念:Eureka 服務發現框架
2、具體內容
對於服務發現框架可以簡單的理解為服務的註冊以及使用操作步驟,例如:在 ZooKeeper 組件,這個組件裏面已經明確的描述了一個服務的註冊以及發現操作流程,在整個 Rest 架構裏面,會存在有大量的微服務的信息。
在 SpringCloud 之中使用了大量的 Netflix 的開源項目,而其中 Eureka 就屬於 Netflix 提供的發現服務組件,所有的微服務在使用之中全部向 Eureka 之中進行註冊,而後客戶端直接利用 Eureka 進行服務信息的獲得。
Eureka 的主要作用實際上和 ZooKeeper 是非常類似的,但是在 SpringCloud 雖然支持有 ZooKeeper,不過從官方的宣傳角度來說並不支持這樣處理,推薦使用 Eureka,因為速度更快,同時該服務組件是以程序的形式出現的,也就是說你只需要編寫一個程序的項目類,而後就可以啟動 Eureka 註冊服務了。
2.1、定義 Eureka 服務端
1、 為了方便進行統一的微服務的管理,建議創建一個新的項目:microcloud-eureka-7001;
2、 【microcloud-eureka-7001】的 pom.xml 配置文件,追加相應的依賴支持庫
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency>
3、 【microcloud-eureka-7001】現在修改 application.yml 配置文件,在這個配置文件裏面主要進行 eureka 服務的定義。
server: port: 7001 eureka: instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
4、 【microcloud-eureka-7001】修改 hosts 配置文件,追加 eureka 的映射地址。
127.0.0.1 eureka-7001.com
5、 【microcloud-eureka-7001】修改 Eureka 程序啟動類,追加有 Eureka 服務聲明的註解@EnableEurekaServer:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication @EnableEurekaServer public class Eureka_7001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Eureka_7001_StartSpringCloudApplication.class, args); } }
6、 運行程序後通過瀏覽器執行路徑:http://eureka-7001.com:7001/
2.2、向 Eureka 中註冊部門微服務
現在 Eureka 已經可以正常啟用了,那麽隨後就需要在項目之中將所有的微服務信息註冊到 Eureka 服務之中,那麽這樣就可以被客戶端執行並且調用了。
1、 【microcloud-provider-dept-8001】修改 pom.xml 配置文件,追加有 eureka 的相關依賴支持包;
<groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-config</artifactId> </dependency>
2、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,在這個配置文件之中主要是定義要進行註冊的 Eureka 服務的地址,而這個地址就是 Eureka 的客戶端配置。
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka
3、 【microcloud-provider-dept-8001】修改項目的運行主類,在這個主類上追加有 Eureka 客戶端的啟用註解@EnableEurekaClient
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient public class Dept_8001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args); } }
此時由於存在有“@EnableEurekaClient”註解信息,所以當服務啟動之後該服務會自動註冊到Eureka服務器之中;
4、 【microcloud-provider-dept-8001】修改application.yml配置文件,為此微服務設置一個名字(這個名字將作為日後負載均衡)
spring: application: name: microcloud-provider-dept
2.3、Eureka 服務信息
現在雖然成功的實現了微服務的 Eureka 註冊,但是所表現出來的微服務的信息並不完整,因為給定的地址信息是你的主機名稱,而我們現在是一個自定義的路徑地址。
1、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加主機名稱的顯示:
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka instance: instance-id: dept-8001.com # 在信息列表時顯示主機名稱
重新訪問eureka註冊中心可以看到服務名稱變了
2、 【microcloud-provider-dept-8001】在服務信息查看的時候應該以 IP 地址作為連接項。
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka instance: instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址
3、 【microcloud-provider-dept-8001】如果現在要想查看所有的微服務詳細信息,則需要修改 pom.xml 文件,追加監控配置:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
4、 【microcloud】修改 pom.xml 文件,追加一個信息匹配的插件:
<resources> <resource> <directory>src/main/resources</directory> <filtering>true</filtering> </resource> </resources> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <configuration> <delimiters> <delimiter>$</delimiter> </delimiters> </configuration> </plugin>
5、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,追加 info 的相關信息:
info: app.name: study-microcloud company.name: www.study.cn build.artifactId: $project.artifactId$ build.version: $project.verson$
2.4、Eureka 發現管理
在實際的項目運行過程之中需要通過 Eureka 作為所有微服務的監控處理程序,但是對於監控程序那麽就必然要面臨以下問題:
· 新服務追加的時候應該立刻可以進行註冊;
· 當某一個服務下線之後應該可以進行清理;
1、 【microcloud-eureka-7001】設置服務的清理間隔,修改 application.yml 配置文件
eureka: server: eviction-interval-timer-in-ms: 60000 # 設置清理的間隔時間,而後這個時間使用的是毫秒單位(默認是60秒) client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
一旦配置了清理的間隔為 1 秒的時間,則會在每秒的時候進行一次服務的清理過程
一般情況下,該配置不建議進行修改,默認就是 60 秒,也就是說你的微服務如果 60 秒沒有心跳了,那麽就認為可以清理掉。
2、 【microcloud-eureka-7001】在 Eureka 裏面有一個問題,這個問題就是它默認支持有保護模式的概念,所謂的保護模式指的是 即便現在某一個微服務不可用了,eureka 不會清理,依然會進行該微服務信息的保存。
如果現在要想去改變這種保護模式的啟用,則可以修改 application.yml 配置文件:
eureka: server: enable-self-preservation: true # 設置為false表示關閉保護模式 eviction-interval-timer-in-ms: 60000 # 設置清理的間隔時間,而後這個時間使用的是毫秒單位(默認是60秒) client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
理論上只有關閉了保護模式之後才可以進行無效微服務的清理操作,但是很多時候 Eureka 裏面也會自帶有清除過程。
3、 【microcloud-provider-dept-8001】微服務客戶端之所以可以與 Eureka 之間保持聯系,依靠的是心跳機制,也就是說你客戶端 可以自己來進行心跳的配置處理,修改 application.yml 配置文件:
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://eureka-7001.com:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設置心跳的時間間隔(默認是30秒) lease-expiration-duration-in-seconds: 5 # 如果現在超過了5秒的間隔(默認是90秒) instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址
由於所有的服務都註冊到了 Eureka 之中,這樣如果配置了“lease-expiration-duration-in-seconds”此選項,表示距 離上一次發送心跳之後等待下一次發送心跳的間隔時間,如果超過了此間隔時間,則認為該微服務已經宕機了。
4、 【microcloud-provider-dept-8001】現在對於註冊到 Eureka 上的微服務端也可以通過發現服務來進行一些服務信息的獲取,修 改 DeptRest 程序類,追加一個控制調用方法:
package cn.study.microcloud.rest; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.springframework.cloud.client.discovery.DiscoveryClient; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import cn.study.microcloud.service.IDeptService; import cn.study.vo.Dept; @RestController public class DeptRest { @Resource private IDeptService deptService ; @Resource private DiscoveryClient client ; // 進行Eureka的發現服務 @RequestMapping("/dept/discover") public Object discover() { // 直接返回發現服務信息 return this.client ; } @RequestMapping("/dept/sessionId") public Object id(HttpServletRequest request) { return request.getSession().getId() ; } @RequestMapping(value="/dept/get/{id}",method=RequestMethod.GET) public Object get(@PathVariable("id") long id) { return this.deptService.get(id) ; } @RequestMapping(value="/dept/add",method=RequestMethod.POST) public Object add(@RequestBody Dept dept) { return this.deptService.add(dept) ; } @RequestMapping(value="/dept/list",method=RequestMethod.GET) public Object list() { return this.deptService.list() ; } }
5、 【microcloud-provider-dept-8001】在主程序之中加上註解@EnableDiscoveryClient啟用 Eureka 發現服務項:
package cn.study.microcloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient; @SpringBootApplication @EnableEurekaClient @EnableDiscoveryClient public class Dept_8001_StartSpringCloudApplication { public static void main(String[] args) { SpringApplication.run(Dept_8001_StartSpringCloudApplication.class, args); } }
6、 輸入訪問地址:http://dept-8001.com:8001/dept/discover
{"services":[],"localServiceInstance":{"host":"192.168.31.247", "port":8001,"secure":false,"serviceId":"microcloud-provider-dept","metadata":{},"uri":"http://192.168.31.247:8001"}}
2.5、Eureka 安全配置
現在已經成功的實現了一個 Eureka 的服務啟動以及微服務的註冊配置操作,但是現在的程序有一個問題,你自己公司的 Eureka 服務應該可以註冊的服務只能夠是滿足於認證要求的微服務,所以這樣一來在之前所進行的 Eureka 裏面配置缺少關鍵性的一步: 安全認證,所以應該為 Eureka 配置上安全認證處理。
1、 【microcloud-eureka-7001】修改 pom.xml 配置文件,引入 SpringSecurity 的依賴包:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency>
2、 【microcloud-eureka-7001】一旦我們的項目之中導入了 Security 開發包,則每一次啟動微服務的時候都會自動生成一個密碼, 而這個密碼由於會改變,所以一般都不使用,所以要修改 application.yml 配置文件,追加密碼的配置項:
server: port: 7001 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 spring: application: name: microcloud-eureka-7001 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
此時訪問 eureka 的服務地址為:http://edmin:[email protected]:7001/
3、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,進行授權的註冊連接:
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka instance: lease-renewal-interval-in-seconds: 2 # 設置心跳的時間間隔(默認是30秒) lease-expiration-duration-in-seconds: 5 # 如果現在超過了5秒的間隔(默認是90秒) instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址
2.6、Eureka-HA(高可用) 機制
現在已經成功的實現了一個 Eureka 服務器,但是現在屬於單節點的服務運行過程,如果說現在單節點的 Eureka 出現了錯誤, 導致無法使用,那麽對於所有的微服務的架構就將出現整體的癱瘓,就需要進行 Eureka 集群搭建,同時利用集群可以有效的實現 HA 的處理機制,如果要進行集群的搭建一定要選擇兩臺或以上的電腦完成,而基本的流程如下:
說明:Eureka集群是兩兩相互註冊,當然了傳遞註冊也是可以實現集群的
1、 修改 hosts 配置文件進行多個主機名稱的定義:
127.0.0.1 eureka-7001.com 127.0.0.1 eureka-7002.com 127.0.0.1 eureka-7003.com
2、 【 microcloud-eureka-7001 】 為 了 方 便 進 行 Eureka 操 作 , 建 議 將 “ microcloud-eureka-7001 ”的進行復制,復制為 “microcloud-eureka-7002”、“ microcloud-eureka-7003”。
3、 【microcloud-eureka-7001】修改 application.yml 配置文件,這個配置文件主要註意端口號以及 Eureka 服務註冊位置;
server: port: 7001 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 spring: application: name: microcloud-eureka-7001 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7002/eureka,http://edmin:[email protected]:7003/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱
4、 【microcloud-eureka-7002】修改 application.yml 配置文件:
server: port: 7002 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 spring: application: name: microcloud-eureka-7002 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka,http://edmin:[email protected]:7003/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7002.com # 定義Eureka實例所在的主機名稱
5、 【microcloud-eureka-7003】修改 application.yml 配置文件:
server: port: 7003 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 spring: application: name: microcloud-eureka-7003 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka,http://edmin:[email protected]:7002/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7003.com # 定義Eureka實例所在的主機名稱
6、 啟動所有的 eureka 服務,而後進入到每一個服務的後臺去觀察運行的副本效果:
· 登錄 7001 控制臺:http://edmin:[email protected]:7001/;
· 登錄 7002 控制臺:http://edmin:[email protected]:7002/;
· 登錄 7003 控制臺:http://edmin:[email protected]:7003/。
7、 【microcloud-provider-dept-8001】修改 application.yml 配置文件,進行多臺主機註冊:
eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka,http://edmin:[email protected]:7002/eureka,http://edmin:[email protected]:7003/eureka instance: lease-renewal-interval-in-seconds: 2 # 設置心跳的時間間隔(默認是30秒) lease-expiration-duration-in-seconds: 5 # 如果現在超過了5秒的間隔(默認是90秒) instance-id: dept-8001.com # 在信息列表時顯示主機名稱 prefer-ip-address: true # 訪問的路徑變為IP地址
2.7、Eureka 服務打包部署
現在已經成功的實現了 Eureka 編寫,但是在實際的運行之中,需要將 Eureka 發布到具體的服務器上進行執行,而這就需要對 項目進行打包處理,同樣在進行打包處理的時候也必須考慮到項目的各種環境:開發(dev)、測試(beta)、生產(product),那麽 下面也將基於這樣的方式進行 eureka 項目打包操作。
本次的打包處理將直接基於 yml 配置文件完成,對於 properties 配置與 SpringBoot 講解微服務發布的處理過程一樣。
1、 【microcloud-eureka-server】修改 application.yml 配置文件
spring: profiles: active: - dev-7001 --- spring: profiles: dev-7001 application: name: microcloud-eureka-7001 server: port: 7001 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7002/eureka,http://edmin:[email protected]:7003/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7001.com # 定義Eureka實例所在的主機名稱 --- spring: profiles: dev-7002 application: name: microcloud-eureka-7002 server: port: 7002 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka,http://edmin:[email protected]:7003/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7002.com # 定義Eureka實例所在的主機名稱 --- spring: profiles: dev-7003 application: name: microcloud-eureka-7003 server: port: 7003 security: basic: enabled: true # 啟用安全認證處理 user: name: edmin # 用戶名 password: studyjava # 密碼 eureka: client: # 客戶端進行Eureka註冊的配置 service-url: defaultZone: http://edmin:[email protected]:7001/eureka,http://edmin:[email protected]:7002/eureka register-with-eureka: false # 當前的微服務不註冊到eureka之中 fetch-registry: false # 不通過eureka獲取註冊信息 instance: # eureak實例定義 hostname: eureka-7003.com # 定義Eureka實例所在的主機名稱
2、 【microcloud-eureka-server】添加一個打包的處理插件,修改 pom.xml 配置文件:
<build> <finalName>eureka-server</finalName> <plugins> <plugin> <!-- 該插件的主要功能是進行項目的打包發布處理 --> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <!-- 設置程序執行的主類 --> <mainClass>cn.study.microcloud.Eureka_StartSpringCloudApplication</mainClass> </configuration> <executions> <execution> <goals> <goal>repackage</goal> </goals> </execution> </executions> </plugin> </plugins> </build>
3、 運行 maven:clean install package;
隨後就可以在項目的目錄之中發現生成的“eureka-server.jar”文件。
4、 采用默認的方式執行 eureka-server.jar,那麽此時將運行在 7001 端口上:java -jar eureka-server.jar
5、 運行其它的兩個 profile 配置:
· 運行“dev-7002”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7002;
· 運行“dev-7003”profile:java -jar eureka-server.jar --spring.profiles.active=dev-7003。
SpringCloud系列四:Eureka 服務發現框架(定義 Eureka 服務端、Eureka 服務信息、Eureka 發現管理、Eureka 安全配置、Eureka-HA(高可用) 機制、Eureka 服務打包部署)