啓動類git
@EnableEurekaServer
@SpringBootApplication public class EurekaServerApplication{ public static void main(String[] args){ SpringApplication.run(EurekaServerApplication.class, args); } }
添加依賴,官方地址:https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-servergithub
<!-- https://mvnrepository.com/artifact/org.springframework.cloud/spring-cloud-starter-netflix-eureka-server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
application.ymlweb
eureka:
client:
register-with-eureka:false
fetch-registry:false
service-url:
defaultZone:http://localhost:7900/eureka/
eureka全部操做調用, 所有是基於Restful協議的spring
application-euk1.ymlapi
eureka:
client:
register-with-eureka:false
fetch-registry:false
service-url:
defaultZone:http://euk2.com:7002/eureka/
instance:
hostname:euk1.com
server:
port:7001
application-euk2.yml跨域
eureka:
client:
register-with-eureka:false
fetch-registry:false
service-url:
defaultZone:http://euk1.com:7001/eureka/
instance:
hostname:euk2.com
server:
port:7002
application.yml緩存
spring:
profiles:
active:euk1
服務註冊安全
想要參與服務註冊發現的實例首先須要向Eureka服務器註冊信息springboot
註冊在第一次心跳發生時提交服務器
續租(模型概念),心跳(實現方式)
Eureka客戶須要每30秒發送一次心跳來續租
10:00 00 第一次
10:00 30
10:01
10:01 30 最後
更新通知Eureka服務器實例仍然是活動的。若是服務器在90秒內沒有看到更新,它將從其註冊表中刪除實例
Eureka客戶端從服務器獲取註冊表信息並將其緩存在本地。
以後,客戶端使用這些信息來查找其餘服務。
經過獲取上一個獲取週期和當前獲取週期之間的增量更新,能夠按期(每30秒)更新此信息。
節點信息在服務器中保存的時間更長(大約3分鐘),所以獲取節點信息時可能會再次返回相同的實例。Eureka客戶端自動處理重複的信息。
在得到增量以後,Eureka客戶機經過比較服務器返回的實例計數來與服務器協調信息,若是因爲某種緣由信息不匹配,則再次獲取整個註冊表信息。
Eureka客戶端在關閉時向Eureka服務器發送取消請求。這將從服務器的實例註冊表中刪除實例,從而有效地將實例從通訊量中取出。
同步時間延遲
來自Eureka客戶端的全部操做可能須要一段時間才能反映到Eureka服務器上,而後反映到其餘Eureka客戶端上。這是由於eureka服務器上的有效負載緩存,它會按期刷新以反映新信息。Eureka客戶端還按期地獲取增量。所以,更改傳播到全部Eureka客戶機可能須要2分鐘。
通信機制
Http協議下的Rest請求
默認狀況下Eureka使用Jersey和Jackson以及JSON完成節點間的通信
新建一個web項目,引入starter spring-cloud-starter-netflix-eureka-client
#續約發送間隔默認30秒,心跳間隔
eureka.instance.lease-renewal-interval-in-seconds=5
#表示eureka client間隔多久去拉取服務註冊信息,默認爲30秒,對於api-gateway,若是要迅速獲取服務註冊狀態,能夠縮小該值,好比5秒
eureka.client.registry-fetch-interval-seconds=5
# 續約到期時間(默認90秒)
eureka.instance.lease-expiration-duration-in-seconds=60
#關閉自我保護模式
eureka.server.enable-self-preservation=false
#失效服務間隔
eureka.server.eviction-interval-timer-in-ms=3000
官方地址:https://github.com/Netflix/eureka/wiki/Eureka-REST-operations
application.yml
eureka:
instance:
metadata-map:
dalao:test
Eureka的元數據有兩種:標準元數據和自定義元數據。
標準元數據:主機名、IP地址、端口號、狀態頁和健康檢查等信息,這些信息都會被髮布在服務註冊表中,用於服務之間的調用。
自定義元數據:可使用eureka.instance.metadata-map配置,這些元數據能夠在遠程客戶端中訪問,可是通常不改變客戶端行爲,除非客戶端知道該元數據的含義。
能夠在配置文件中對當前服務設置自定義元數據,可後期用戶個性化使用
元數據能夠配置在eureka服務器和eureka的客戶端上
EurekaClient 能夠在客戶端獲取eureka服務器上的註冊者信息
表明通用於服務發現的讀操做,例如在 eureka或consul中。
String description();//獲取實現類的描述。 List<String> getServices();//獲取全部服務實例id。 List<ServiceInstance> getInstances(String serviceId);//經過服務id查詢服務實例信息列表。
com.netflix.discovery.DiscoveryClient爲Eureka註冊中心客戶端的接口,功能更豐富
Eureka在CAP理論當中是屬於AP , 也就說當產生網絡分區時,Eureka保證系統的可用性,但不保證系統裏面數據的一致性
默認開啓,服務器端容錯的一種方式,即短期心跳不到達仍不剔除服務列表裏的節點
EMERGENCY!
EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
默認狀況下,Eureka Server在必定時間內,沒有接收到某個微服務心跳,會將某個微服務註銷(90S)
可是當網絡故障時,微服務與Server之間沒法正常通訊,上述行爲就很是危險,由於微服務正常,不該該註銷
Eureka Server經過自我保護模式來解決整個問題,當Server在短期內丟失過多客戶端時,那麼Server會進入自我保護模式,會保護註冊表中的微服務不被註銷掉。
當網絡故障恢復後,退出自我保護模式。
思想:寧肯保留健康的和不健康的,也不盲目註銷任何健康的服務。
客戶端每分鐘續約數量小於客戶端總數的85%時會觸發保護機制
自我保護機制的觸發條件:
expectedNumberOfRenewsPerMin = 當前註冊的應用實例數 x 2
爲何乘以 2:
默認狀況下,註冊的應用實例每半分鐘續租一次,那麼一分鐘心跳兩次,所以 x2
服務實例數:10個,指望每分鐘續約數:10 * 2=20,指望閾值:20*0.85=17,自我保護少於17時觸發
添加依賴,官方地址:https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator
<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-actuator --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
springboot2.0只暴露了health和info端點,提供的監控信息沒法知足需求
application.yml
management:
endpoints:
web:
exposure:
include:*
因爲server和client經過心跳保持 服務狀態,而只有狀態爲UP的服務才能被訪問
看eureka界面中的status
添加依賴,官方地址:
application.yml
eureka:
client:
healthcheck:
enabled: true
HealthStatusService
@Service public class HealthStatusService implements HealthIndicator{ private Boolean status = true; public void setStatus(Boolean status) { this.status = status; } @Override public Health health() { // TODO Auto-generated method stub if(status) return new Health.Builder().up().build(); return new Health.Builder().down().build(); } public String getStatus() { // TODO Auto-generated method stub return this.status.toString(); } }
Controller
@GetMapping("/health") public String health(@RequestParam("status") Boolean status) { healthStatusSrv.setStatus(status); return healthStatusSrv.getStatus(); }
開啓Eureka安全鏈接,application.yml
spring:
security:
user:
name:test
password:test
若是服務註冊報錯
Root name 'timestamp' does not match expected ('instance') for type [simple
是默認開啓了防止跨域攻擊
手動關閉
在服務端增長配置類
@Configuration @EnableWebSecurity public class WebSecurityConfig extends WebSecurityConfigurerAdapter{ @Override protected void configure(HttpSecurity http) throws Exception { // TODO Auto-generated method stub http.csrf().disable(); super.configure(http); } }