admin管理员组文章数量:1631685
目录
- 一、背景
- 二、maven依赖
- 三、主类
- 四、Eureka服务配置
- 五、启动服务
- 5.1 服务1效果图(eureka-server1)
- 5.2 服务2效果图(eureka-server2)
- 5.3 服务3效果图(eureka-server3)
- 六、验证
- 6.1、pom文件
- 6.2、支付系统配置
- 6.3、主类配置
- 七、总结
一、背景
我们之前的 Spring Cloud 服务采用的都是 单节点 ,一个是因为想简单的给大家演示整个 Spring Cloud 的架构思路,另外一个是微服务确实挺占用服务器的,尤其是生产环境上,不可预测的因素会很多,都要求我们整个服务是高性能,高并发,高可用的,所以集群就扮演了一个很重要的角色。从我们这些项目来看,服务发现与注册中心,配置中心,网关中心都是比较重要的环节,单节点架构环境下,只要一个挂了就会影响绝大部分的业务。我们使用的是 Eureka ,先看看它是怎么样来实现 Eureka 集群 的,需要注意的是,我用的windows的开发环境,来开始改造我们 Eureka 服务端 。
由于资源问题,我这里就规划三台 Eureka服务 。
服务器IP地址 | 主机名 | 端口 |
---|---|---|
10.130.3.111 | eureka-server1 | 8761 |
10.130.3.222 | eureka-server2 | 8761 |
10.130.3.66 | eureka-server3 | 8761 |
接下里就在服务 10.130.3.111 、 10.130.3.222 和 10.130.3.66 上分别修改hosts文件( 记得是部署Eureka服务的机器哦),具体的路径是: C:\Windows\System32\drivers\etc\hosts (可以使用Notepad++修改)
#Eureka要为域名形式
10.130.3.111 eureka-server1
10.130.3.222 eureka-server2
10.130.3.66 eureka-server3
这里需要注意的是本文是要配置 Eureka的实例的主机名 , defaultZone 中是以域名的方式向注册中心注册的,所以这里需要使用域名。后面我也会讲怎么使用 IP 的方式进行集群。
二、maven依赖
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/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>服务注册与发现之集群</description>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies>
</project>
和单节点一样,也没有什么变化。
三、主类
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
#实例名称
eureka.instance.hostname=eureka-server1
#为true时使用ip而不是主机名,这里必须使用主机名
eureka.instance.ip-address=false
#服务1注册到服务2和服务3中
eureka.client.service-url.defaultZone=http://eureka-server2:8762/eureka,http://eureka-server3: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
上面这个是 eureka-server1配置,另外两台服务的配置区别在于三个参数不同分别是:
- server.port (本文都是8761)
- eureka.instance.hostname
- eureka.client.service-url.defaultZone
eureka-server2对应的配置如下:
#端口
server.port=8762
#实例名称
eureka.instance.hostname=eureka-server2
#服务2注册到服务1和服务3中
eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server3:8763/eureka/
eureka-server3对应的配置如下:
#端口
server.port=8763
#实例名称
eureka.instance.hostname=eureka-server3
#服务3注册到服务1和服务2中
eureka.client.service-url.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/
最后需要注意的是 eureka.instance.hostname 的值要和我们配置到本机hosts的值要对应。然后就是任意一台 Eureka服务 ,都要注册其他 Eureka服务 上,不要只注册一台,因为这样达不到高可用,因为只注册一台,有可能刚好那台服务挂了。
五、启动服务
5.1 服务1效果图(eureka-server1)
5.2 服务2效果图(eureka-server2)
5.3 服务3效果图(eureka-server3)
从上面的效果图上来看,每个 Eureka 服务都注册到其他 Eureka 服务上了, DS Replicas 就是当前实例的副本,我们也可以看到每个服务上都有三个注册信息,并且也没有出现 unavailable-replicas ,这个是很关键的哦。
六、验证
现在集群已经搭建好了,我们集群的地址就是三台 Eureka服务 的地址:
#eureka服务注册地址
eureka.client.serviceUrl.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/,http://eureka-server3:8763/eureka/
假设我们有个新的支付系统,我们用最简单的方式注册进去,一起看看效果。
6.1、pom文件
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache/POM/4.0.0" xmlns:xsi="http://www.w3/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache/POM/4.0.0 https://maven.apache/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服务注册地址
eureka.client.serviceUrl.defaultZone=http://eureka-server1:8761/eureka/,http://eureka-server2:8762/eureka/,http://eureka-server3:8763/eureka/
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://eureka-server1:8761/
- http://eureka-server2:8762/
- http://eureka-server3:8763/
结果如下:
七、总结
- Eureka集群 中 Eureka Server 的 spring.application.name 的值要一致
- 每个 Eureka Server 节点要配置 eureka.instance.hostname ,各节点的 hostname 必须是各自的主机名;开发环境下,一定要和电脑中的hosts( C:\Windows\System32\drivers\etc\hosts )文件中的配置一样
- eureka.client.register-with-eureka 和 eureka.client.fetch-registry 的值都要设置为true
- eureka.client.service-url.defaultZone 后面的eureka注册中心的地址尽量写成域名(不是域名也可以比如:eureka1,eureka2,eureka3),但是在 Eureka Server 中 eureka.client.service-url.defaultZone 不能写具体的ip(即使你的ip没有错比如 http://10.130.3.111:8761/eureka/ 、 http://10.130.3.111:8762/eureka/ 或 http://10.130.3.222:8763/eureka/ ),不然会出现 unavailable-replicas ,因为是以主机名的方式向注册中心注册的
- 理解上一点这一点就很好理解了, eureka.instance.prefer-ip-address 的值要设置为false,这也是它的默认值,当它为true时,代表使用ip地址的形式来定义注册中心的地址,而不使用主机名
版权声明:本文标题:(十六)Alian 的 Spring Cloud Eureka 集群配置(主机名方式) 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/xitong/1729099246a1186478.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论