Spring Cloud(一):服务注册中心Eureka
Spring Cloud 基于 Netflix 的几个开源项目进行了封装,提供包括服务注册与发现(Eureka),智能路由(Zuul),熔断器(Hystrix),客户端负载均衡(Ribbon)等在内的核心组件。
在微服务系统中,服务少则十几、几十个,多则上百、几百个(据悉 Netflix 的云平台上运行了500多个微服务),这些微服务通过相互调用来为用户提供功能。那么一个服务调用另一个服务是如何进行的,如何定位到另一个服务的地址?代码中写死,还是配置文件中配置?显然对于服务数量较多的系统,这两种方式先不说后续维护,光写起来就很痛苦。于是,对于微服务架构来说,服务的自动注册与发现就成为非常核心的功能,Eureka就是来负责实现这个功能的。
本系列文章与示例均基于最新的Spring Cloud Hoxton版编写。
Eureka
Eureka是一个基于REST的服务,包括Eureka Server与Eureka Client两个端。Eureka Server作为服务注册中心接受Eureka Client的注册及获取其它服务的地址信息。基本架构如下图所示:

其中
Eureka Server: 作为服务注册中心,提供服务注册与发现功能接口
Service Provider: 服务提供者,将自身服务注册到服务注册中心,供其它服务消费者发现与调用
Service Consumer: 服务消费者,从服务注册中心发现服务,并通过一些负载均衡客户端来调用(比如Ribbon或Feign)
很多时候同一个应用可能既是服务提供者,也是服务消费者——自己作为服务方,为其它服务提供接口,同时也调用其它服务的接口来完成自身的业务逻辑。
Eureka Server
Eureka Server的搭建非常简单,其部署可分为单实例部署与多实例集群部署,一般开发测试环境可以使用单实例部署,但生产环境出于高可用要求,可进行多实例集群部署。
1. 在pom.xml中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
为了方便版本引入,可以在pom中添加依赖管理,这样spring cloud相关的starter依赖就不需要指定版本了(如上省略了version)
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
2. 在启动类上添加注解 @EnableEurekaServer
@SpringBootApplication
@EnableEurekaServer
public class EurekaApplication { public static void main(String[] args) {
SpringApplication.run(EurekaApplication.class, args);
}
}
3. 在application.yml 或 application.properties配置文件中添加配置(个人比较倾向于yml,两者区别可自行百度)
spring:
application:
name: spring-cloud-eureka
profiles:
active: single server:
port: 8761 ---
spring:
profiles: single
eureka:
instance:
hostname: localhost
client:
registerWithEureka: false
fetchRegistry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ ---
spring:
profiles: peer1
server:
port: 8761
eureka:
instance:
hostname: peer1
client:
serviceUrl:
defaultZone: http://peer2:8762/eureka/,http://peer3:8763/eureka/
---
spring:
profiles: peer2
server:
port: 8762
eureka:
instance:
hostname: peer2
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer3:8763/eureka/
---
spring:
profiles: peer3
server:
port: 8763
eureka:
instance:
hostname: peer3
client:
serviceUrl:
defaultZone: http://peer1:8761/eureka/,http://peer2:8762/eureka/
在该配置文件中,实际上是定义了两种模式,其中默认的profile single是单实例模式, peer1, peer2, peer3组成多实例模式。
eureka.client.registerWithEureka:表示是否将自身注册到Eureka Server,默认为true,单实例模式下一般设置为false,否则会在启动时报连接不到服务器的错误
eureka.client.fetchRegistry:表示是否从Eureka Server获取注册服务列表,默认为true,同样在单实例模式下设置为falseeureka.client.serviceUrl.defaultZone:Eureka Server的地址,多实例模式下多个地址以“,”隔开,多个实例之间只要有一条路线连通,则总会将注册信息进行同步
4. 启动
对于单实例模式,如果按如上配置,则直接启动程序即可。启动完成后,访问 http://localhost:8761,即可查看Eureka Server的相关信息,如

上图所示,当前没有Eureka Server的副本也没有任何服务注册。
对于多实例集群模式,则需要根据不同的profile启动多个实例,
mvn clean package
cd target
java -jar springcloud-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar springcloud-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar springcloud-eureka-1.0-SNAPSHOT.jar --spring.profiles.active=peer3
启动完成后,打开 http://localhost:8761, 可以看到Eureka Server已经存在副本与注册的服务了(Eureka将自身作为一个服务完成了注册)

上述操作如果是在单机进行,则需要在hosts文件中添加映射,linux下是/etc/hosts,windows10 下是C:\Windows\System32\drivers\etc\hosts,
127.0.0.1 peer1
127.0.0.1 peer2
127.0.0.1 peer3
Eureka Client
Eureka Client一般集成在各个微服务中,集成也非常简单。
1. pom.xml中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
2. application.yml配置文件中添加配置
eureka:
client:
serviceUrl:
defaultZone: http://localhost:8761/eureka/
instance:
prefer-ip-address: true
instance-id: ${spring.application.name}:${random.uuid}
如果是多实例集群模式,则 eureka.client.serviceUrl.defaultZone 可以配置多个地址,“,”号分隔。
eureka.client.*:发现服务的配置参数eureka.instance.*:注册服务的配置参数, 如上eureka.instance.prefer-ip-address设置为true表示服务注册时使用IP,而不是hostname;eureka.instance.instance-id配置服务实例的ID,默认为 ${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}}
添加了依赖就能集成Eureka Client,主类上添加 @EnableDiscoveryClient 注解不是必须。
启动程序后,进入Eureka Server页面即可看到注册的服务

