分区
对于一个用户量比较大或者地理位置分布范围很广的项目。跨地区调用时,延时比较大。我们可以通过同一个机房的服务优先调用同一个机房的服务,当本机房的服务不可用的时候,才会调用其他机房的服务。
Eureka中的分区概念
eureka提供了region和zone两个概念。
- region: 地区。比如亚洲地区,欧洲地区。
- zone: region内的某个机房。
我的使用案例
几个同事一起开发一个项目,服务数量比较多,本机开发,启动所有服务,机器会比较卡。我就考虑大家集中注册到一个eureka中,但是这样服务就会互相干扰。但是分区这种配置正好符合我的场景。
我们使用调试服务的时候,就在自己的机器上启动对应服务,进行调试,这样会调用自己的服务。
而调用正常的服务的时候,只要有一个人启动服务,就可以了。我们其他人就也可以调用了。
搭建实例代码
- application-peer.yml
spring:
application:
# 指定应用的名称
name: fxb-eureka-superman
server:
port: ${eureka_port:8760}
eureka:
instance:
hostname: fxb-eureka-peer0
# 更趋向IP地址
prefer-ip-address: true
# status-page-url-path: /actuator/info
# health-check-url-path: /actuator/health
secure-virtual-host-name: fxb.com
virtual-host-name: moyang.com
metadata-map:
zone: superman
client:
service-url:
wangxiyue: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER1:fxb-eureka-peer1}:8761/eureka
lipu_f: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER2:fxb-eureka-peer2}:8762/eureka
fengtiecheng: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER3:fxb-eureka-peer3}:8763/eureka
wangxiaowei_dev: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER4:fxb-eureka-peer4}:8764/eureka
superman: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER0:fxb-eureka-peer0}:8760/eureka
# eureka client 刷新本地刷新时间,默认30s
registry-fetch-interval-seconds: 5
register-with-eureka: true
fetch-registry: true
# 更趋向同一zone的eureka
prefer-same-zone-eureka: true
region: beijing
availability-zones:
beijing: wangxiyue,superman,lipu_f,fengtiecheng,wangxiaowei_dev
server:
# eureka server 刷新read cache Map 的时间
# 注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30秒
response-cache-update-interval-ms: 30000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
response-cache-auto-expiration-in-seconds: 180
# 启动主动失效,并且每次主动失效检测时间间隔为3s
eviction-interval-timer-in-ms: 3000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logging:
level:
root: INFO
- application-peer1.yml
spring:
application:
# 指定应用的名称
name: fxb-eureka-wangxiyue
server:
port: ${eureka_port:8761}
eureka:
instance:
hostname: fxb-eureka-peer1
# 更趋向IP地址
prefer-ip-address: true
# status-page-url-path: /actuator/info
# health-check-url-path: /actuator/health
secure-virtual-host-name: fxb.com
virtual-host-name: moyang.com
metadata-map:
zone: wangxiyue
client:
service-url:
superman: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER0:fxb-eureka-peer0}:8760/eureka
wangxiyue: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER1:fxb-eureka-peer1}:8761/eureka
lipu_f: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER2:fxb-eureka-peer2}:8762/eureka
fengtiecheng: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER3:fxb-eureka-peer3}:8763/eureka
wangxiaowei_dev: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER4:fxb-eureka-peer4}:8764/eureka
# eureka client 刷新本地刷新时间,默认30s
registry-fetch-interval-seconds: 5
register-with-eureka: true
fetch-registry: true
# 更趋向同一zone的eureka
prefer-same-zone-eureka: true
region: beijing
availability-zones:
beijing: superman,wangxiyue,lipu_f,fengtiecheng,wangxiaowei_dev
server:
# eureka server 刷新read cache Map 的时间
# 注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30秒
response-cache-update-interval-ms: 30000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
response-cache-auto-expiration-in-seconds: 180
# 启动主动失效,并且每次主动失效检测时间间隔为3s
eviction-interval-timer-in-ms: 3000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logging:
level:
root: INFO
- application-peer2.yml
spring:
application:
# 指定应用的名称
name: fxb-eureka-lipu_f
server:
port: ${eureka_port:8762}
eureka:
instance:
hostname: fxb-eureka-peer2
# 更趋向IP地址
prefer-ip-address: true
# status-page-url-path: /actuator/info
# health-check-url-path: /actuator/health
secure-virtual-host-name: fxb.com
virtual-host-name: moyang.com
metadata-map:
zone: lipu_f
client:
service-url:
superman: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER0:fxb-eureka-peer0}:8760/eureka
wangxiyue: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER1:fxb-eureka-peer1}:8761/eureka
lipu_f: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER2:fxb-eureka-peer2}:8762/eureka
fengtiecheng: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER3:fxb-eureka-peer3}:8763/eureka
wangxiaowei_dev: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER4:fxb-eureka-peer4}:8764/eureka
# eureka client 刷新本地刷新时间,默认30s
registry-fetch-interval-seconds: 5
register-with-eureka: true
fetch-registry: true
# 更趋向同一zone的eureka
prefer-same-zone-eureka: true
region: beijing
availability-zones:
beijing: wangxiyue,superman,lipu_f,fengtiecheng,wangxiaowei_dev
server:
# eureka server 刷新read cache Map 的时间
# 注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30秒
response-cache-update-interval-ms: 30000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
response-cache-auto-expiration-in-seconds: 180
# 启动主动失效,并且每次主动失效检测时间间隔为3s
eviction-interval-timer-in-ms: 3000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logging:
level:
root: INFO
- application-peer3.yml
spring:
application:
# 指定应用的名称
name: fxb-eureka-fengtiecheng
server:
port: ${eureka_port:8763}
eureka:
instance:
hostname: fxb-eureka-peer3
# 更趋向IP地址
prefer-ip-address: true
# status-page-url-path: /actuator/info
# health-check-url-path: /actuator/health
secure-virtual-host-name: fxb.com
virtual-host-name: moyang.com
metadata-map:
zone: fengtiecheng
client:
service-url:
superman: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER0:fxb-eureka-peer0}:8760/eureka
wangxiyue: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER1:fxb-eureka-peer1}:8761/eureka
lipu_f: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER2:fxb-eureka-peer2}:8762/eureka
fengtiecheng: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER3:fxb-eureka-peer3}:8763/eureka
wangxiaowei_dev: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER4:fxb-eureka-peer4}:8764/eureka
# eureka client 刷新本地刷新时间,默认30s
registry-fetch-interval-seconds: 5
register-with-eureka: true
fetch-registry: true
# 更趋向同一zone的eureka
prefer-same-zone-eureka: true
region: beijing
availability-zones:
beijing: lipu_f,superman,wangxiyue,fengtiecheng,wangxiaowei_dev
server:
# eureka server 刷新read cache Map 的时间
# 注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30秒
response-cache-update-interval-ms: 30000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
response-cache-auto-expiration-in-seconds: 180
# 启动主动失效,并且每次主动失效检测时间间隔为3s
eviction-interval-timer-in-ms: 3000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logging:
level:
root: INFO
- application-peer4.yml
spring:
application:
# 指定应用的名称
name: fxb-eureka-wangxiaowei_dev
server:
port: ${eureka_port:8764}
eureka:
instance:
hostname: fxb-eureka-peer4
# 更趋向IP地址
prefer-ip-address: true
# status-page-url-path: /actuator/info
# health-check-url-path: /actuator/health
secure-virtual-host-name: fxb.com
virtual-host-name: moyang.com
metadata-map:
zone: wangxiaowei_dev
client:
service-url:
superman: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER0:fxb-eureka-peer0}:8760/eureka
wangxiyue: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER1:fxb-eureka-peer1}:8761/eureka
lipu_f: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER2:fxb-eureka-peer2}:8762/eureka
fengtiecheng: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER3:fxb-eureka-peer3}:8763/eureka
wangxiaowei_dev: http://${USER_NAME:moyang}:${PASSWORD:moyang}@${ASHURA_PEER4:fxb-eureka-peer4}:8764/eureka
# eureka client 刷新本地刷新时间,默认30s
registry-fetch-interval-seconds: 5
register-with-eureka: true
fetch-registry: true
# 更趋向同一zone的eureka
prefer-same-zone-eureka: true
region: beijing
availability-zones:
beijing: fengtiecheng,superman,wangxiyue,lipu_f,wangxiaowei_dev
server:
# eureka server 刷新read cache Map 的时间
# 注意,client读取的是readCacheMap,这个时间决定了多久会把readWriteCacheMap的缓存更新到readCacheMap上,默认30秒
response-cache-update-interval-ms: 30000
#eureka server缓存readWriteCacheMap失效时间,这个只有在这个时间过去后缓存才会失效,失效前不会更新,过期后从registry重新读取注册服务信息,registry是一个ConcurrentHashMap。
#由于启用了evict其实就用不太上改这个配置了
#默认180s
response-cache-auto-expiration-in-seconds: 180
# 启动主动失效,并且每次主动失效检测时间间隔为3s
eviction-interval-timer-in-ms: 3000
management:
endpoints:
web:
exposure:
include: "*"
endpoint:
health:
show-details: always
logging:
level:
root: INFO
注册逻辑
prefer-same-zone-eureka
为false
, 按照service-url
的list
第一个注册中心,并和其维持心跳检测.不会再向list
中的其他注册中心注册和维持心跳. 只有在第一个注册失败的情况下,才会依次向其他注册中心注册。总共会注册三次,如果三次都没有成功,就会注册失败。每隔一个心跳时间,就会再次尝试了。- 如果
prefer-same-zone-eureka
为true
,先通过region
取availability-zones
内的第一个zone
,然后通过这个zone
取service-url
下的list
,并向list
内的第一个注册中心进行注册和维持心跳,不会再向list内的其它的注册中心注册和维持心跳。只有在第一个注册失败的情况下,才会依次向其它的注册中心注册,总共重试3
次,如果3
个service-url
都没有注册成功,则注册失败。每隔一个心跳时间,会再次尝试。
注意
为了保证服务注册到同一个zone的注册中心,一定要注意availability-zones的顺序,必须要把同一个zone写在前面。
如果你觉得写的还不错,就关注下公众号呗,关注后,有点小礼物回赠给你。
你可以获得5000+电子书,java,springCloud,adroid,python等各种视频教程,各种软件的安装及破解教程。
希望一块学习,一块进步!