Spring Cloud Eureka:服務註冊與發現

  • 2019 年 10 月 4 日
  • 筆記

Spring Cloud Eureka是Spring Cloud Netflix 子項目的核心組件之一,主要用於微服務架構中的服務治理。本文將對搭建Eureka註冊中心,搭建Eureka客戶端,搭建Eureka集群及給Eureka註冊中心添加登錄認證進行介紹。

簡介

在微服務架構中往往會有一個註冊中心,每個微服務都會向註冊中心去註冊自己的地址及埠資訊,註冊中心維護著服務名稱與服務實例的對應關係。每個微服務都會定時從註冊中心獲取服務列表,同時彙報自己的運行情況,這樣當有的服務需要調用其他服務時,就可以從自己獲取到的服務列表中獲取實例地址進行調用,Eureka實現了這套服務註冊與發現機制。

搭建Eureka註冊中心

這裡我們以創建並運行Eureka註冊中心來看看在IDEA中創建並運行SpringCloud應用的正確姿勢。

使用IDEA來創建SpringCloud應用

  • 創建一個eureka-server模組,並使用Spring Initializer初始化一個SpringBoot項目
  • 填寫應用資訊
  • 選擇你需要的SpringCloud組件進行創建
  • 創建完成後會發現pom.xml文件中已經有了eureka-server的依賴
<dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>  </dependency>
  • 在啟動類上添加@EnableEurekaServer註解來啟用Euerka註冊中心功能
@EnableEurekaServer  @SpringBootApplication  public class EurekaServerApplication {        public static void main(String[] args) {          SpringApplication.run(EurekaServerApplication.class, args);      }    }
  • 在配置文件application.yml中添加Eureka註冊中心的配置
server:    port: 8001 #指定運行埠  spring:    application:      name: eureka-server #指定服務名稱  eureka:    instance:      hostname: localhost #指定主機地址    client:      fetch-registry: false #指定是否要從註冊中心獲取服務(註冊中心不需要開啟)      register-with-eureka: false #指定是否要註冊到註冊中心(註冊中心不需要開啟)    server:      enable-self-preservation: false #關閉保護模式

使用IDEA的Run Dashboard來運行SpringCloud應用

此時服務已經創建完成,點擊啟動類的main方法就可以運行了。但是在微服務項目中我們會啟動很多服務,為了便於管理,我們使用IDEA的Run Dashboard來啟動。

  • 打開Run Dashboard,默認情況下,當IDEA檢查到你的項目中有SpringBoot應用時,會提示你開啟,如果你沒開啟,可以用以下方法開啟。
  • 運行SpringCloud應用
  • 運行完成後訪問地址http://localhost:8001/可以看到Eureka註冊中心的介面

搭建Eureka客戶端

  • 新建一個eureka-client模組,並在pom.xml中添加如下依賴
<dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>  </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-web</artifactId>  </dependency>
  • 在啟動類上添加@EnableDiscoveryClient註解表明是一個Eureka客戶端
@EnableDiscoveryClient  @SpringBootApplication  public class EurekaClientApplication {        public static void main(String[] args) {          SpringApplication.run(EurekaClientApplication.class, args);      }    }
  • 在配置文件application.yml中添加Eureka客戶端的配置
server:    port: 8101 #運行埠號  spring:    application:      name: eureka-client #服務名稱  eureka:    client:      register-with-eureka: true #註冊到Eureka的註冊中心      fetch-registry: true #獲取註冊實例列表      service-url:        defaultZone: http://localhost:8001/eureka/ #配置註冊中心地址
  • 運行eureka-client
  • 查看註冊中心http://localhost:8001/發現Eureka客戶端已經成功註冊

搭建Eureka註冊中心集群

搭建兩個註冊中心

由於所有服務都會註冊到註冊中心去,服務之間的調用都是通過從註冊中心獲取的服務列表來調用,註冊中心一旦宕機,所有服務調用都會出現問題。所以我們需要多個註冊中心組成集群來提供服務,下面將搭建一個雙節點的註冊中心集群。

  • 給eureka-sever添加配置文件application-replica1.yml配置第一個註冊中心
server:    port: 8002  spring:    application:      name: eureka-server  eureka:    instance:      hostname: replica1    client:      serviceUrl:        defaultZone: http://replica2:8003/eureka/ #註冊到另一個Eureka註冊中心      fetch-registry: true      register-with-eureka: true
  • 給eureka-sever添加配置文件application-replica2.yml配置第二個註冊中心
