前言
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: 8000
eureka:
instance:
# Eureka主机名称
hostname: localhost
client:
# 是否向注册中心注册,不需要,自己就是服务中心
register-with-eureka: false
# 指定此客户端是否能获取Eureka的注册信息
fetch-registry: false
# 暴露服务中心地址,客户端通过这个地址进行访问
service-url:
# 使用${}可以获取当前配置文件中的变量参数,此处等价于:http://localhost:8000/eureka
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka
启动类
/**
* @EnableEurekaServer 开启Eureka服务
*/
@SpringBootApplication
@EnableEurekaServer
public 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: 8081
eureka:
client:
service-url:
# 指定要连接的Eureka服务中心地址
defaultZone: http://localhost:8000/eureka
# 该服务在注册中心中的名称
instance:
instance-id: msc-provider-depart-8081
spring:
application:
# 该微服务名称
name: msc-provider-depart
# 使用jpa,是否自动创建表
jpa:
generate-ddl: true
# 配置数据源
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf8
username: root
password: root
# 配置 actuator,添加该应用详细信息
info:
auth: Eleven
app.name: ${spring.application.name}
company.name: www.eleven.cn
company.addr: hangzhou china
# 配置日志
logging:
pattern:
console: level-%level %msg%n
level:
root: info
org.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: trace
com.abc.provider: debug
启动类
/**
* eureka 客户端,可以加下列注解,也可以不加,会自动注册到eureka服务中心
* {@link EnableEurekaClient} 仅支持eureka
* {@link EnableDiscoveryClient} 支持范围更广
* @description:
* @date: 2019-10-15
* @author: 十一
*/
@SpringBootApplication
public 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秒获取一次。
(集群架构)
**
集群搭建参考这篇博客,最后的结果类似这样