eureka 1.9.8 采用dns 发现 serviceurl 或 peer
最近在使用eureka 进行服务的动态注册和发现,eureka 是一个AP特性的注册中心,非常适合用于服务的动态注册和发现。
eureka 集群发现各peer有两种模式:1.通过在配置文件中配置defaultZone 的service url列表来完成。2.通过DNS方式
第1中方式相对来说比较简单。考虑到eureka 上线后的动态扩容,那如果基于第一种方式的话,手动配置service url列表将是一件非常痛苦的事,所以本文主要介绍基于DNS 方式来配置发现。
- 自己找台linux 服务器搭建DNS服务,我这里采用的是 coredns 1.2.6版本,要支持TXT类型。coredns的安装非常简单,需要自己配置一个名字为 Corefile 的配置文件,内容如下:
.:53 {
whoami
log stdout
errors stdout
etcd eureka.com {
stubzones
path /eurekaserviceurl
endpoint http://127.0.0.1:2379
upstream 8.8.8.8:53 8.8.4.4:53
}
} 大概意思就是这台dns server 监听53端口对外提供服务,DNS的默认端口也是53,然后配置了一个eureka.com的域名,stubzones 代表支持子域名,
path 代表数据保存在etcd 的path,
endpoint 代表 etcd的地址,
upstream代表它处理不了的请求转发给其他DNS来处理。 -
搭建etcd cluster,如果只是为了测试eureka 的基于dns 的发现能力,etcd 可以启动单台就够了,etcd 需要 V3.X版本,我这里用的是 etcd-v3.3.10版本,etcd 启动后就可以了,这里就不详细说明了。
-
启动etcd,这里就不详细说明如何启动etcd了。
-
启动coredns,在Linux 服务器对应的coredns 解压目录下执行 ./coredns --conf ./Corefile 启动,启动完成后如果正常如下图所示:
说明它正在监听53端口的域名解析请求。
- eureka 在 springcloud 对应的配置文件中的核心配置如下(这里主要体现的是从DNS获取peer的配置,这里没有区分zone,用的defaultZone,其他的忽略了):
eureka:
client:
eureka-server-port: 8761
eureka-server-d-n-s-name: eureka.com
use-dns-for-fetching-service-urls: true - coredns 只支持读取etcd v3 api 存取的数据,所以需要先在shell 中执行 export ETCDCTL_API=3。
- 然后在coredns 上配置域名数据。这里需要切换到etcd 的解压目录下,执行 ./etcdctl put /eurekaserviceurl/com/eureka/us-east-1/txt '{"text":"defaultZone.eureka.com"}' ,然后执行
dig +short txt.us-east-1.eureka.com TXT @localhost 查看数据是否正确。如图所示: - 接着在coredns 上配置子域名txt.defaultZone.eureka.com的TXT数据。
./etcdctl put /eurekaserviceurl/com/eureka/defaultzone/txt '{"text":"1.1.1.1 1.1.1.2 1.1.1.3 1.1.1.4"}' 这里的IP 改为自己真实环境的IP地址即可。如果开启了spring security,配置格式为./etcdctl put /eurekaserviceurl/com/eureka/defaultzone/txt '{"text":"admin:vkzeus!369@127.0.0.1"}' 多个IP 中间用空格隔开。红色部分 defaultzone 必须是小写,大写并不能写入数据,可能是与我使用的DNS有关系。执行 dig +short txt.defaultZone.eureka.com TXT @localhost 查看结果,如下图所示:
-
还可以接续配合更多的子域名数据,例如:
./etcdctl put /eurekaserviceurl/com/eureka/us-east-1c/txt '{"text":"2.2.2.2 2.2.2.2 2.2.2.3 2.2.2.4"}'
dig +short txt.us-east-1c.eureka.com TXT @localhost 如下图所示:
-
接这启动你的eureka server,注意可能要修改你的DNS IP 为 Linux coredns 运行服务器的IP。你会发现eureka server 正常启动,可以正确获取到peer url.
-
在这里我也主要参考了三篇文章:https://github.com/coredns/coredns/tree/master/plugin/etcd 与 https://github.com/Netflix/eureka/wiki/Deploying-Eureka-Servers-in-EC2 与 https://github.com/spring-cloud/spring-cloud-netflix/issues/213