在生产应用中,服务注册中心作为核心组件,一般会进行集群配置成高可用模式。
下面将对2个实例,3个实例的方式进行简介。
使用的版本情况如下
1.spring boot
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.4.RELEASE</version>
2.spring cloud
<spring-cloud.version>Finchley.RELEASE</spring-cloud.version>
一、两个实例的情况
两个eureka实例,实现相互注册,部署到同一台服务器或不同服务器上,已基本能满足要求不高的生产使用。
下面对两个实例,相互注册实现高可用的情况进行简介
1.首先,修改yml文件
我们在原有的yml文件基础上,新建两个跟实例启动相关的子文件,如分别命名为
application-peer1.yml,application-peer2.yml (后面的label可随意,但是要跟后面hosts文件添加的一致)
其中application-peer1.yml内容为
spring:
application:
name: eureka-server
profiles: peer1
cloud:
client:
ipAddress: 127.0.0.1
server:
port: 8761
eureka:
instance:
hostname: peer1
lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒)
lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
prefer-ip-address: false
instance-id: ${spring.cloud.client.ipAddress}:${server.port} #使在eureka监控界面看到的实例为ip+port形式
appname: eureka-server #这里要跟‘spring.application.name’一致,还有‘prefer-ip-address’为false,同时开启自身注册,‘available-replicas’有效副本才不为空
client:
serviceUrl:
#以下测试高可用的配置--两个server相互注册
defaultZone: http://peer2:8762/eureka/ #这里使用‘defaultZone’监控页面DS Replicas显示的是‘peer1’,使用‘default-zone’显示‘localhost’
# register-with-eureka: false #是否注册到自身服务端,默认为true,高可用需要注册到本身
# fetch-registry: false #是否从服务器拉取注册信息,默认为true
#生产环境需要注释下面的配置,开启自我保护;
server:
enable-self-preservation: false #关闭自我保护模式(缺省为打开)
eviction-interval-timer-in-ms: 10000 #续期时间,清理无效服务的时间间隔,默认是60*1000
application-peer2.yml内容为
spring:
application:
name: eureka-server
profiles: peer2
cloud:
client:
ipAddress: 127.0.0.1
server:
port: 8762
eureka:
instance:
hostname: peer2
lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒)
lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
prefer-ip-address: false
instance-id: ${spring.cloud.client.ipAddress}:${server.port} #使在eureka监控界面看到的实例为ip+port形式
appname: eureka-server #这里要跟‘spring.application.name’一致,还有‘prefer-ip-address’为false,同时开启自身注册,‘available-replicas’有效副本才不为空
client:
serviceUrl:
#以下测试高可用的配置--两个server相互注册
defaultZone: http://peer1:8761/eureka/ #这里使用‘defaultZone’监控页面DS Replicas显示的是‘peer1’,使用‘default-zone’显示‘localhost’
# register-with-eureka: false #是否注册到自身服务端,默认为true,高可用需要注册到本身
# fetch-registry: false #是否从服务器拉取注册信息,默认为true
#生产环境需要注释下面的配置,开启自我保护;
server:
enable-self-preservation: false #关闭自我保护模式(缺省为打开)
eviction-interval-timer-in-ms: 10000 #续期时间,清理无效服务的时间间隔,默认是60*1000
从以上的yml配置文件可见,peer1和peer2在‘eureka:client:serviceUrl:defaultZone’中,使用了另一个服务中心的ip+port地址,即注册到另一个服务上。
同时需要注意,要开启服务注册到本身
2.修改Linux或者window的hosts文件,添加以下语句
注意这里的‘peer1,peer2’要跟第1点中配置的文件名和spring.profile.active一致
127.0.0.1 peer1
127.0.0.1 peer2
hosts文件路径:
Linux的路径是:etc/hosts,
Window路径是:C:\Windows\System32\drivers\etc (win10 64位)
3.修改eureka-client的yml文件,添加多实例的注册
配置好服务中心yml文件和hosts文件后,接下来就是修改每个eureka-client的配置文件了
在此,需要把每个eureka-server的URL都写入‘eureka:client:serviceUrl:defaultZone’,这样才能保证某个eureka-server挂掉后,
仍然能注册到另一个,实现高可用
yml配置文件如
server:
port: 8700
spring:
application:
name: service-hello
cloud:
client:
ipAddress: 127.0.0.1 #指定client的IP
eureka:
client:
service-url:
# defaultZone: http://localhost:8761/eureka/
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
#服务实例使用 ip+port的方式访问
instance:
hostname: ${spring.cloud.client.ipAddress}
prefer-ip-address: true
instance-id: ${spring.cloud.client.ipAddress}:${server.port}
lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒)
lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
4.配置启动实例
- window的IDEA上启动
在IDEA的启动配置里面,即configuration,通过复制的方式,创建出同一个服务的多个实例
并且,修改每个实例的’program arguments‘栏目,根据端口号相应的填上‘--spring.profiles.active=peer1’,‘--spring.profiles.active=peer2’
如图
接着点击对应的configuration启动实例,打开浏览器输入eureka对应的监控URL即可看到结果,图示如下
- 部署到Linux服务器上
在Linux上直接运行jar包,以命令 ‘java -jar xxx.jar --spring.profiles.active=peer1’执行相应jar包即可
如
[root@localhost springCloud]# java -jar eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
启动后,在浏览器输入URL即可看到相应结果,图示如下
peer1的界面
peer2的界面
5.到此,基本完成了高可用的配置,接着就是检验高可用效果了。
打开各个eureka-client,观察注册到各个服务中心的情况,并试着调用API,看服务间访问正常否。
然后中断其中一个eureka-server,观察另一个eureka-server的instance变化,接着继续调用API,观察服务间调用是否正常。
假如都没问题,则证明两点式高可用配置正式生效
中断一个peer1后,peer2图示:
三、3个实例,两两相互注册的情况
2个实例的情况,在面对复杂生产环境时是性能不够的,这时通常需要3个或以上的注册中心来实现更高性能的高可用。
3个实例的实现方式跟2个实例的方式差不多,区别主要在于eureka-server相互注册的URL多了,eureka-client注册到服务中心
的URL也变多了,同时相应的修改hosts文件即可。
在此,不做详细的描述,3个或以上,只需要修改下面几个文件,其他是一样的
1.创建更多的yml文件
如创建 application-peer1.yml,application-peer2.yml,application-peer3.yml,application-peer4.yml,...
文件内容修改如
application-peer1.yml
spring:
application:
name: eureka-server
profiles: peer1
cloud:
client:
ipAddress: 127.0.0.1
server:
port: 8761
eureka:
instance:
hostname: peer1
lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒)
lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
prefer-ip-address: false
instance-id: ${spring.cloud.client.ipAddress}:${server.port} #使在eureka监控界面看到的实例为ip+port形式
appname: eureka-server #这里要跟‘spring.application.name’一致,还有‘prefer-ip-address’为false,同时开启自身注册,‘available-replicas’有效副本才不为空
client:
serviceUrl:
#以下测试高可用的配置--两个server相互注册
defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/ #把自身以外的server的url都填上,实现两两注册
# register-with-eureka: false #是否注册到自身服务端,默认为true,高可用需要注册到本身
# fetch-registry: false #是否从服务器拉取注册信息,默认为true
#生产环境需要注释下面的配置,开启自我保护;
server:
enable-self-preservation: false #关闭自我保护模式(缺省为打开)
eviction-interval-timer-in-ms: 10000 #续期时间,清理无效服务的时间间隔,默认是60*1000
其他yml文件也是如此
2.修改hosts文件,添加更多的hostname
如
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
...
3.修改eureka-client的yml文件,添加多实例的注册中心
server:
port: 8700
spring:
application:
name: service-hello
cloud:
client:
ipAddress: 127.0.0.1 #指定client的IP
eureka:
client:
service-url:
# defaultZone: http://localhost:8761/eureka/
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/,http://peer3:8763/eureka/ #把所有的eureka-server的url都填入
#服务实例使用 ip+port的方式访问
instance:
hostname: ${spring.cloud.client.ipAddress}
prefer-ip-address: true
instance-id: ${spring.cloud.client.ipAddress}:${server.port}
lease-expiration-duration-in-seconds: 30 #续约到期时间(默认90秒)
lease-renewal-interval-in-seconds: 10 #续约更新时间间隔(默认30秒),使得eureka及时剔除无效服务
4.后面的内容基本跟2个实例的时候一致,只是数量更改下,不再叙述。
四、在eureka监控界面,看到有效副本为空时,通常都是不满足下面3个要求导致的
1.'eureka.instance.appname'与'spring.application.name’不一致
2.‘eureka.instance.preferIpAddress’为true
3.没有开启注册到自身。
以上情况,在yml文件的注释中都有说明。
以上内容,都经过本人的运行验证,可能有细节被忽视没做描述,欢迎指正。