目录
一、背景
上文我们采用 主机名 的方式搭建了集群的方式,本文我们讲讲怎么通过 IP 方式来搭建 Eureka 集群 ,比如测试环境或者生产环境。我这里还是规划三台 Eureka 服务
IP地址 | 端口 |
---|---|
10.130.3.66 | 8761 |
10.130.3.111 | 8761 |
10.130.3.222 | 8761 |
二、maven依赖
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>cn.alian.microservice</groupId>
<artifactId>parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>discovery-service</artifactId>
<version>1.0.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>discovery-service</name>
<description>服务注册与发现集群之IP方式</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
和单节点一样,也没有变化。
三、Eureka服务主类
DiscoveryApplication.java
package cn.alian.microservice.discovery;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer;
@EnableEurekaServer
@SpringBootApplication
public class DiscoveryApplication {
public static void main(String[] args) {
SpringApplication.run(DiscoveryApplication.class, args);
}
}
和单节点一样,也没有变化。
四、Eureka服务配置
application.properties
#服务名
spring.application.name=discovery-service
#端口
server.port=8761
#注册时使用ip而不是主机名
eureka.instance.prefer-ip-address=true
#指定此实例的ip
eureka.instance.ip-address=10.130.3.66
#实例id
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
#服务1注册到服务2和服务3中
eureka.client.service-url.defaultZone=http://10.130.3.111:8761/eureka/,http://10.130.3.222:8763/eureka/
#连接Eureka Server的超时时间,单位:秒
eureka.client.eureka-server-connect-timeout-seconds=20
#用于指示Eureka客户端已启用的标志
eureka.client.enabled=true
#客户端是否获取eureka服务器注册表上的注册信息,默认为true
eureka.client.fetch-registry=true
#指示此实例是否应将其信息注册到eureka服务器以供其他服务发现,默认为false
eureka.client.register-with-eureka=true
#启用自我保护机制,默认为true,
#为false时控制台提示(THE SELF PRESERVATION MODE IS TURNED OFF. THIS MAY NOT PROTECT INSTANCE EXPIRY IN CASE OF NETWORK/OTHER PROBLEMS.)
eureka.server.enable-self-preservation=false
# eureka的阈值(默认值)是0.85(当注册在eureka中的正常服务占比低于85%时会开启eureka的自我保护)
# 也就是说Eureka Server在运行期间会去统计心跳失败比例在 15 分钟之内是否低于 85%,如果低于 85%,Eureka Server 会将这些实例保护起来,让这些实例不会过期
#每分钟需要收到的续约次数阈值(心跳数/client实例数)
eureka.server.renewal-percent-threshold=0.85
#清除无效服务实例的时间间隔(ms),默认1分钟
eureka.server.eviction-interval-timer-in-ms=30000
#是否从readonly(只读缓存)中读取实例(默认是true)
eureka.server.use-read-only-response-cache=false
#读超时时间
eureka.server.peer-node-read-timeout-ms=60000
#部署时配置加上
#logging.config=config/logback.xml
上面这个是 10.130.3.66 的配置,三台服务配置的区别主要是 eureka.instance.ip-address 和 eureka.client.service-url.defaultZone 不同。
第二台服务: 10.130.3.111 对应的配置如下:
#指定此实例的ip
eureka.instance.ip-address=10.130.3.111
#服务2注册到服务1和服务3中
eureka.client.service-url.defaultZone=http://10.130.3.66:8761/eureka/,http://10.130.3.222:8763/eureka/
第三台服务: 10.130.3.222 对应的配置如下:
#指定此实例的ip
eureka.instance.ip-address=10.130.3.222
#服务3注册到服务1和服务2中
eureka.client.service-url.defaultZone=http://10.130.3.66:8761/eureka/,http://10.130.3.111:8761/eureka/
我们需要注意的是任意一台 Eureka 服务 ,都要注册其他 Eureka 服务 上,(比如 10.130.3.66 会注册到 http://10.130.3.111:8761/eureka/ 和 http://10.130.3.222:8763/eureka/ )不要只注册一台,因为这样达不到高可用,因为只注册一台,有可能刚好那台服务挂了。
五、启动服务
5.1 服务1效果图(10.130.3.66)
5.2 服务2效果图(10.130.3.111)
5.3 服务3效果图(10.130.3.222)
从上面的效果图上来看,每个 Eureka服务 都注册到其他 Eureka 服务上了,都能看到其他的副本 Replicas ,并且没有出现 unavailable-replicas ,说明我们的集群搭建成功了。
六、验证
同样的假设我们有个新的支付系统,我们用最简单的方式注册进去,因为我们是三个服务,那么注册地址还是那三台 Eureka 服务的地址:
eureka.client.serviceUrl.defaultZone=http://10.130.3.66:8761/eureka/,http://10.130.3.111:8761/eureka/,http://10.130.3.222:8761/eureka/
6.1、支付系统pom文件
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>cn.alian.microservice</groupId>
<artifactId>parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<groupId>cn.alian.mall</groupId>
<artifactId>pay</artifactId>
<version>1.0.0-SNAPSHOT</version>
<name>pay</name>
<description>pay</description>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--注册中心-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
</dependencies>
</project>
和上文一样没有变化。
6.2、支付系统配置
application.properties
#服务名
spring.application.name=pay
#端口
server.port=9001
#服务注册地址
eureka.client.serviceUrl.defaultZone=http://10.130.3.66:8761/eureka/,http://10.130.3.111:8761/eureka/,http://10.130.3.222:8761/eureka/
#注册时使用ip而不是主机名
eureka.instance.prefer-ip-address=true
#指定此实例的ip
eureka.instance.ip-address=10.130.3.88
#实例id
eureka.instance.instance-id=${spring.application.name}:${spring.cloud.client.ip-address}:${server.port}
6.3、支付系统主类配置
主类上加上注解: @EnableDiscoveryClient ,此类具体路径: org.springframework.cloud.client.discovery.EnableDiscoveryClient
package cn.alian.mall.pay;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@EnableDiscoveryClient
@SpringBootApplication
public class PayApplication {
public static void main(String[] args) {
SpringApplication.run(PayApplication.class, args);
}
}
我们通过浏览器依次访问:
- http://10.130.3.66:8761/
- http://10.130.3.111:8761/
- http://10.130.3.222:8761/
结果如下:
七、总结
- Eureka集群 中 Eureka Server 的 spring.application.name 的值要一致
- eureka.client.register-with-eureka 和 eureka.client.fetch-registry 的值都要设置为true
- eureka.instance.prefer-ip-address 的值要设置为true,当它为true时,代表使用ip地址的形式来定义注册中心的地址,而不使用主机名
- eureka.instance.ip-address 指定实例的ip
- eureka.instance.instance-id 可以自定义实例id比如:应用名-ip地址-端口port
- eureka.client.service-url.defaultZone 就是把当前实例注册到哪里,任意一台Eureka 服务,都要注册其他Eureka 服务上来保证高可用