1. 程式人生 > >SpringCloud系列四:Eureka 服務發現框架(定義 Eureka 服務端、Eureka 服務信息、Eureka 發現管理、Eureka 安全配置、Eureka-HA(高可用) 機制、Eureka 服務打包部署)

SpringCloud系列四:Eureka 服務發現框架(定義 Eureka 服務端、Eureka 服務信息、Eureka 發現管理、Eureka 安全配置、Eureka-HA(高可用) 機制、Eureka 服務打包部署)

pac elf figure 傳遞 uri rect body 情況 服務組

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 服務打包部署)