Eureka高可用集群配置
当注册中心扛不住高并发的时候,就需要用集群来扛,在前面的基础上再新建两个简单的springboot模块(microservice-eureka-server-2002、microservice-eureka-server-2003)
1、统一三个模块的pom依赖
2、在2002跟2003的主启动类MicroserviceEurekaServer2002Application,MicroserviceEurekaServer2003Application加上@EnableEurekaServer注解
3、前面没有配置集群的时候,Eureka注册中心实例的名称是localhost,但现在是集群,不能三个实例都是localhost,这里复杂的办法是搞三个虚拟机,但比较麻烦,这里有简单的办法,直接配置本机hosts文件来实现本机域名映射;找到电脑上的hosts文件,添加配置:
127.0.0.1 eureka2001.test.com
127.0.0.1 eureka2002.test.com
127.0.0.1 eureka2003.test.com
4、修改三个项目的application.yml文件,主要是修改hostname和defaultZone
2001修改成:
server:
port: 2001
context-path: /
eureka:
instance:
hostname: eureka2001.test.com
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka2002.test.com:2002/eureka/,http://eureka2003.test.com:2003/eureka/
2002修改成:
server:
port: 2002
context-path: /
eureka:
instance:
hostname: eureka2002.test.com
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka2001.test.com:2001/eureka/,http://eureka2003.test.com:2003/eureka/
2003修改成:
server:
port: 2003
context-path: /
eureka:
instance:
hostname: eureka2003.test.com # 集群
client:
register-with-eureka: false
service-url:
defaultZone: http://eureka2001.test.com:2001/eureka/,http://eureka2002.test.com:2002/eureka/
5、修改服务提供者项目的application.yml,主要修改eureka.client.service-url.defaultZone
server:
port: 1001
context-path: /
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/demosite1?useUnicode=true&characterEncoding=utf8
username: root
password: root
jpa:
hibernate:
ddl-auto: update
show-sql: true
eureka:
instance:
#eureka客户端主机实例名称
hostname: localhost
#客户端服务名
appname: microservice-student
#客户端实例名称
instance-id: microservice-student:1001
#显示IP
prefer-ip-address: true
client:
service-url:
#把服务注册到eureka注册中心
defaultZone: http://eureka2001.test.com:2001/eureka/,http://eureka2002.test.com:2002/eureka/,http://eureka2003.test.com:2003/eureka/
info:
groupId: com.ue.microservice
artifactId: microservice-student-provider-1001
version: 1.0-SNAPSHOT
负责人: Tom
联系电话: 123456
最后测试下,启动三个注册中心以及服务提供者项目;然后在浏览器地址栏输入:
http://eureka2001.test.com:2001、http://eureka2002.test.com:2002、http://eureka2003.test.com:2003
Eureka集群骚操作
上面的Eureka集群搭建,除了yml文件不一样,其他文件都一样,那么有什么办法能够将多个Eureka服务集合到一个工程中呢?那就是创建一个microservice-eureka-server(三合一)子工程,然后用一个启动类,跑三个不同yml配置的工程
microservice-eureka-server子工程pom依赖:
<?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>com.ue</groupId>
<artifactId>microservice</artifactId>
<version>1.0-SNAPSHOT</version>
</parent>
<artifactId>microservice-eureka-server</artifactId>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</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>
yml配置:
---
server:
port: 2001
context-path: /
eureka:
instance:
hostname: eureka2001.test.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka2002.test.com:2002/eureka/,http://eureka2003.test.com:2003/eureka/
spring:
profiles: eureka2001
---
server:
port: 2002
context-path: /
eureka:
instance:
hostname: eureka2002.test.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka2001.test.com:2001/eureka/,http://eureka2003.test.com:2003/eureka/
spring:
profiles: eureka2002
---
server:
port: 2003
context-path: /
eureka:
instance:
hostname: eureka2003.test.com
client:
register-with-eureka: false
fetch-registry: false
service-url:
defaultZone: http://eureka2001.test.com:2001/eureka/,http://eureka2002.test.com:2002/eureka/
spring:
profiles: eureka2003
启动类MicroserviceEurekaServerApplication.java记得要加上@EnableEurekaServer注解
然后用这个项目的启动类配置多个Run Configuration:
然后把配置的三个Run Configuration跑起来,效果跟普通操作的效果是一致的
Eureka的自我保护机制
在开发环境中,我们经常会遇到这个红色的警告;当我们长时间未访问服务以及变更服务实例名称的时候,就会出现这个红色的警告;因为默认情况,如果服务注册中心在一段时间内没有接收到某个微服务实例的心跳,那服务注册中心会注销该实例(默认90秒)
由于正式环境,经常会有网络故障,网络延迟等问题发生,服务和注册中心无法正常通信,此时服务是正常的,不应该注销该服务,Eureka这时候就会通过“自我保护模式”来解决问题,当短时间和服务失去通信时,会保留服务信息,当恢复网络和通信时,再退出“自我保护模式”;通过“自我保护模式”,使Eureka集群更加的健壮和稳定
综上,Eureka的自我保护特性主要用于减少在网络分区或者不稳定状况下的不一致性问题