转载自:http://www.itmuch.com/spring-cloud-1/
    http://blog.didispace.com/springcloud1/

  Eureka是Netflix开发的服务发现组件,本身是一个基于REST的服务。Spring Cloud将它集成在其子项目spring-cloud-netflix中,以实现Spring Cloud的服务发现功能。
  Eureka的Github:https://github.com/Netflix/Eureka

Region、Zone解析

  Eureka的官方文档对regin、zone几乎没有提及,由于概念抽象,新手很难理解。因此,在分析Eureka原理之前,先来了解一下region、zone、Eureka集群三者的关系,如图:
Spring Cloud学习(一)Eureka简介
  region和zone(或者Availability Zone)均是AWS的概念。在非AWS环境下,可以简单地将region理解为Eureka集群,zone理解成机房。这样就很好理解了,一个Eureka集群被部署在了zone1机房和zone2机房中。
  Spring Cloud中默认的region是us-east-1 。

Eureka架构

Spring Cloud学习(一)Eureka简介
  上图来自Eureka官方的架构图,大致描述了Eureka集群的工作过程。
  Application Service相当于服务提供者,Application Client相当于服务消费者;Make Remote Call可以简单理解为调用RESTful API;us-east-1c、us-east-1d等都是zone,它们都属于us-east-1这个region。
  Eureka包含两个组件:Eureka Server 和 Eureka Client,可以理解成,服务都注册在哪里,哪里就可称为Eureka Server,注册中心的意思。注册在注册中心可以是服务的提供者(Applicaton Service)或者服务的消费者(Application Client),这两类都被称为Eureka client。
  微服务启动时,会通过Eureka Client向Eureka Server进行注册自己的信息,Eureka Server会存储该服务的信息;启动后,Eureka Client会周期性地向Eureka Server发送心跳(默认周期为30秒)以续约自己的信息。如果Eureka Server在一定时间内没有接收到某个微服务节点的心跳,Eureka Server将会注销该微服务节点(默认90秒)。
  每个Eureka Server同时也是Eureka Client,多个Eureka Server之间通过复制的方式完成服务注册表的同步;Eureka Client会缓存Eureka Server中的信息。即使所有的Eureka Server节点都宕掉,服务消费者依然可以使用缓存中的信息找到服务提供者。
  综上,Eureka通过心跳检测、健康检查和客户端缓存等机制,提高了系统的灵活性、可伸缩性和可用性。

示例

创建注册中心

@SpringBootApplication
@EnableEurekaServer  // 启动一个服务注册中心
public class EurekaApplication {
    public static void main(String[] args) {
        SpringApplication.run(EurekaApplication.class, args);
    }
}

  配置文件

server.port=9000
eureka.client.registerWithEureka=false
eureka.client.fetchRegistry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/

  eureka.client.registerWithEureka: 表示是否将自己注册到Eureka Server,默认为true。由于当前这个应用就是Eureka Server,故而设为false。
  eureka.client.fetchRegistry: 表示是否从Eureka Server获取注册信息,默认为true。因为这是一个单点的Eureka Server,不需要同步其他的Eureka Server节点的数据,故而设为false。
  eureka.client.serviceUrl.defaultZone: 设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。多个地址可使用”,”分隔。
  启动工程后,访问:http://localhost:9000/ 。会发现此时还没有服务注册到Eureka上面。
Spring Cloud学习(一)Eureka简介

创建服务提供方
  在启动类中通过加上@EnableDiscoveryClient注解,该注解能**Eureka中的DiscoveryClient实现,才能实现Controller中对服务信息的输出。

@SpringBootApplication
@EnableDiscoveryClient
@PropertySource(value = {"classpath:application.properties"})
public class ComputeServiceApplication {
    public static void main(String[] args) {
        new SpringApplicationBuilder(ComputeServiceApplication.class).web(true).run(args);
    }
}
@RestController
public class ComputeController {
    @RequestMapping(value = "/add" ,method = RequestMethod.GET)
    public Integer add(@RequestParam Integer a, @RequestParam Integer b) {
        Integer r = a + b;
        return r;
    }
}
spring.application.name=compute-service
server.port=2222
eureka.client.serviceUrl.defaultZone=http://localhost:9000/eureka/

  spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name
  启动该工程后,再次访问:http://localhost:9000/, 可以看到,我们定义的服务被注册了。
Spring Cloud学习(一)Eureka简介


Spring Cloud中,Eureka常见问题总结:
http://www.itmuch.com/spring-cloud-sum-eureka/

相关文章: