1. 回顧
上一篇博客講解了Eureka集群及將微服務注冊到集群上。在前面的講解中,Eureka Server都是允許匿名訪問的,本次將講解如何構建一個需要登錄才能訪問的Eureka Server。
2. 為Eureka Server添加用戶認證
> 復制項目 microservice-discovery-eureka,將ArtifactId修改為 microservice-discovery-eureka-authenticating。
> 在pom.xml中添加spring-boot-starter-seurity的依賴,該依賴為Eureka Server提供用戶認證的能力。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
> 在application.yml中添加認證配置。如何不進行配置,則默認用戶名是 user ,默認密碼是一個隨機值,會在項目啟動時打印出來。
spring:
security:
user:
name: root # 用戶名
password: 123456 # 密碼
> 啟動項目,訪問 http://localhost:8761/ 即可看見身份驗證的對話框,輸出設置的用戶名和密碼即可進入。
> 將微服務中的 eureka.client.service-url.defaultZone 改為 http://root:123456@localhost:8761/eureka/ 即可注冊到需認證的Eureka Server中。但是我測試一直沒有成功,跟蹤日志發現是因為csrf的問題,微服務的請求中不包含csrf參數,因此被CsrfFilter攔截。版本Edgware.SR2測試成功,但是該版本中的配置有所不同,該版本的配置為:
security:
basic:
enabled: true
user:
name: root
password: 123456
--------------------------------------------------------------------------- 補充開始 --------------------------------------------------------------------------------------------------------
> 上面已經說過,因為Eureka Server默認開啟了CsrfFilter,導致微服務不能注冊成功。因此只需要關閉Eureka Server的CsrfFilter即可
> 在Eureka Server中添加如下配置類即可關閉Csrf校驗
package com.itmuch.cloud.microservicediscoveryeurekaauthenticating; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; @EnableWebSecurity public class WebSecurityConfigurer extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { http.csrf().disable(); super.configure(http); } }
> 重新啟動 microservice-discovery-eureka-authenticating
> 修改 microservice-provider-user 的 application.yml中 的 defaultZone為 http://user:password123@localhost:8761/eureka,然后啟動
> 注冊成功
--------------------------------------------------------------------------- 補充結束 --------------------------------------------------------------------------------------------------------
3. Eureka的元數據
> Eureka的元數據有兩種,分別為標准元數據和自定義元數據。
標准元數據:主機名、IP地址、端口號、狀態頁和健康檢查等信息,這些信息都會被發布在服務注冊表中,用於服務之間的調用。
自定義元數據:自定義元數據可以使用eureka.instance.metadata-map配置,這些元數據可以在遠程客戶端中訪問,但是一般不會改變客戶端的行為,除非客戶端知道該元數據的含義。
> 復制項目 microservice-provider-user,將ArtifactId修改為 microservice-provider-user-metadata
> 修改application.yml,使用eureka.instance.instance.metadata-map屬性為該微服務添加自定義的元數據。
eureka:
metadata-map:
my-metadata: 我自定義的元數據
> 復制項目 microservice-consumer-movie,將ArtifactId修改為 microservice-consumer-movie-metadata
> 修改 MovieController,添加方法showInfo(),展示微服務 microservice-provider-user-metadata 的元數據信息
/** * 查詢microservice-provider-user服務的信息並返回 * * @return */ @GetMapping("/user-instance") public List<ServiceInstance> showInfo() { return this.discoveryClient.getInstances("microservice-provider-user"); }
> 啟動 microservice-discovery-eureka(必須第一個啟動)
> 啟動 microservice-provider-user-metadata
> 啟動 microservice-consumer-movie-metadata
> 訪問 http://localhost:8010/user-instance/,返回類似如下的內容。
> 將內容復制到 http://json.cn 中,看的更清晰明了。
4. 總結
這篇是很尷尬的一篇,搞了半天也沒能將微服務注冊到該版本的Eureka Server中,后續如果解決了會進行更新。
后續將講解Eureka剩余的知識:自我保護模式、健康檢查、多網卡環境下的IP選擇等。敬請期待~~~
5. 參考
周立 --- 《Spring Cloud與Docker微服務架構與實戰》