Netflix Eureka 是一款由 Netflix 开源的基于 REST 服务的注册中心,用于提供服务发现功能。Spring Cloud Eureka 是 Spring Cloud Netflix 微服务套件的一部分,基于 Netflix Eureka 进行了二次封装,主要负责完成微服务架构中的服务治理功能。git
Spring Cloud Eureka 是一个基于 REST 的服务,并提供了基于 Java 的客户端组件,可以很是方便的将服务注册到 Spring Cloud Eureka 中进行统一管理。github
建立一个名为 eureka-server 的 Spring Cloud 的项目(略)web
引入 eureka-server 依赖(maven)spring
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency>
开启 EurekaServer
在启动类上添加 @EnableEurekaServer
注解,开启 EurekaServer 的自动装配功能。网络
修改服务端口为8761架构
修改 register-with-eureka 配置
添加一个eureka.client.register-with-eureka=false
的配置,做为EurekaServer能够不将本身的实例注册到 Eureka Server 中,若是是集群部署设置为true(不配置默认值也是true)。app
修改 fetch-registry
配置
添加一个 eureka.client.fetch-registry=false 的配置,表示不从 Eureka Server 中获取 Eureka 的注册表信息,若是是集群部署设置为true(不配置默认值也是true)。maven
添加defaultZone配置
添加一条配置eureka.client.service-url.defaultZone=http://localhost:8761/eureka/
(若是不加这个的话又自定义了端口,可能会报错Connect to localhost:8761 timed out)spring-boot
启动 Eureka Server,访问 http://localhost:8761/,若是顺利的话能够看到以下成功页面
微服务
至此,一个简单的Eureka注册中心就完成了,后面实战中的 Eureka Client 都会注册到这个注册中心。上面的demo只是一个单机部署,接下里咱们看看咱们要部署多个Eureka节点时怎么作。
集群部署通常有两种状况,一是伪集群部署,二是真正的集群部署。
集群部署,咱们能够在多台物理机上部署,这样多个实例能够用同一个端口,不会出现伪集群端口冲突的问题,更推荐这种方式,性能更高,稳定性也更好。
伪集群部署通常说的是在同一台物理机器上部署多个节点,这时候端口就必须不同,不然启动的时候会出现端口冲突;
伪集群部署示例:
假设要部署3个节点:master/slave1/slave2
在application.yml配置定义三个节点的端口:
port: master: 8761 slave1: 8762 slave2: 8763
咱们能够分别建立三个配置文件application-master.yml、application-slave1.yml、application-slave2.yml,三个配置文件除了有冲突的地方端口不同,其余配置彻底同样
# application-master.yml server: port: ${port.slave1} # 服务端口 # application-master.yml server: port: ${port.slave1} # 服务端口 # application-slave2slave2.yml server: port: ${port.slave2} # 服务端口 # 如下配置三个配置文件都同样 eureka: client: register-with-eureka: true #不将本身的实例注册到 Eureka Server fetch-registry: true #不从 Eureka Server 中获取 Eureka 的注册表信息 service-url: defaultZone: http://127.0.0.1:${port.master}/eureka/,http://127.0.0.1:${port.slave1}/eureka/,http://127.0.0.1:${port.slave2}/eureka/ instance: hostname: eureka-server server: enable-self-preservation: true # 开启自我保护机制,默认也是开启的
IDEA 分别以三个不一样的profiles启动
访问 http://localhost:8761/ 或者 http://localhost:8762/ 或者 http://localhost:8761/,出现如下相似页面则表明成功
观察上面的页面,发现 Eureka Server 节点均出如今 unavailable-replicas 下,说明集群搭建仍是失败了,那这个问题怎么解决呢?
在host
添加如下配置
127.0.0.1 eureka-server-master 127.0.0.1 eureka-server-slave1 127.0.0.1 eureka-server-slave2
修改三个配置文件的defaultZone
信息
eureka: client: service-url: defaultZone: http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
配置eureka.instance.hostname
信息(尤为是在同一台物理机上配置三个节点时,须要修改成不一样的host)
eureka: instance: hostname: eureka-server-master eureka: instance: hostname: eureka-server-slave1 **eureka: instance: hostname: eureka-server-slave2
从新启动,访问http://localhost:8761/ ,其余两个节点君出如今 available-replicas 选项
注意:若是执行完上面仍是出如今,请检查是否配置了 prefer-ip-address = true,true #以IP地址注册到服务中心,相互注册使用IP地址,若是是在一台物理机上,IP都是一个,因此建议设置成false,或者不配置再试试。
建立一个名为eureka-client 的SprintBoot的项目(略)
引入eureka-client依赖(maven)
<dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency>
引入spring-boot-starter-web依赖,若是没有加上spring-boot-starter-web,服务没法正常启动
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
开启 EurekaClient
在启动类上加入注解@EnableEurekaClient
,用于启用Eureka发现配置
配置端口为8081
server.port = 8081 port.master = 8761 port.slave1 = 8762 port.slave2 = 8763
配置注册中心地址
添加配置 eureka.client.serviceUrl.defaultZone=http://eureka-server-master:${port.master}/eureka/,http://eureka-server-slave1:${port.slave1}/eureka/,http://eureka-server-slave2:${port.slave2}/eureka/
启动服务,刷新 http://localhost:8761/ 页面,若是看到了EUREKA-CLIENT应用则表示注册成功
自我保护机制是为了不因网络分区故障而致使服务不可用的问题。具体现象为当网络故障后,全部的服务与 Eureka Server 之间没法进行正常通讯,必定时间后,Eureka Server 没有收到续约的信息,将会移除没有续约的实例。这个时候正常的服务也会被移除掉,因此须要引入自我保护机制来解决这种问题。
当服务提供者出现网络故障,没法与 Eureka Server 进行续约,Eureka Server 会将该实例移除,此时服务消费者从 Eureka Server 拉取不到对应的信息,实际上服务提供者处于可用的状态,问题就是这样产生的。
开启自我保护机制
eureka.server.enable-self-preservation=true # 开启自我保护机制,默认也是开启的
当服务提供者出现网络故障,没法与 Eureka Server 进行续约时,虽然 Eureka Server 开启了自我保护模式,但没有将该实例移除,服务消费者仍是能够正常拉取服务提供者的信息,正常发起调用。
可是自我保护机制也有很差的地方,若是服务提供者真的下线了,因为 Eureka Server 自我保护还处于打开状态,不会移除任务信息,当服务消费者对服务提供者 B 进行调用时,就会出错。
自我保护模式有利也有弊,但咱们建议在生产环境中仍是开启该功能,默认配置也是开启的。
完整代码实例:
@EnableEurekaServer
注解实现注册中心@EnableEurekaClient
注册到注册中心register-with-eureka
和 fetch-registry
为true,单机部署能够为false