Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件,主要用于定位运行在AWS域中的中间层服务,以达到负载均衡和中间层服务故障转移的目的。SpringCloud将它集成在其子项目spring-cloud-netflix中,以实现SpringCloud的服务发现功能。java
服务注册与发现,各个微服务启动时,会经过 Eureka Client 向 Eureka Server 注册本身的服务,也能够从Eureka Server 中获取服务,每一个微服务的服务提供端和服务调用端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题web
它主要包括两个组件:Eureka Server 和 Eureka Client 且由三端构成
1.Eureka Server 服务注册与发现中心端
2.Service Provider服务提供者端
3.Service Consumer服务调用者端
提供者和调用者均属Eureka Client
Eureka Client:一个Java客户端,用于简化与 Eureka Server 的交互(一般就是微服务中的客户端和服务端)
Eureka Server:提供服务注册和发现的能力(一般就是微服务中的注册中心)spring
同步:每一个 Eureka Server 同时也是 Eureka Client(逻辑上的)
多个 Eureka Server 之间经过复制的方式完成服务注册表的同步,造成 Eureka 的高可用
识别:Eureka Client 会缓存 Eureka Server 中的信息
即便全部 Eureka Server 节点都宕掉,服务消费者仍可以使用缓存中的信息找到服务提供者(笔者已亲测)
续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(相似于heartbeat)
续期:Eureka Server 会按期(默认60s)执行一次失效服务检测功能
它会检查超过必定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点浏览器
首先建立一个springcloud项目工程 添加以下
pom.xml缓存
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <!-- spring cloud Eureka Server 启动器 --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-server</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
@SpringBootApplication //建立服务注册中心 @EnableEurekaServer public class CloudServer1Application { public static void main(String[] args) { SpringApplication.run(CloudServer1Application.class, args); } }
application.yml架构
#server server: port: 8001 # 应用名称 spring: application: name: springcloud-eureka-service1 #eureka eureka: #指定环境 environment: work instance: #eureka的主机 hostname: server1 # 设置是否将本身做为客户端注册到注册中心(缺省true) # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 设置是否从注册中心获取注册信息(缺省true) # 由于这是一个单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false fetch-registry: false #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/ #访问监控中心地址栏输入http://localhost:8881 serviceUrl.defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #是否开启自我保护模式,默认为true。 #server server: enable-self-preservation: false #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eviction-interval-timer-in-ms: 40000
上面提到serviceUrl,那就顺便说下 defaultZone
Eureka 有一个 Region 和 Zone 的概念,你能够理解为现实中的大区(Region)和机房(Zone)
Eureka Client 在启动时须要指定 Zone,它会优先请求本身 Zone的 Eureka Server 获取注册列表
一样的,Eureka Server 在启动时也须要指定 Zone,若是没有指定的话,其会默认使用defaultZone
defaultZone就是默认IP+端口并发
此处的${eureka.instance.hostname}须要做在hosts文件中做地址映射
进入C:\Windows\System32\drivers\etc目录下以管理员身份打开 在末尾行添加
127.0.0.1 server1 或
非localhost server1app
运行启动类,浏览器地址栏输入serviceUrl填写的Zone便可访问监控界面
负载均衡
Eureka server最少有一个做为client的注册发现中心 Eureka Client可多个同时向一个Eureka server注册
pom.xmlide
<properties> <java.version>1.8</java.version> <spring-cloud.version>Hoxton.SR3</spring-cloud.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>${spring-cloud.version}</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
启动类
@SpringBootApplication //建立服务客户端 @EnableEurekaClient public class CloudClient1Application { public static void main(String[] args) { SpringApplication.run(CloudClient1Application.class, args); } }
application.xml
#应用名称 spring: application: name: springcloud-eureka-client1 #server 端口 server: port: 8011 #eureka eureka: #服务注册发现地址 此处需填写注册中心的地址 client: serviceUrl.defaultZone: http://server1:8001/eureka/ instance: #eureka的主机 hostname: client1 #服务实体向eureka的注册名 instance-id: ${spring.application.name}:${server.port} # 设置微服务调用地址为IP优先(缺省为false) prefer-ip-address: true # 心跳时间,即服务续约间隔时间(缺省为30s)微服务会周期性地向 Eureka Server 发送心跳以Renew(续约)信息(相似于heartbeat) lease-renewal-interval-in-seconds: 30 # 发呆时间,即服务续约到期时间(缺省为90s) 超过这个时间没有Renew的微服务,发现则会注销该微服务节点 lease-expiration-duration-in-seconds: 90
启动client服务后 打开Eureka Server监控中心可看到 该Eureka Client已被注册
Eureka Server 支持运行多实例,并以互相注册的方式(即伙伴机制),来实现高可用的部署
即每一台 Eureka 都在配置中指定另外一个 Eureka 或多个地址做为伙伴,它在启动时会向伙伴节点获取注册列表
注册中心做为微服务架构中的核心功能,其重要性不言而喻。因此单机版的Eureka Server在可靠性上并不符合如今的互联网开发环境。
集群版的Eureka Server才是商业开发中的选择。
Eureka Server注册中心的集群和Dubbo的ZooKeeper注册中心集群在结构上有很大的不一样:
ZooKeeper注册中心集群搭建后,集群中各节点呈现主从关系,集群中只有主节点对外提供服务的注册和发现功能,从节点至关于备份节点,
只有主节点宕机时,从节点会选举出一个新的主节点,继续提供服务的注册和发现功能。
而Eureka Server注册中心集群中每一个节点都是平等的,集群中的全部节点同时对外提供服务的发现和注册等功能。同时集群中每一个
Eureka Server节点又是一个微服务,也就是说,每一个节点均可以在集群中的其余节点上注册当前服务。又由于每一个节点都是注册中心,
因此节点之间又能够相互注册当前节点中已注册的服务,并发现其余节点中已注册的服务
一、集群版Eureka Server能够经过Spring Boot多环境配置方式快速搭建。只要建立一个合适的Eureka Server工程,经过多个全局配置便可完成快速搭建,
工程打包成jar包后启动时指定配置文件便可完成不一样配置方案的启动。
二、分别在主工程中建立多个Eureka Server工程 分别在其中的YML或Properties文件中配置集群信息,以后分别启动便可
pom.xml和启动类于单机配置同样
application.yml配置A
#server server: port: 8001 # 应用名称 spring: application: name: springcloud-eureka-service1 #eureka eureka: #指定环境 environment: work instance: #eureka的主机 hostname: server1 # 设置是否将本身做为客户端注册到注册中心(缺省true) # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 设置是否从注册中心获取注册信息(缺省true) # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false fetch-registry: true #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server2:8002/eureka/,http://server3:8003/eureka/ #是否开启自我保护模式,默认为true。 #server server: enable-self-preservation: false #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eviction-interval-timer-in-ms: 40000
application.yml配置B
#server server: port: 8002 # 应用名称 spring: application: name: springcloud-eureka-service2 #eureka eureka: #指定环境 environment: work instance: #eureka的主机 hostname: server2 # 设置是否将本身做为客户端注册到注册中心(缺省true) # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 设置是否从注册中心获取注册信息(缺省true) # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false fetch-registry: true #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server1:8001/eureka/,http://server3:8003/eureka/ #是否开启自我保护模式,默认为true。 # server server: enable-self-preservation: false #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eviction-interval-timer-in-ms: 40000
application.yml配置C
#server server: port: 8003 # 应用名称 spring: application: name: springcloud-eureka-service3 #eureka eureka: #指定环境 environment: work instance: #eureka的主机 hostname: server3 # 设置是否将本身做为客户端注册到注册中心(缺省true) # 这里为不须要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient) client: register-with-eureka: false # 设置是否从注册中心获取注册信息(缺省true) # 单点的EurekaServer,不须要同步其它EurekaServer节点的数据,故设为false fetch-registry: true #集群http://peer3:8883/eureka/,http://peer1:8881/eureka/ # 单节点写法 http://${eureka.instance.hostname}:${server.port}/eureka/ serviceUrl.defaultZone: http://server2:8002/eureka/,http://server1:8001/eureka/ #是否开启自我保护模式,默认为true。 # server server: enable-self-preservation: false #续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms) eviction-interval-timer-in-ms: 40000
分别启动三个Eureka Server后可看到任意一个Server的监控中心能够看到另外两个server节点
访问地址:http://server1:8001/、http://server2:8002/、http://server3:8003/
以后再启动Eureka Client就能够看到 监控中心出现了client服务注册信息