1. 程式人生 > 其它 >SpringCloud(7)Eureka自我保護,Eureka優雅停服,Eureka安全認證

SpringCloud(7)Eureka自我保護,Eureka優雅停服,Eureka安全認證

一:Eureka自我保護

通過Renew來判斷這個微服務是否可用(通過傳送心跳來判斷我們的微服務是否可用)

啟動自我保護條件 一般情況下,服務在 Eureka 上註冊後,會每 30 秒傳送心跳包,Eureka 通過心跳來判斷服務是否健康,同時會 定期刪除超過 90 秒沒有傳送心跳的服務。 如下我們的服務都啟動著: 我把serveice-product服務關了:(底下的紅字就是提示資訊,它將這個service-product保護了起來,提示我們去檢查這個服務) ①有兩種情況會導致 Eureka Server 收不到微服務的心跳 微服務自身的原因 微服務與 Eureka 之間的網路故障
②自我保護模式 Eureka Server 在執行期間會去統計心跳失敗比例在 15 分鐘之內是否低於 85%,如果低於 85%,Eureka Server 會將這些例項保護起來,讓這些例項不會過期,同時提示一個警告。這種演算法叫做 Eureka Server 的自我保 護模式。
③為什麼要啟動自我保護 因為同時保留"好資料"與"壞資料"總比丟掉任何資料要更好,當網路故障恢復後,這個 Eureka 節點會退出"自我 保護模式"。 Eureka 還有客戶端快取功能(也就是微服務的快取功能)。即使 Eureka 叢集中所有節點都宕機失效,微服務 的 Provider 和 Consumer 都能正常通訊。 微服務的負載均衡策略會自動剔除死亡的微服務節點。 ④如何關閉自我保護 註冊中心配置自我保護
server:
  port: 8763   #埠
spring:
  application:
    name: eureka-server   #應用名稱

# 配置 Eureka Server 註冊中心
eureka:
  server:
    enable-self-preservation: false  #true: 開啟自我保護模式, false :關閉自我保護模式
    eviction-interval-timer-in-ms: 60000 #清理間隔(單位:毫秒,預設是60*1000)
  instance:
    hostname: eureka03     #主機名,不配置的時候根據作業系統的主機名獲取
    prefer-ip-address: true   #是否使用ip地址註冊
    instance-id: ${spring.cloud.client.ip-address}:${server.port}  #ip port
  client:
    service-url:            #註冊中心對外暴露的註冊地址
        defaultZone: http://localhost:8761/eureka/
eureka:
 server:
  enable-self-preservation: false # true:開啟自我保護模式,false:關閉自我保護模式
  eviction-interval-timer-in-ms: 60000 # 清理間隔(單位:毫秒,預設是 60*1000)

此時我關閉了service-product服務後(過一段時間):直接將我們的service-product下了

二:優雅停服

(如果我們下線了就會給我們的註冊中心傳送資訊,告訴下線了,從服務列表將我們這個服務剔除)

我們上面說的關閉保護功能,現在我們有了優雅停服就能區別是網路問題還是我們故意關閉服務。 所以有了優雅停服就不需要關閉保護功能

配置了優雅停服以後,將不需要 Eureka Server 中配置關閉自我保護。本文使用 actuator 實現。 ①新增依賴(新增到我們服務提供者中)
服務提供者新增 actuator 依賴
<!-- spring boot actuator 依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

配置:

server:
  port: 7070  #埠

spring:
  application:
    name: service-product   #應用名稱(叢集下相同)

#配置 Eureka  Server 註冊中心
eureka:
  instance:
    prefer-ip-address: true    #是否使用ip地址註冊
    instance-id: ${spring.cloud.client.ip-address}:${server.port}   # ip  ;  port
  client:
    service-url:               #設定服務註冊中心地址
      defaultZone: http://localhost:8761/eureka

#度量指標監控與健康檢查
management:
  endpoints:
    web:
      exposure:
        include: shutdowm  #開啟shutdown 端點訪問
  endpoint:
    shutdown:
      enabled: true  #開啟shutdownn 實現優雅停服

一般的沒有下面這個endpoint,這個是強調,一般不能將這個停了,所以這裡進行了確認

開啟:

優雅停服 使用 POST 請求訪問:http://localhost:7070/actuator/shutdown 效果如下

三:Eureka安全認證

我們訪問Eureka列表的時候是要有安全認證的,還有就是我們將服務註冊到Eureka的時候也是要進行安全認證的

①新增依賴(新增到我們的Eureka中)

<!-- spring boot security 依賴 -->
<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-security</artifactId>
</dependency>

②配置檔案

註冊中心配置安全認證
spring:
 # 安全認證
 security:
  user:
   name: root
   password: 123456
修改訪問叢集節點的 url(Eureka,生產者與消費者都需要加上使用者名稱加和密碼):

③啟動倆個Eureka(這個時候倆個都有錯(自己也整了半天))

這個上面也是沒有註冊上去:

為什麼會出現上面的問題呢? 就是CSRF過濾

④過濾CSRF

Eureka 會自動化配置 CSRF 防禦機制,Spring Security 認為 POST, PUT, and DELETE http methods 都是有風 險的,如果這些 method 傳送過程中沒有帶上 CSRF token 的話,會被直接攔截並返回 403 forbidden。 官方給出瞭解決的方法,具體可以參考 spring cloud issue 2754,裡面有大量的討論,這裡提供兩種解決方 案。 首先註冊中心配置一個 @EnableWebSecurity 配置類,繼承 org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter ,然後重寫 configure 方法。 在每個註冊中心都要寫一個類,來進行寫這個:

這樣就ok了:

這個時候開啟我們的生產者和消費者(都是可以的):