微服务基础设施之服务注册中心: Spring Cloud Eureka
对服务注册中心的需求
在微服务架构中,由于每一个服务的粒度相对传统SOA来说要小的多,所以服务的数量会成倍增加。这时如果有效管理服务的注册信息就尤为重要。我们对服务注册中心的期望主要有以下几条:
-
简单易用:最好对开发者透明 高可用:几台注册中心坏掉不会导致整个服务瘫痪,注册服务整体持续可用 避免跨越机房调用:最好调用优先同一个机房的服务以减少网络延迟 跨语言:允许开发者使用多种编程语言构建微服务
Netflix Eureka如何满足需求
简单易用
Eureka的易用性体现在两方面,一是通过与Spring Boot(Cloud)结合达到了只用注解和maven依赖就能部署和启动服务的效果,二是Eureka自带Client包,使得使用Eureka作为注册中心的客户端(即服务)不需要关心自己与Eureka的通讯机制只需要引入Client依赖即可,当然前提是使用Java。
构造一个Eureka Server非常简单,首先引入依赖:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
然后编写main方法加注解:
@SpringBootApplication @EnableEurekaServer public class AlanRegistryServer { public static void main(String[] args) { SpringApplication.run(AlanRegistryServer.class, args); } }
最后打成jar包运行即可。
对于Eureka客户端,我们也只需要上面的两步:
<dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> </dependencies>
然后:
@SpringBootApplication @EnableEurekaClient public class RegistryClientApplication { public static void main(String[] args) { SpringApplication.run(RegistryClientApplication.class, args); } }
Server和Client的配置信息,都可以在Spring Boot项目的application.properties中配置。
高可用
Eureka通过“伙伴”机制实现高可用。每一台Eureka都需要在配置中指定另一个Eureka的地址作为伙伴,Eureka启动时会向自己的伙伴节点获取当前已经存在的注册列表, 这样在向Eureka集群中新加机器时就不需要担心注册列表不完整的问题。
除此之外,Eureka还支持Region和Zone的概念。其中一个Region可以包含多个Zone。Eureka在启动时需要指定一个Zone名,即当前Eureka属于哪个zone, 如果不指定则属于defaultZone。Eureka Client也需要指定Zone, Client(当与Ribbon配置使用时)在向Server获取注册列表时会优先向自己Zone的Eureka发请求,如果自己Zone中的Eureka全挂了才会尝试向其它Zone。Region和Zone可以对应于现实中的大区和机房,如在华北地区有10个机房,在华南地区有20个机房,那么分别为Eureka指定合理的Region和Zone能有效避免跨机房调用,同时一个地区的Eureka坏掉不会导致整个该地区的服务都不可用。
跨语言
虽然Eureka是用Java编写的,但它会将所有注册信息和心跳连接地址都暴露为HTTP REST接口,客户端实际是通过HTTP请求与Server进行通讯的,因此,Client完全可以使用其它语言进行编写,只需要即时调用注册服务、注销服务、获取服务列表和心跳请求的HTTP REST接口即可。到目前为止Eureka只提供了Java语言的Client, 因此如果使用其它语言会牺牲一定的易用性,因为需要了解Eureka与Client的通讯机制,对此上有详细说明。
Spring Cloud Netflix对微服务的支持还有:
-
Hystrix: 断路器和资源隔离 Feign: 声明式HTTP REST请求客户端 Ribbon: 与Eureka结合实现软负载均衡 Zuul: API请求路由,即Api Gateway Bus: 各个微服务节点之间的消息通讯 Config: 配置的中央化存储