Spring Cloud Netflix Eureka是服务注册和发现组件,在分布式系统中,为客户端提供服务注册信息,类似于Zookeeper注册中心,首先服务提供者在启动时,将服务信息注册到注册中心,服务消费者在启动时,从注册中心获取服务提供者信息列表,根据特定的规则,选取其中一个服务提供者来发起调用。
默认情况下,Eureka是服务器同时也是客户端,自己给自己注册,先验证下默认注册到服务器是什么。
server:
port: 8771
spring:
application:
name: eurekaserver
profiles: node1
eureka:
instance:
hostname: node1
preferIpAddress: true
# client:
#自身是否注册到eureka服务器
# registerWithEureka: false
# 是否从eureka服务器获取注册信息
# fetchRegistry: false
#8761这个机器上的实例同步到8771,想相当于备份冗余,实现高可用
# serviceUrl:
# defaultZone: http://node2:8772/eureka/
registerWithEureka: false,这里注释掉了,默认是true,它会注册到本身,我们先启动看下。
com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server
找不到服务器,为什么呢,不应该是注册到自己8771端口吗,因为我们上面serviceUrl没有指定,那么它默认注册到本机的8761端口,很自然,找不到要注册的服务器,后台会报错,那是因为服务器和客户端间维持着一个心跳线程,当服务器存在了,就不会报错了,但不影响程序的启动和访问。
这里得出的结论是,serviceUrl就是要注册到的服务注册中心的地址,默认是本机的8761端口,当然也可以指定其他机器。
接下来,我配置了3个注册中心node1,node2,node3,他们之间相互注册。
nod1和node2是相互注册,那么node1上有node2服务,node2上有node1服务,由于相互注册的Eureka server,他们之间的服务可以同步,所以node1上有node1服务和node2服务;node2上也有node1服务和node2服务。官方说法是,同伴意识,我的理解是,服务共享,哈哈。
node3服务注册到node2,则node2上有nod1,node2,node3服务了,node2上所有服务也会同步到node1。而node3因为没有和node2相互注册,也没有服务注册到它上面来,所以node3没有服务,node3可以看成是Eureka客户端了。看界面结果(图片在文章显示不正常,欲哭无泪)。
node1:http://node1:8771/
node2:http://node2:8772/
node3:http://node3:8773/
启动类:
@EnableEurekaServer @SpringBootApplication public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } }
application.yml:
#客户端默认连接8761这个端口,如果不指定,则默认启动是8080端口,则客户端也得改为8080端口。
server:
port: 8771
spring:
application:
name: eurekaserver
profiles: node1
eureka:
instance:
hostname: node1
preferIpAddress: true
client:
#自身是否注册到eureka服务器
# registerWithEureka: false
# 是否从eureka服务器获取注册信息
fetchRegistry: false
#8771这个机器上的服务同步到8772,注册中心上的服务信息是相互同步的
serviceUrl:
defaultZone: http://node2:8772/eureka/
---
server:
port: 8772
spring:
application:
name: eurekaserver
profiles: node2
eureka:
instance:
hostname: node2
# preferIpAddress: true
client:
#自身是否注册到eureka服务器serviceUrl
# registerWithEureka: false
# 是否从eureka服务器获取注册信息
fetchRegistry: false
#8772这个机器上的服务同步到8771,注册中心上的服务信息是相互同步的
serviceUrl:
defaultZone: http://node1:8771/