转载自: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集群三者的关系,如图:
region和zone(或者Availability Zone)均是AWS的概念。在非AWS环境下,可以简单地将region理解为Eureka集群,zone理解成机房。这样就很好理解了,一个Eureka集群被部署在了zone1机房和zone2机房中。
Spring Cloud中默认的region是us-east-1 。
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上面。
创建服务提供方
在启动类中通过加上@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常见问题总结:
http://www.itmuch.com/spring-cloud-sum-eureka/