一些知识点(建议掌握)
Eureka Client在注册服务时,提供包括hostname,IP地址, port, health indicator url,status page, home page 等在内的meta-data,其它客户端可通过这些信息来直接与服务进行交互,我们也可以通过
eureka.instance.metadataMap来添加自定义的meta-data,供客户端访问。Eureka Server通过接收Eureka Client的心跳消息来判断服务实例是否存活,如果某一个实例的心跳在特定时间(可配置)内没收到,则将其从注册表中移除。心跳默认间隔为30s,一个服务被其它客户端发现,可能需要经过3次心跳,这也是有时候服务注册比较慢的原因。可通过
eureka.instance.leaseRenewalIntervalInSeconds配置,但生产环境建议最好保持默认。Eureka Client默认不会传播当前应用的健康检查状态,一旦注册成功,只要心跳存在,Eureka总是认为应用处于UP状态。可以启用Eureka的健康检查,将状态传播给Eureka,其它应用只会将请求发给UP状态的服务实例
eureka.client.healthcheck.enabled=true。注意这个配置只能配置在application.yml中,配置在bootstrap.yml中可能导致注册服务时,服务以状态为UNKOWN进行注册。Eureka Server是没有后端存储的,服务实例需要通过心跳来更新注册信息,注册信息存于内存中,Eureka Client也有一个基于内存的缓存,不需要每次请求服务都要访问注册中心获取服务地址信息。
Eureka的自我保护机制:Eureka Server在短时间内丢失比较多的客户端时,会进入自我保护模式,在该模式下,Eureka Server即使发现服务实例已经不再发送心跳了,也不会从服务注册表中删除。这样,当发生网络故障时,服务注册信息仍然存于Eureka中,当网络故障恢复后,会自动退出自我保护模式。自我保护模式是一种应对网络异常的安全保护机制。相关配置:
eureka.server.renewal-percent-threshold, 触发自我保护机制的阈值,默认为0.85;eureka.server.enable-self-preservation, 自我保护开启,默认为true,如果设置为false,则关闭客户端程序后,可直观地从Eureka Server的页面发现服务实例被注销删除了。
认真生活,快乐分享
欢迎关注公众号:空山新雨的技术空间
Spring Cloud(一):服务注册中心Eureka的更多相关文章
- spring cloud(二)服务(注册)中心Eureka
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼
Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...
- 使用Spring Cloud搭建服务注册中心
我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...
- spring cloud(服务注册中心及服务提供者——初学一)
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- Spring Cloud 之服务注册中心高可用
服务注册中心高可用 服务注册中心 eureka-server 高可用实施 版本 Spring Boot 版本 # Spring Boot 版本: <parent> <groupId& ...
- spring cloud (一) 服务注册中心 Eueka
1 pom.xml 添加依赖包 <dependency> <groupId>org.springframework.cloud</groupId> <arti ...
- spring cloud 服务注册中心eureka高可用集群搭建
spring cloud 服务注册中心eureka高可用集群搭建 一,准备工作 eureka可以类比zookeeper,本文用三台机器搭建集群,也就是说要启动三个eureka注册中心 1 本文三台eu ...
- 孰能巧用 Spring Cloud 服务注册中心Eureka
Eureka介绍 在Spring Cloud Netflix 整合技术栈中,Eureka既可以作为服务注册中心也可以用于服务发现对整个微服务架构起着最核心的整合作用. Eureka是基于REST(Re ...
- spring Cloud服务注册中心Eureka集群
spring Cloud服务注册中心Eureka集群配置: 在application.yml文件加以下配置: server: port: 8761 tomcat: uri-encoding: UTF- ...
随机推荐
- poj 2996
提示:很烦很简单的国际象棋棋盘模拟,输入比较麻烦而已 输出时: 1.不论黑白,KQRBN P均是依次输出,强制大写,但不输出“P”,只输出其坐标 2.对白棋的位置,小行优先大行输出(行的数字越小则优先 ...
- solaris 10 基本使用
1. 新增用户 注释掉home行# cat /etc/auto_master # # Copyright 2003 Sun Microsystems, Inc. All rights reserved ...
- java 利用Class获取类的属性信息
package junereflect624; import java.lang.reflect.Modifier; class A { } interface B{ } interface C{ } ...
- 提前终止forEach技巧,使用try catch
学习react优化性能的时候,在render之前,生命周期shouldComponentUpdate里判断前后两次数据是否一致,使用了forEach嵌套if语句,如果满足条件想直接break跳出for ...
- url查找参数
function GetUrlParam(paraName) { var url = document.location.toString(); var arrObj = url.split(&quo ...
- Linux 内核 中断 urb
函数 usb_fill_int_urb 是一个帮忙函数, 来正确初始化一个 urb 来发送给 USB 设备的 一个中断端点: void usb_fill_int_urb(struct urb *urb ...
- vue-learning:11 -js-nextTick()
nextTick() 在jQuery中,如果我们要生成一个ul-li的列表元素,我们也不会在循环体中每生成一个li就将它插入到ul中,而是在循环体内拼接每个li,待循环体结束后,再一并添加到ul元素上 ...
- Java 学习笔记(10)——容器
之前学习了java中从语法到常用类的部分.在编程中有这样一类需求,就是要保存批量的相同数据类型.针对这种需求一般都是使用容器来存储.之前说过Java中的数组,但是数组不能改变长度.Java中提供了另一 ...
- Android 最新架构
1.Android系统架构 最新的Android系统分为五层六区(域): Linux内核层(Linux Kernel):Android系统基于Linux2.6内核,这一层为Android设备各种硬件提 ...
- centos 下yum lock的解决办法
centos 下yum lock的解决办法 centos7下yum install的时候,报了一堆错误,如下: Another app is currently holding the yum loc ...