1. 程式人生 > >SpringCloud(三)Eureka服務註冊與發現《2》(actuator與Eureka自我保護)

SpringCloud(三)Eureka服務註冊與發現《2》(actuator與Eureka自我保護)

1、actuator與註冊微服務資訊完善

1.1、主機名稱:服務名稱修改

  • 1.當前問題:含有主機名或主機ip。

  • 2.修改microservice-provider-dept-8001yml檔案:

eureka:
  client: 
#客戶端註冊進eureka服務列表內
    service-url:
      defaultZone: http://localhost:7001/eureka
 
instance:
    instance-id: microservicecloud-dept8001

  #自定義服務名稱

  • 3.完整內容:
server:
  port: 8001
  
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置檔案所在路徑
  type-aliases-package: com.nari.entities    # 所有Entity別名類所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper對映檔案
    
spring:
   application:
    name: dept-provider
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 當前資料來源操作型別
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驅動包
    url: jdbc:mysql://localhost:3306/cloudDB01              # 資料庫名稱
    username: root
    password: root
    dbcp2:
      min-idle: 5                                           # 資料庫連線池的最小維持連線數
      initial-size: 5                                       # 初始化連線數
      max-total: 5                                          # 最大連線數
      max-wait-millis: 200                                  # 等待連接獲取的最大超時時間
      
eureka:
   client: #客戶端註冊進eureka服務列表內
     service-url: 
        defaultZone: http://localhost:7001/eureka
       
   instance:
      instance-id: microservice-dept8001  #自定義服務名稱

1.2、訪問資訊有IP資訊提示

  • 1.當前問題:沒有ip提示
  • 2.修改microservice-provider-dept-8001yml檔案:

prefer-ip-address: true     #訪問路徑可以顯示IP地址 

  • 3.修改之後:

1.3、微服務info內容詳細資訊

  • 1.當前問題:超連結點選服務報告ErrorPage

  • 2.修改microservice-provider-dept-8001pom檔案:

修改部分:

<!-- actuator監控資訊完善 -->

<dependency>
               <groupId>org.springframework.boot</groupId>
               <artifactId>
spring-boot-starter-actuator</artifactId>
           </dependency>

完整內容:

<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">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>com.nari</groupId>
    <artifactId>microservice-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
  </parent>
  <artifactId>microservice-provider-dept-8001</artifactId>
  
  <dependencies>
	<!-- 引入自己定義的api通用包,可以使用Dept部門Entity -->
	<dependency>
		<groupId>com.nari</groupId>
		<artifactId>microservice-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>
	</dependency>
	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-devtools</artifactId>
	</dependency>
  </dependencies>
</project>
  • 3.總的父工程microservice-parent修改pom.xml新增構建build資訊

修改部分:

完整部分:

<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">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.nari</groupId>
  <artifactId>microservice-parent</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>pom</packaging>
  
  <properties>
	<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
	<maven.compiler.source>1.8</maven.compiler.source>
	<maven.compiler.target>1.8</maven.compiler.target>
	<junit.version>4.12</junit.version>
	<log4j.version>1.2.17</log4j.version>
	<lombok.version>1.16.18</lombok.version>
  </properties>

	<dependencyManagement>
		<dependencies>
			<dependency>
				<groupId>org.springframework.cloud</groupId>
				<artifactId>spring-cloud-dependencies</artifactId>
				<version>Dalston.SR1</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-dependencies</artifactId>
				<version>1.5.9.RELEASE</version>
				<type>pom</type>
				<scope>import</scope>
			</dependency>
			<dependency>
				<groupId>mysql</groupId>
				<artifactId>mysql-connector-java</artifactId>
				<version>5.0.4</version>
			</dependency>
			<dependency>
				<groupId>com.alibaba</groupId>
				<artifactId>druid</artifactId>
				<version>1.0.31</version>
			</dependency>
			<dependency>
				<groupId>org.mybatis.spring.boot</groupId>
				<artifactId>mybatis-spring-boot-starter</artifactId>
				<version>1.3.0</version>
			</dependency>
			<dependency>
				<groupId>ch.qos.logback</groupId>
				<artifactId>logback-core</artifactId>
				<version>1.2.3</version>
			</dependency>
			<dependency>
				<groupId>junit</groupId>
				<artifactId>junit</artifactId>
				<version>${junit.version}</version>
				<scope>test</scope>
			</dependency>
			<dependency>
				<groupId>log4j</groupId>
				<artifactId>log4j</artifactId>
				<version>${log4j.version}</version>
			</dependency>
		</dependencies>
	</dependencyManagement>

	<build>
		<finalName>microservice-parent</finalName>
		<resources>
			<resource>
				<directory>src/main/resources</directory>
				<filtering>true</filtering>
			</resource>
		</resources>
		<plugins>
			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-resources-plugin</artifactId>
				<configuration>
					<delimiters>
						<delimit>$</delimit>
					</delimiters>
				</configuration>
			</plugin>
		</plugins>
	</build>
	<modules>
		<module>microservice-api</module>
		<module>microservice-provider-dept-8001</module>
		<module>microservice-consumer-dept-80</module>
		<module>microservice-eureka-7001</module>
	</modules>
</project>
  • 4.修改microservice-provider-dept-8001yml檔案

修改內容:

info:
  app.name: miserservice-provider-dept
  company.name: www.nari.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$

修改之後:

2、eureka自我保護

2.1、什麼是自我保護模式?

預設情況下,如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳,EurekaServer將會登出該例項(預設90秒)。但是當網路分割槽故障發生時,微服務與EurekaServer之間無法正常通訊,以上行為可能變得非常危險了——因為微服務本身其實是健康的,此時本不應該登出這個微服務。Eureka通過“自我保護模式”來解決這個問題——當EurekaServer節點在短時間內丟失過多客戶端時(可能發生了網路分割槽故障),那麼這個節點就會進入自我保護模式。一旦進入該模式,EurekaServer就會保護服務登錄檔中的資訊,不再刪除服務登錄檔中的資料(也就是不會登出任何微服務)。當網路故障恢復後,該Eureka Server節點會自動退出自我保護模式。

在自我保護模式中,Eureka Server會保護服務登錄檔中的資訊,不再登出任何服務例項。當它收到的心跳數重新恢復到閾值以上時,該Eureka Server節點就會自動退出自我保護模式。它的設計哲學就是寧可保留錯誤的服務註冊資訊,也不盲目登出任何可能健康的服務例項。一句話講解:好死不如賴活著。

綜上,自我保護模式是一種應對網路異常的安全保護措施。它的架構哲學是寧可同時保留所有微服務(健康的微服務和不健康的微服務都會保留),也不盲目登出任何健康的微服務。使用自我保護模式,可以讓Eureka叢集更加的健壯、穩定。

在Spring Cloud中,可以使用eureka.server.enable-self-preservation = false 禁用自我保護模式。

2.2、故障現象


注意:

預設情況下,如果EurekaServer在一定時間內沒有接收到某個微服務例項的心跳,EurekaServer將會登出該例項(預設90秒)。也會顯示自我保護提示,這個不是出問題了服務還存在著,有可能是網路擁堵或呼叫超時沒有迴應,Eureka認為此時不應該登出服務,這就是Eureka的自我保護模式。

2.3、導致原因
   

一句話:某時刻某一個微服務不可用了,eureka不會立刻清理,依舊會對該微服務的資訊進行儲存