前言
Spring的东西一大特点就是文档特别全,有疑问查询官方文档估计能解决一大部分问。
搭建Eureka服务端
可以直接在idea中创建,或者在https://start.spring.io/中创建。
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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.eleven.springcloud</groupId><artifactId>eurekaserver-8000</artifactId><version>0.0.1-SNAPSHOT</version><name>00-eurekaserver-8000</name><description>Demo project for Spring Boot</description><properties><java.version>1.8</java.version><!--要和SpringBoot的版本对应--><spring-cloud.version>Greenwich.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml 配置
server:port: 8000eureka:instance:# Eureka主机名称hostname: localhostclient:# 是否向注册中心注册,不需要,自己就是服务中心register-with-eureka: false# 指定此客户端是否能获取Eureka的注册信息fetch-registry: false# 暴露服务中心地址,客户端通过这个地址进行访问service-url:# 使用${}可以获取当前配置文件中的变量参数,此处等价于:http://localhost:8000/eurekadefaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
启动类
/*** @EnableEurekaServer 开启Eureka服务*/@SpringBootApplication@EnableEurekaServerpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
启动成功在页面输入 http://localhost:8080/ ,可以看到该界面,这就完成了Eureka的服务中心
搭建Eureka客户端
创建方法一样,修改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 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.9.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>cn.eleven.springcloud</groupId><artifactId>provider-8081</artifactId><version>0.0.1-SNAPSHOT</version><name>02-provider-8081</name><description>提供者</description><properties><java.version>1.8</java.version><!--要和SpringBoot的版本对应--><spring-cloud.version>Greenwich.SR1</spring-cloud.version></properties><dependencies><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><optional>true</optional></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.10</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><!-- eureka-client --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-netflix-eureka-client</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
application.yml 配置
server:port: 8081eureka:client:service-url:# 指定要连接的Eureka服务中心地址defaultZone: http://localhost:8000/eureka# 该服务在注册中心中的名称instance:instance-id: msc-provider-depart-8081spring:application:# 该微服务名称name: msc-provider-depart# 使用jpa,是否自动创建表jpa:generate-ddl: true# 配置数据源datasource:type: com.alibaba.druid.pool.DruidDataSourcedriver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8username: rootpassword: root# 配置 actuator,添加该应用详细信息info:auth: Elevenapp.name: ${spring.application.name}company.name: www.eleven.cncompany.addr: hangzhou china# 配置日志logging:pattern:console: level-%level %msg%nlevel:root: infoorg.hibernate: info# 指定spring.jpa.show-sql为true时,是否显示动态参数值org.hibernate.type.descriptor.sql.BasicBinder: trace# 指定spring.jpa.show-sql为true时,是否显示查询语句的查询结果org.hibernate.type.descriptor.sql.BasicExtractor: tracecom.abc.provider: debug
启动类
/*** eureka 客户端,可以加下列注解,也可以不加,会自动注册到eureka服务中心* {@link EnableEurekaClient} 仅支持eureka* {@link EnableDiscoveryClient} 支持范围更广* @description:* @date: 2019-10-15* @author: 十一*/@SpringBootApplicationpublic class Application8081 {public static void main(String[] args) {SpringApplication.run(Application8081.class, args);}}
Eureka 客户端要不要加注解?官方文档
这时候启动Eureka客户端,可以在刚才的Eureka服务端看到以下信息,说明Eureka客户端已经注册成功了。
以上就完成了Eureka服务端和客户端的搭建。
自我保护模式

Self Preservation Mode,官方文档wiki中详细介绍了
默认情况下,EurekaServer 在 90 秒内没有检测到服务列表中的某微服务,则会自动将该微服务从服务列表中删除。但很多情况下并不是该微服务节点出了问题,而是由 于网络抖动等原因使该微服务无法被 EurekaServer 发现,即无法检测到该微服务主机的心跳。 若在短暂时间内网络恢复正常,但由于 EurekaServer 的服务列表中已经没有该微服务,所以该微服务已经无法提供服务了。
在短时间内若 EurekaServer 丢失较多微服务,即 EurekaServer 收到的心跳数量小于阈值, 为了保证系统的可用性(AP),给那些由于网络抖动而被认为宕机的客户端“重新复活”的机会,Eureka 会自动进入自我保护模式,服务列表只可读取、写入,不可执行删除操作。当 EurekaServer 收到的心跳数量恢复到阈值以上时,其会自动退出 Self Preservation 模式。
启动自我保护的阈值因子默认为 0.85,即 85%。即 EurekaServer 收到的心跳数量若小于 应该收到数量的 85%时,会启动自我保护机制。
自我保护模式默认是开启的,可以通过修改 Eureka Server 中配置文件来关闭。但不建议关闭。
自我保护阈值
Renews (续约) threshold: EurekaServer 期望每分钟收到 Clien t端发送的续约的总数。为了计算 这个数,系统会统计从当前时刻开始向前的这 15 分钟内接收到的总续约数(一个瞬时值),例如其为 count。然后再根据阈值因子计算出其阈值续约数 num = count * 0.85, 然后再平均到每分钟即是这个值 Renews threshold = num / 15
Renews (lastmin): EurekaServer 实际在最后一分钟收到的Client端发送的续约的数量。 其也是一个瞬时值。
当 Renews (last min) < Renews threshold 时,会启动自我保护机制。
自我保护参数
服务端参数配置
客户端参数配置
参数配置
Eureka 默认参数可以满足大多数场景,如果需要自定义可以参考官方文档提到的这两个类:EurekaInstanceConfigBean 和 EurekaClientConfigBean 
Eureka Server 集群
真实在用的时候,都是集群环境的。Eureka 集群中的节点是平等关系,每个 Eureka 客户端定期会拉取注册列表信息并缓存到本地,每30秒获取一次。
(集群架构)
**
集群搭建参考这篇博客,最后的结果类似这样
