eureka自我保护功能
接著上次講的springcloud服務提供者的實現
下面我們看一下eureka的自我保護功能
首先對Eureka注冊中心需要了解的是Eureka各個節點都是平等的,沒有ZK中角色的概念, 即使N-1個節點掛掉也不會影響其他節點的正常運行。
默認情況下,如果Eureka Server在一定時間內(默認90秒)沒有接收到某個微服務實例的心跳,Eureka Server將會移除該實例。但是當網絡分區故障發生時,微服務與Eureka Server之間無法正常通信,而微服務本身是正常運行的,此時不應該移除這個微服務,所以引入了自我保護機制
注冊中心的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>microservicecloud</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-eureka-7001</artifactId><dependencies><!--eureka-server服務端 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><!-- 修改后立即生效,熱部署 --><!-- <dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><optional>true</optional><scope>true</scope></dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope></dependency></dependencies><build><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin><!-- 在這里添加熱部署springloader plugin--><!-- <plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency></dependencies><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>exec</classifier></configuration></execution></executions></plugin>--><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--fork : 如果沒有該項配置,可能這個devtools不會起作用,即應用不會restart--><fork>true</fork></configuration></plugin></plugins></build> </project>注冊中心的啟動類代碼:
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;@SpringBootApplication @EnableEurekaServer // EurekaServer服務器端啟動類,接受其它微服務注冊進來 public class EurekaServer7001_App {public static void main(String[] args){SpringApplication.run(EurekaServer7001_App.class, args);} }注冊中心的application.yml配置文件:
server:port: 7001spring:application:name: microservicecloud-eureka#熱部署devtools:restart:enabled: truetrigger-file: devtools.tgeureka:instance:hostname: localhost #eureka服務端的實例名稱client:register-with-eureka: false #false表示不向注冊中心注冊自己fetch-registry: false #false表示自己端就是注冊中心,我的職責就是維護服務實例,并不需要去檢索服務service-url:defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #設置與Eureka Server交互的地址查詢服務和注冊服務都需要依賴這個地址(單機)?
?
?
服務提供者的pom.xml
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><parent><artifactId>microservicecloud</artifactId><groupId>com.atguigu.springcloud</groupId><version>1.0-SNAPSHOT</version></parent><modelVersion>4.0.0</modelVersion><artifactId>microservicecloud-provider-dept-8001</artifactId><dependencies><!-- 引入自己定義的api通用包,可以使用Dept部門Entity --><dependency><groupId>com.atguigu.springcloud</groupId><artifactId>microservicecloud-api</artifactId><version>${project.version}</version></dependency><!-- actuator監控信息完善 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency><!-- 將微服務provider側注冊進eureka --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-config</artifactId></dependency><dependency><groupId>junit</groupId><artifactId>junit</artifactId></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId></dependency><dependency><groupId>ch.qos.logback</groupId><artifactId>logback-core</artifactId></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jetty</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><!-- 修改后立即生效,熱部署 --><!--<dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId><optional>true</optional><scope>true</scope></dependency>--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><optional>true</optional><scope>true</scope></dependency></dependencies><build><plugins><!--<plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><dependencies><dependency><groupId>org.springframework</groupId><artifactId>springloaded</artifactId></dependency></dependencies><executions><execution><goals><goal>repackage</goal></goals><configuration><classifier>exec</classifier></configuration></execution></executions></plugin> --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><!--fork : 如果沒有該項配置,可能這個devtools不會起作用,即應用不會restart--><fork>true</fork></configuration></plugin></plugins></build></project>服務提供者的啟動類代碼:
package com.atguigu.springcloud;import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; import org.springframework.cloud.netflix.eureka.EnableEurekaClient;@SpringBootApplication @EnableEurekaClient //本服務啟動后會自動注冊進eureka服務中 //@EnableDiscoveryClient //服務發現 public class DeptProvider8001_App {public static void main(String[] args) {SpringApplication.run(DeptProvider8001_App.class, args);} }服務提供者的application.yml配置文件
server:port: 8001mybatis:config-location: classpath:mybatis/mybatis.cfg.xml # mybatis配置文件所在路徑type-aliases-package: com.atguigu.springcloud.entities # 所有Entity別名類所在包mapper-locations:- classpath:mybatis/mapper/**/*.xml # mapper映射文件spring:application:name: microservicecloud-dept#熱部署devtools:restart:enabled: truetrigger-file: devtools.tgdatasource:type: com.alibaba.druid.pool.DruidDataSource # 當前數據源操作類型driver-class-name: org.gjt.mm.mysql.Driver # mysql驅動包url: jdbc:mysql://localhost:3306/cloudDB01 # 數據庫名稱username: rootpassword: rootdbcp2:min-idle: 5 # 數據庫連接池的最小維持連接數initial-size: 5 # 初始化連接數max-total: 5 # 最大連接數max-wait-millis: 200 # 等待連接獲取的最大超時時間#以下為新增druid:# 指明是否在從池中取出連接前進行檢驗,如果檢驗失敗, 則從池中去除連接并嘗試取出另一個,#注意: 設置為true后如果要生效,validationQuery參數必須設置為非空字符串test-on-borrow: false# 指明連接是否被空閑連接回收器(如果有)進行檢驗.如果檢測失敗,則連接將被從池中去除.#注意: 設置為true后如果要生效,validationQuery參數必須設置為非空字符串test-while-idle: true# 指明是否在歸還到池中前進行檢驗,注意: 設置為true后如果要生效,#validationQuery參數必須設置為非空字符串test-on-return: false# SQL查詢,用來驗證從連接池取出的連接,在將連接返回給調用者之前.#如果指定,則查詢必須是一個SQL SELECT并且必須返回至少一行記錄validation-query: select 1eureka:client: #客戶端注冊進eureka服務列表內service-url: defaultZone: http://localhost:7001/eureka#defaultZone: http://eureka7001.com:7001/eureka/,http://eureka7002.com:7002/eureka/,http://eureka7003.com:7003/eureka/instance:instance-id: microservicecloud-dept8001prefer-ip-address: true #訪問路徑可以顯示IP地址 info: app.name: atguigu-microservicecloudcompany.name: www.atguigu.combuild.artifactId: $project.artifactId$build.version: $project.version$?
兩個工程的測試代碼已經完成下面我們來測試下eureka的自我保護功能
分別啟動注冊中心和服務提供者兩個服務如下圖所示:
?
?
注冊的服務名稱如下圖yml配置:
eureka客戶端也就是服務的提供者yml配置文件配置服務以及服務狀態配置:
服務已經啟動我們訪問注冊中心:http://localhost:7001/
?
接下來我們下個下服務的實例名稱
再次訪問:http://localhost:7001/
如下圖可知微服務立馬改變
再次改變yml配置微服務名稱
再次訪問:http://localhost:7001/
?
總結一句話:某時候某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的信息進行保存
自我保護模式正是一種針對網絡異常波動的安全保護措施,使用自我保護模式能使Eureka集群更加的健壯、穩定的運行。
自我保護機制的工作機制是如果在15分鐘內超過85%的客戶端節點都沒有正常的心跳,那么Eureka就認為客戶端與注冊中心出現了網絡故障,Eureka Server自動進入自我保護機制,此時會出現以下幾種情況:
1、Eureka Server不再從注冊列表中移除因為長時間沒收到心跳而應該過期的服務。
2、Eureka Server仍然能夠接受新服務的注冊和查詢請求,但是不會被同步到其它節點上,保證當前節點依然可用。
3、當網絡穩定時,當前Eureka Server新的注冊信息會被同步到其它節點中。
因此Eureka Server可以很好的應對因網絡故障導致部分節點失聯的情況,而不會像ZK那樣如果有一半不可用的情況會導致整個集群不可用而變成癱瘓。
?
自我保護開關
Eureka自我保護機制,通過配置eureka.server.enable-self-preservation來true打開/false禁用自我保護機制,默認打開狀態,建議生產環境打開此配置。
開發環境配置
開發環境中如果要實現服務失效能自動移除,只需要修改注冊中心application.yml文件以下配置。
1、 注冊中心關閉自我保護機制,修改檢查失效服務的時間。
eureka:server: enable-self-preservation: falseeviction-interval-timer-in-ms: 30002、 微服務修改減短服務心跳的時間。
# 默認90秒 lease-expiration-duration-in-seconds: 10 # 默認30秒 lease-renewal-interval-in-seconds: 3?
總結
以上是生活随笔為你收集整理的eureka自我保护功能的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【整理】BIOS、BootLoader、
- 下一篇: 互联网晚报 | 3月21日 星期一 |