前言

Spring的东西一大特点就是文档特别全,有疑问查询官方文档估计能解决一大部分问。

搭建Eureka服务端

可以直接在idea中创建,或者在https://start.spring.io/中创建。

pom.xml依赖

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.9.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>cn.eleven.springcloud</groupId>
  12. <artifactId>eurekaserver-8000</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>00-eurekaserver-8000</name>
  15. <description>Demo project for Spring Boot</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <!--要和SpringBoot的版本对应-->
  19. <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.cloud</groupId>
  24. <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-autoconfigure</artifactId>
  29. </dependency>
  30. <dependency>
  31. <groupId>org.projectlombok</groupId>
  32. <artifactId>lombok</artifactId>
  33. <optional>true</optional>
  34. </dependency>
  35. <dependency>
  36. <groupId>org.springframework.boot</groupId>
  37. <artifactId>spring-boot-starter-test</artifactId>
  38. <scope>test</scope>
  39. </dependency>
  40. </dependencies>
  41. <dependencyManagement>
  42. <dependencies>
  43. <dependency>
  44. <groupId>org.springframework.cloud</groupId>
  45. <artifactId>spring-cloud-dependencies</artifactId>
  46. <version>${spring-cloud.version}</version>
  47. <type>pom</type>
  48. <scope>import</scope>
  49. </dependency>
  50. </dependencies>
  51. </dependencyManagement>
  52. <build>
  53. <plugins>
  54. <plugin>
  55. <groupId>org.springframework.boot</groupId>
  56. <artifactId>spring-boot-maven-plugin</artifactId>
  57. </plugin>
  58. </plugins>
  59. </build>
  60. </project>

application.yml 配置

  1. server:
  2. port: 8000
  3. eureka:
  4. instance:
  5. # Eureka主机名称
  6. hostname: localhost
  7. client:
  8. # 是否向注册中心注册,不需要,自己就是服务中心
  9. register-with-eureka: false
  10. # 指定此客户端是否能获取Eureka的注册信息
  11. fetch-registry: false
  12. # 暴露服务中心地址,客户端通过这个地址进行访问
  13. service-url:
  14. # 使用${}可以获取当前配置文件中的变量参数,此处等价于:http://localhost:8000/eureka
  15. defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka

启动类

  1. /**
  2. * @EnableEurekaServer 开启Eureka服务
  3. */
  4. @SpringBootApplication
  5. @EnableEurekaServer
  6. public class Application {
  7. public static void main(String[] args) {
  8. SpringApplication.run(Application.class, args);
  9. }
  10. }

启动成功在页面输入 http://localhost:8080/ ,可以看到该界面,这就完成了Eureka的服务中心
image.png

搭建Eureka客户端

创建方法一样,修改pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <parent>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-parent</artifactId>
  8. <version>2.1.9.RELEASE</version>
  9. <relativePath/> <!-- lookup parent from repository -->
  10. </parent>
  11. <groupId>cn.eleven.springcloud</groupId>
  12. <artifactId>provider-8081</artifactId>
  13. <version>0.0.1-SNAPSHOT</version>
  14. <name>02-provider-8081</name>
  15. <description>提供者</description>
  16. <properties>
  17. <java.version>1.8</java.version>
  18. <!--要和SpringBoot的版本对应-->
  19. <spring-cloud.version>Greenwich.SR1</spring-cloud.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.projectlombok</groupId>
  24. <artifactId>lombok</artifactId>
  25. <optional>true</optional>
  26. </dependency>
  27. <dependency>
  28. <groupId>org.springframework.boot</groupId>
  29. <artifactId>spring-boot-starter-test</artifactId>
  30. <scope>test</scope>
  31. </dependency>
  32. <dependency>
  33. <groupId>com.alibaba</groupId>
  34. <artifactId>druid</artifactId>
  35. <version>1.1.10</version>
  36. </dependency>
  37. <dependency>
  38. <groupId>mysql</groupId>
  39. <artifactId>mysql-connector-java</artifactId>
  40. <version>5.1.47</version>
  41. </dependency>
  42. <dependency>
  43. <groupId>org.springframework.boot</groupId>
  44. <artifactId>spring-boot-starter-web</artifactId>
  45. </dependency>
  46. <dependency>
  47. <groupId>org.springframework.boot</groupId>
  48. <artifactId>spring-boot-starter-data-jpa</artifactId>
  49. </dependency>
  50. <!-- eureka-client -->
  51. <dependency>
  52. <groupId>org.springframework.cloud</groupId>
  53. <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
  54. </dependency>
  55. <dependency>
  56. <groupId>org.springframework.boot</groupId>
  57. <artifactId>spring-boot-starter-actuator</artifactId>
  58. </dependency>
  59. </dependencies>
  60. <dependencyManagement>
  61. <dependencies>
  62. <dependency>
  63. <groupId>org.springframework.cloud</groupId>
  64. <artifactId>spring-cloud-dependencies</artifactId>
  65. <version>${spring-cloud.version}</version>
  66. <type>pom</type>
  67. <scope>import</scope>
  68. </dependency>
  69. </dependencies>
  70. </dependencyManagement>
  71. <build>
  72. <plugins>
  73. <plugin>
  74. <groupId>org.springframework.boot</groupId>
  75. <artifactId>spring-boot-maven-plugin</artifactId>
  76. </plugin>
  77. </plugins>
  78. </build>
  79. </project>