server:    port: 8003  spring:    application:      name: eureka-server  eureka:    instance:      hostname: replica2    client:      serviceUrl:        defaultZone: http://replica1:8002/eureka/ #註冊到另一個Eureka註冊中心      fetch-registry: true      register-with-eureka: true

這裡我們通過兩個註冊中心互相註冊,搭建了註冊中心的雙節點集群,由於defaultZone使用了域名,所以還需在本機的host文件中配置一下。

  • 修改本地host文件
127.0.0.1 replica1  127.0.0.1 replica2

運行Eureka註冊中心集群

在IDEA中我們可以通過使用不同的配置文件來啟動同一個SpringBoot應用。

  • 添加兩個配置,分別以application-replica1.yml和application-replica2.yml來啟動eureka-server

從原啟動配置中複製一個出來

配置啟動的配置文件

  • 啟動兩個eureka-server,訪問其中一個註冊中心http://replica1:8002/發現另一個已經成為其備份
  • 修改Eureka-client,讓其連接到集群

添加eureka-client的配置文件application-replica.yml,讓其同時註冊到兩個註冊中心。

server:    port: 8102  spring:    application:      name: eureka-client  eureka:    client:      register-with-eureka: true      fetch-registry: true      service-url:        defaultZone: http://replica1:8002/eureka/,http://replica2:8003/eureka/ #同時註冊到兩個註冊中心

以該配置文件啟動後訪問任意一個註冊中心節點都可以看到eureka-client

給Eureka註冊中心添加認證

創建一個eureka-security-server模組,在pom.xml中添加以下依賴

需要添加SpringSecurity模組。

<dependency>      <groupId>org.springframework.cloud</groupId>      <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>  </dependency>    <dependency>      <groupId>org.springframework.boot</groupId>      <artifactId>spring-boot-starter-security</artifactId>  </dependency>

添加application.yml配置文件

主要是配置了登錄註冊中心的用戶名和密碼。

server:    port: 8004  spring:    application:      name: eureka-security-server    security: #配置SpringSecurity登錄用戶名和密碼      user:        name: macro        password: 123456  eureka:    instance:      hostname: localhost    client:      fetch-registry: false      register-with-eureka: false

添加Java配置WebSecurityConfig

默認情況下添加SpringSecurity依賴的應用每個請求都需要添加CSRF token才能訪問,Eureka客戶端註冊時並不會添加,所以需要配置/eureka/**路徑不需要CSRF token。

@EnableWebSecurity  public class WebSecurityConfig extends WebSecurityConfigurerAdapter {        @Override      protected void configure(HttpSecurity http) throws Exception {          http.csrf().ignoringAntMatchers("/eureka/**");          super.configure(http);      }  }

運行eureka-security-server,訪問http://localhost:8004發現需要登錄認證

eureka-client註冊到有登錄認證的註冊中心

  • 配置文件中需要修改註冊中心地址格式
http://${username}:${password}@${hostname}:${port}/eureka/
  • 添加application-security.yml配置文件,按格式修改用戶名和密碼
server:    port: 8103  spring:    application:      name: eureka-client  eureka:    client:      register-with-eureka: true      fetch-registry: true      service-url:        defaultZone: http://macro:123456@localhost:8004/eureka/
  • 以application-security.yml配置運行eureka-client,可以在註冊中心介面看到eureka-client已經成功註冊

Eureka的常用配置

eureka:    client: #eureka客戶端配置      register-with-eureka: true #是否將自己註冊到eureka服務端上去      fetch-registry: true #是否獲取eureka服務端上註冊的服務列表      service-url:        defaultZone: http://localhost:8001/eureka/ # 指定註冊中心地址      enabled: true # 啟用eureka客戶端      registry-fetch-interval-seconds: 30 #定義去eureka服務端獲取服務列表的時間間隔    instance: #eureka客戶端實例配置      lease-renewal-interval-in-seconds: 30 #定義服務多久去註冊中心續約      lease-expiration-duration-in-seconds: 90 #定義服務多久不去續約認為服務失效      metadata-map:        zone: jiangsu #所在區域      hostname: localhost #服務主機名稱      prefer-ip-address: false #是否優先使用ip來作為主機名    server: #eureka服務端配置      enable-self-preservation: false #關閉eureka服務端的保護機制

使用到的模組

springcloud-learning  ├── eureka-server -- eureka註冊中心  ├── eureka-security-server -- 帶登錄認證的eureka註冊中心  └── eureka-client -- eureka客戶端

項目源碼地址

https://github.com/macrozheng/springcloud-learning

Tags: