Eureka服務註冊與發現(二)
接上一篇:Eureka服務註冊與發現(一)
爲Eureka Server添加用戶認證
之前的Eureka Serverhi是可以匿名訪問,接下來構造一個需要認證的項目
- 在之前的Eureka Server中添加依賴
// https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-security
compile group: 'org.springframework.boot', name: 'spring-boot-starter-security', version: '2.1.6.RELEASE'
- 在
application.yml
中添加配置
spring:
profiles: peer1
security:
user:
name: root
password: root123
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/
- 訪問
http://127.0.0.1:8761/
即可進入登陸頁面
將微服務註冊到需要認證的Eureka Server
- 修改用戶微服務的配置文件如下:
eureka:
client:
serviceUrl:
defaultZone: http://root:root123@localhost:8761/eureka/
instance:
prefer-ip-address: true
但是這樣啓動會一直報錯。無法將服務註冊到Eureka Server,報錯如下
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
- 通過查閱官方文檔,找到解決辦法,需要在Eureka Server增加以下配置類:
@EnableWebSecurity
class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().ignoringAntMatchers("/eureka/**");
super.configure(http);
}
}
- 可以在Eureka Server上看到服務已經成功註冊:
Eureka的自我保護模式
上一篇提到了Eureka的自我保護模式(紅色的提示)。默認情況下,如果Eureka Server在一段時間內如果沒有接收到某個微服務實例的心跳,Eureka Sserver會註銷該實例(默認30S),但是當網絡故障時,微服務與Eureka Server之間無法通信,但是服務確實正常的,如果立即註銷服務那很不合理而且很危險。
Eureka Server通過“自我保護模式”解決這個問題——當Eureka Server節點在短時間內丟失過多客戶端時,那麼這個節點進入自我保護模式。一旦進入該模式,Eureka Server會保護服務註冊表中的信息,不在刪除服務。當網絡故障回覆後,該Eureka Server節點會自動退出自我保護模式。
在Spring Cloud中可通過添加如下配置,禁用自我保護模式:
eureka:
server:
enable-self-preservation: false
Eureka的健康檢查
-
下圖時Eureka Server中的服務狀態信息。服務狀態共有:UP、OUT_OF_SERVICE、UNKOWN等。
-
只有標記爲UP的服務纔是正常的,才能被其他服務請求。在Spring Boot中通過添加Spring Boot Actuator的/health節點能夠看到服務的狀態,在Eureka Client中通過簡單的配置即可將服務的狀態傳播到Eureka Server,配置如下:
eureka:
client:
healthcheck:
enabled: true