application.yml 配置

  1. server:
  2. port: 8081
  3. eureka:
  4. client:
  5. service-url:
  6. # 指定要连接的Eureka服务中心地址
  7. defaultZone: http://localhost:8000/eureka
  8. # 该服务在注册中心中的名称
  9. instance:
  10. instance-id: msc-provider-depart-8081
  11. spring:
  12. application:
  13. # 该微服务名称
  14. name: msc-provider-depart
  15. # 使用jpa,是否自动创建表
  16. jpa:
  17. generate-ddl: true
  18. # 配置数据源
  19. datasource:
  20. type: com.alibaba.druid.pool.DruidDataSource
  21. driver-class-name: com.mysql.jdbc.Driver
  22. url: jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf8
  23. username: root
  24. password: root
  25. # 配置 actuator,添加该应用详细信息
  26. info:
  27. auth: Eleven
  28. app.name: ${spring.application.name}
  29. company.name: www.eleven.cn
  30. company.addr: hangzhou china
  31. # 配置日志
  32. logging:
  33. pattern:
  34. console: level-%level %msg%n
  35. level:
  36. root: info
  37. org.hibernate: info
  38. # 指定spring.jpa.show-sqltrue时,是否显示动态参数值
  39. org.hibernate.type.descriptor.sql.BasicBinder: trace
  40. # 指定spring.jpa.show-sqltrue时,是否显示查询语句的查询结果
  41. org.hibernate.type.descriptor.sql.BasicExtractor: trace
  42. com.abc.provider: debug

启动类

  1. /**
  2. * eureka 客户端,可以加下列注解,也可以不加,会自动注册到eureka服务中心
  3. * {@link EnableEurekaClient} 仅支持eureka
  4. * {@link EnableDiscoveryClient} 支持范围更广
  5. * @description:
  6. * @date: 2019-10-15
  7. * @author: 十一
  8. */
  9. @SpringBootApplication
  10. public class Application8081 {
  11. public static void main(String[] args) {
  12. SpringApplication.run(Application8081.class, args);
  13. }
  14. }

Eureka 客户端要不要加注解?官方文档
image.png

这时候启动Eureka客户端,可以在刚才的Eureka服务端看到以下信息,说明Eureka客户端已经注册成功了。
image.png

以上就完成了Eureka服务端和客户端的搭建。

自我保护模式

image.png

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 时,会启动自我保护机制。

自我保护参数

服务端参数配置
image.png

客户端参数配置
image.png

参数配置

Eureka 默认参数可以满足大多数场景,如果需要自定义可以参考官方文档提到的这两个类:EurekaInstanceConfigBeanEurekaClientConfigBean
image.png

Eureka Server 集群

真实在用的时候,都是集群环境的。Eureka 集群中的节点是平等关系,每个 Eureka 客户端定期会拉取注册列表信息并缓存到本地,每30秒获取一次。
image.png
(集群架构)
**
集群搭建参考这篇博客,最后的结果类似这样
image.png

参考资料