原文链接 译者:Acamy
2. 服务发现:Eureka服务器
2.1 如何创建Eureka服务器
引用org.springframework.cloud的spring-cloud-starter-eureka-server就可以创建Eureka服务器。在当前Spring Cloud版本中如何进行详细设置可以查看Spring Cloud工程页面。
2.2 如何运行Eureka服务器
Eureka服务器的示例代码:
@SpringBootApplication @EnableEurekaServer public class Application { public static void main(String[] args) { new SpringApplicationBuilder(Application.class).web(true).run(args); } }
该服务器有一个UI主页,并且Eureka每一个功能点都可以通过/eurake/*形式的HTTP API来访问。
Eureka背景阅读:查看flux capacitor和google group discussion页面。
提示:由于Gradle缺少设置父工程的方式,仅仅靠spring-cloud-starter-eureka-server会使得应用在启动时失败。要解决这个问题必须将Spring Boot的Gradle插件添加进来,并且像下面这种方式导入Spring cloud的父工程。
build.gradle.
buildscript { dependencies { classpath("org.springframework.boot:spring-boot-gradle-plugin:1.3.5.RELEASE") } } apply plugin: "spring-boot" dependencyManagement { imports { mavenBom "org.springframework.cloud:spring-cloud-dependencies:Brixton.RELEASE" } }
2.3 高可用性,区块和区域
Eureka服务器并没有一个后台存储,但是注册表中的所有服务实例都要得发送心跳以更新它们的注册信息(所以这可以在内存中操作)。客户端也会有一个对eurake注册信息的缓存(所以它们的每次单独服务请求并不非得去注册表中查询)。
默认情况下Eureka服务器也是一个Eureka客户端并且需要(至少)一个服务URL来定位到节点。如果你没有提供它也会运行,但是在日志中会出现很多关于没有注册该节点的杂乱信息。
关于客户端侧的区块和区域可以查看如下Ribbon详细支持页面。
2.4 单机模式
只要有某种监控或者是弹性运行时间(比如Cloud Foundry)来使服务存活,两个缓存(客户端和服务器)和心跳机制的整合使得单机Eureka服务器对故障保有相关的弹性。在单机模式下,你可能更喜欢关掉服务器的客户端行为,使得它不会不断失败的访问节点。例如:
server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
注意serviceUrl和本地实例指向同一个主机。
2.5 节点感知
Eureka通过运行多个实例并要求它们彼此注册来使其高可用。实际上,这是它的默认行为,所以你需要做的就是给节点添加一个有效的serviceUrl来使其正常工作,例如:
Application.yml(两个相互感知的Eureka服务器节点)
--- spring: profiles: peer1 eureka: instance: hostname: peer1 client: serviceUrl: defaultZone: http://peer2/eureka/ --- spring: profiles: peer2 eureka: instance: hostname: peer2 client: serviceUrl: defaultZone: http://peer1/eureka/
在本例中YAML配置文件通过不同的Spring profiles使得同一个服务器可以运行在两台主机上。你可更改/etc/hosts文件来解析主机名,用这个配置文件在单机上测试节点感知(在生产中这样做是没有多少意义的)。实际上如果你运行的机器知道自己的主机名(默认会通过java.net.InetAddress查找),那么eureka.instance.hostname是不需要的。
你可以在一个系统中添加多个节点,他们之间只要相互连接就能自己同步注册信息。如果这些节点在物理上是分离的(在一个或多个数据中心),那么该系统原则上是可以避免split-brain型故障。
2.6 IP地址偏好
在某些情况下,使用服务的IP地址比主机名好。通过将eureka.instance.preferIPAddress设置为true,应用在注册eureka时就会使用IP地址而不是主机名。
原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/98834.html