微服务基础设施之服务注册中心: Spring Cloud Eureka

对服务注册中心的需求

在微服务架构中,由于每一个服务的粒度相对传统SOA来说要小的多,所以服务的数量会成倍增加。这时如果有效管理服务的注册信息就尤为重要。我们对服务注册中心的期望主要有以下几条:

  • 简单易用:最好对开发者透明
  • 高可用:几台注册中心坏掉不会导致整个服务瘫痪,注册服务整体持续可用
  • 避免跨越机房调用:最好调用优先同一个机房的服务以减少网络延迟
  • 跨语言:允许开发者使用多种编程语言构建微服务

Netflix Eureka如何满足需求

简单易用

Eureka的易用性体现在两方面,一是通过与Spring Boot(Cloud)结合达到了只用注解和maven依赖就能部署和启动服务的效果,二是Eureka自带Client包,使得使用Eureka作为注册中心的客户端(即服务)不需要关心自己与Eureka的通讯机制只需要引入Client依赖即可,当然前提是使用Java。

构造一个Eureka Server非常简单,首先引入依赖:

<dependencies>
        <dependency>
            <groupId>org.springframework.cloudgroupId>
            <artifactId>spring-cloud-starter-eureka-serverartifactId>
        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.cloudgroupId>
            <artifactId>spring-cloud-starter-eureka-serverartifactId>
        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还支持RegionZone的概念。其中一个Region可以包含多个Zone。Eureka在启动时需要指定一个Zone名,即当前Eureka属于哪个zone, 如果不指定则属于defaultZone。Eureka Client也需要指定Zone, Client(当与Ribbon配置使用时)在向Server获取注册列表时会优先向自己Zone的Eureka发请求,如果自己Zone中的Eureka全挂了才会尝试向其它Zone。RegionZone可以对应于现实中的大区和机房,如在华北地区有10个机房,在华南地区有20个机房,那么分别为Eureka指定合理的Region和Zone能有效避免跨机房调用,同时一个地区的Eureka坏掉不会导致整个该地区的服务都不可用。

跨语言

虽然Eureka是用Java编写的,但它会将所有注册信息和心跳连接地址都暴露为HTTP REST接口,客户端实际是通过HTTP请求与Server进行通讯的,因此,Client完全可以使用其它语言进行编写,只需要即时调用注册服务、注销服务、获取服务列表和心跳请求的HTTP REST接口即可。到目前为止Eureka只提供了Java语言的Client, 因此如果使用其它语言会牺牲一定的易用性,因为需要了解Eureka与Client的通讯机制,对此官方wiki上有详细说明。

Spring Cloud Netflix对微服务的支持还有:

  • Hystrix: 断路器和资源隔离
  • Feign: 声明式HTTP REST请求客户端
  • Ribbon: 与Eureka结合实现软负载均衡
  • Zuul: API请求路由,即Api Gateway
  • Bus: 各个微服务节点之间的消息通讯
  • Config: 配置的中央化存储

你可能感兴趣的:(spring-cloud,微服务)