Spring Cloud Eureka 服务注册中心(二)
序言
Eureka 是 Netflix 开发的,一个基于 REST 服务的,服务注册与发现的组件
它主要包括两个组件:Eureka Server 和 Eureka Client
- Eureka Client:一个Java客户端,用于简化与 Eureka Server 的交互(通常就是微服务中的客户端和服务端)
- Eureka Server:提供服务注册和发现的能力(通常就是微服务中的注册中心)

各个微服务启动时,会通过 Eureka Client 向 Eureka Server 注册自己,Eureka Server 会存储该服务的信息
也就是说,每个微服务的客户端和服务端,都会注册到 Eureka Server,这就衍生出了微服务相互识别的话题
- 同步:每个 Eureka Server 同时也是 Eureka Client(逻辑上的)
多个 Eureka Server 之间通过复制的方式完成服务注册表的同步,形成 Eureka 的高可用 - 识别:Eureka Client 会缓存 Eureka Server 中的信息
即使所有 Eureka Server 节点都宕掉,服务消费者仍可使用缓存中的信息找到服务提供者(笔者已亲测) - 续约:微服务会周期性(默认30s)地向 Eureka Server 发送心跳以Renew(续约)信息(类似于heartbeat)
- 续期:Eureka Server 会定期(默认60s)执行一次失效服务检测功能
它会检查超过一定时间(默认90s)没有Renew的微服务,发现则会注销该微服务节点
Spring Cloud 已经把 Eureka 集成在其子项目 Spring Cloud Netflix 里面
关于 Eureka 配置的最佳实践,可参考:https://github.com/spring-cloud/spring-cloud-netflix/issues/203
更多介绍,可参考:http://cloud.spring.io/spring-cloud-static/Camden.SR4/#spring-cloud-eureka-server
单个Eureka Server配置部署实例
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
</dependencies> <dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
注册中心,启动类。
@SpringBootApplication
//创建服务注册中心
@EnableEurekaServer
public class StartMain {
public static void main(String[] args) {
SpringApplication.run(StartMain.class, args);
}
}
注册中心配置文件
## server
server.port=8081 ##eureka
#指定环境
eureka.environment=work
# 设置是否将自己作为客户端注册到注册中心(缺省true)
# 这里为不需要(查看@EnableEurekaServer注解的源码,会发现它间接用到了@EnableDiscoveryClient)
eureka.client.register-with-eureka=false
# 设置是否从注册中心获取注册信息(缺省true)
# 因为这是一个单点的EurekaServer,不需要同步其它EurekaServer节点的数据,故设为false
eureka.client.fetch-registry=false
eureka.client.serviceUrl.defaultZone=http://localhost:${server.port}/eureka/
#是否开启自我保护模式,默认为true。
eureka.server.enable-self-preservation=true
#续期时间,即扫描失效服务的间隔时间(缺省为60*1000ms)
eureka.server.eviction-interval-timer-in-ms=10000
zone
上面提到 serviceUrl,那就顺便说下 defaultZone
Eureka 有一个 Region 和 Zone 的概念,你可以理解为现实中的大区(Region)和机房(Zone)
Eureka Client 在启动时需要指定 Zone,它会优先请求自己 Zone 的 Eureka Server 获取注册列表
同样的,Eureka Server 在启动时也需要指定 Zone,如果没有指定的话,其会默认使用 defaultZone
详见源码中的 getEurekaServerServiceUrls() 方法:https://github.com/spring-cloud/spring-cloud-netflix/blob/master/spring-cloud-netflix-eureka-client/src/main/java/org/springframework/cloud/netflix/eureka/EurekaClientConfigBean.java
note:
现在启动Eureka Server,没有Eureka Client,过一段时间会出现
EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE
UP WHEN THEY'RE NOT. RENEWALS ARE LESSER THAN THRESHOLD AND
HENCE THE INSTANCES ARE NOT BEING EXPIRED JUST TO BE SAFE.
这说明Eureka进入保护模式,可通过上述配置去掉,Eureka的保护模式讲解详见:https://github.com/Netflix/eureka/wiki/Understanding-Eureka-Peer-to-Peer-Communication

Eureka Client配置部署实现
pom文件
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<version>2.0.0.RELEASE</version>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Finchley.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
微服务client,启动类。
@SpringBootApplication
@EnableEurekaClient
public class StartMain {
public static void main(String[] args) {
SpringApplication.run(StartMain.class, args);
}
}
微服务client,配置文件
##eureka
eureka.client.serviceUrl.defaultZone=http://localhost:8081/eureka/
eureka.instance.instance-id=${spring.application.name}:${server.port}
# 设置微服务调用地址为IP优先(缺省为false)
eureka.instance.prefer-ip-address=true
# 心跳时间,即服务续约间隔时间(缺省为30s)
eureka.instance.lease-renewal-interval-in-seconds=30
# 发呆时间,即服务续约到期时间(缺省为90s)
eureka.instance.lease-expiration-duration-in-seconds=90
note:
关于续约序言中有讲解,instance-id,是再注册中心页面显示的微服务名。
Eureka 首页显示的微服务名默认为:机器主机名:应用名称:应用端口,也就是:${spring.cloud.client.hostname}:${spring.application.name}:${spring.application.instance_id:${server.port}}
eureka.client.serviceUrl.defaultZone这个配置可以配置单个注册中心的地址,也可配置多个,逗号隔开
eureka.client.serviceUrl.defaultZone=http://127.0.0.1:8000/eureka/,http://127.0.0.1:8081/eureka/
好啦,这样一个注册中心与微服务就完成啦。启动看看吧。
Eureka Server注册中心(高可用)集群部署
Eureka Server 支持运行多实例,并以互相注册的方式(即伙伴机制),来实现高可用的部署
即每一台 Eureka 都在配置中指定另一个 Eureka 或多个 地址作为伙伴,它在启动时会向伙伴节点获取注册列表
详见:http://cloud.spring.io/spring-cloud-static/spring-cloud.html#_peer_awareness
配置demo
与单Server配置稍作改动,如下三个注册中心ABC
A:127.0.0.1:9001
B:127.0.0.1:9002
C:127.0.0.1:9003
A配置: eureka.client.serviceUrl.defaultZone : http://B/eureka/,http://C/eureka/
B配置: eureka.client.serviceUrl.defaultZone : http://A/eureka/,http://C/eureka/
C配置: eureka.client.serviceUrl.defaultZone : http://B/eureka/,http://A/eureka/
运行不同环境
java -jar .\trade-0.0.1-SNAPSHOT.jar --spring.profiles.active=local
ok啦,试试吧。
配置
服务端
server:
# 项目端口号
port: 8761
# SSL 配置
ssl:
# 开启 SSL 认证
enabled: true
# 证书别名
key-alias: eurekaserver
# 证书存放路径
key-store: classpath:EurekaServer.p12
# 证书密码
key-store-password: 123456
# 存储类型
key-store-type: PKCS12 spring:
application:
name: demo-eureka-server
# 开启安全控制
security:
user:
# 用户名
name: eureka-server
# 密码
password: 8e9lx7LuP3436gfsg eureka:
instance:
# 主机名
hostname: localhost
# 使用 ip 注册到注册中心实例化
prefer-ip-address: true
# 安全端口
secure-port: ${server.port}
# 指示是否应为流量启用安全端口
secure-port-enabled: true
# 关闭非安全端口
non-secure-port-enabled: false
home-page-url: https://${eureka.instance.hostname}:${server.port}/
status-page-url: https://${eureka.instance.hostname}:${server.port}/actuator/info
health-check-url: https://${eureka.instance.hostname}:${server.port}/actuator/health
client:
# 此实例是否从注册中心获取注册信息
fetch-registry: false
# 是否将此实例注册到注册中心
register-with-eureka: false
# 注册地址
service-url:
# 默认注册分区地址
defaultZone: https://${eureka.instance.hostname}:${server.port}/eureka/
server:
# 同步为空时,等待时间
wait-time-in-ms-when-sync-empty: 0
# 是否开启自我保护机制
## 在分布式系统设计里头,通常需要对应用实例的存活进行健康检查,这里比较关键的问题就是要处理好网络偶尔抖动或短暂不可用时造成的误判。另外Eureka Server端与Client端之间如果出现网络分区问题,在极端情况下可能会使得Eureka Server清空部分服务的实例列表,这个将严重影响到Eureka server的 availibility属性。因此Eureka server引入了SELF PRESERVATION机制。
## Eureka client端与Server端之间有个租约,Client要定时发送心跳来维持这个租约,表示自己还存活着。 Eureka通过当前注册的实例数,去计算每分钟应该从应用实例接收到的心跳数,如果最近一分钟接收到的续约的次数小于指定阈值的话,则关闭租约失效剔除,禁止定时任务剔除失效的实例,从而保护注册信息。
# 此处关闭可以防止问题(测试环境可以设置为false):Eureka server由于开启并引入了SELF PRESERVATION模式,导致registry的信息不会因为过期而被剔除掉,直到退出SELF PRESERVATION模式才能剔除。
enable-self-preservation: false
# 指定 Eviction Task 定时任务的调度频率,用于剔除过期的实例,此处未使用默认频率,频率为:5/秒,默认为:60/秒
# 有效防止的问题是:应用实例异常挂掉,没能在挂掉之前告知Eureka server要下线掉该服务实例信息。这个就需要依赖Eureka server的EvictionTask去剔除。
eviction-interval-timer-in-ms: 5000
# 设置read Write CacheMap的expire After Write参数,指定写入多长时间后过期
# 有效防止的问题是:应用实例下线时有告知Eureka server下线,但是由于Eureka server的REST API有response cache,因此需要等待缓存过期才能更新
response-cache-auto-expiration-in-seconds: 60
# 此处不开启缓存,上方配置开启一个即可
# use-read-only-response-cache: false
# 指定每分钟需要收到的续约次数的阈值,默认值就是:0.85
renewal-percent-threshold: 0.85
# 续约频率提高,默认:30
leaseRenewalIntervalInseconds: 10
客户端
server:
# \u9879\u76EE\u7AEF\u53E3\u53F7
port: 11200 spring:
application:
# Spring Boot \u9879\u76EE\u5B9E\u4F8B\u540D\u79F0
name: demo-goods ### \u6CE8\u518C\u4E2D\u5FC3\u914D\u7F6E
eureka:
instance:
# \u4E3B\u673A\u540D
hostname: localhost
# \u4F7F\u7528 ip \u6CE8\u518C\u5230\u6CE8\u518C\u4E2D\u5FC3\u5B9E\u4F8B\u5316
prefer-ip-address: true
client:
secure-port-enabled: true
ssl:
key-store: EurekaClient.p12
key-store-password: 123456
security:
user:
name: eureka-server
password: 8e9lx7LuP3436gfsg
# Spring Cloud Eureka \u6CE8\u518C\u4E2D\u5FC3\u5730\u5740
service-url:
defaultZone: https://${eureka.client.security.user.name}:${eureka.client.security.user.password}@${eureka.instance.hostname}:8761/eureka/
# \u9488\u5BF9\u65B0\u670D\u52A1\u4E0A\u7EBF, Eureka client\u83B7\u53D6\u4E0D\u53CA\u65F6\u7684\u95EE\u9898\uFF0C\u5728\u6D4B\u8BD5\u73AF\u5883\uFF0C\u53EF\u4EE5\u9002\u5F53\u63D0\u9AD8Client\u7AEF\u62C9\u53D6Server\u6CE8\u518C\u4FE1\u606F\u7684\u9891\u7387\uFF0C\u9ED8\u8BA4\uFF1A30\u79D2
registry-fetch-interval-seconds: 30
总结
多看文档,很容易理解的。
Spring Cloud Eureka 服务注册中心(二)的更多相关文章
- 如何优化Spring Cloud微服务注册中心架构?
作者: 石杉的架构笔记 1.再回顾:什么是服务注册中心? 先回顾一下什么叫做服务注册中心? 顾名思义,假设你有一个分布式系统,里面包含了多个服务,部署在不同的机器上,然后这些不同机器上的服务之间要互相 ...
- Spring Cloud之服务注册中心搭建Eureka Server服务注册中⼼
Spring Cloud并不与Spring MVC类似是一个开源框架,而是一组解决问题的规范(个人理解).解决哪些问题呢?如下: 1)服务管理:⾃动注册与发现.状态监管 2)服务负载均衡 3)熔断 4 ...
- spring cloud(服务注册中心及服务提供者——初学一)
Eureka是Netflix开源的一款提供服务注册和发现的产品,它提供了完整的Service Registry和Service Discovery实现.也是springcloud体系中最重要最核心的组 ...
- spring cloud Eureka 服务注册发现与调用
记录一下用spring cloud Eureka搭建服务注册与发现框架的过程. 为了创建spring项目方便,使用了STS. 一.Eureka注册中心 1.新建项目-Spring Starter Pr ...
- 使用Spring Cloud搭建服务注册中心
我们在之前的博客中已经介绍过阿里的分布式服务框架dubbo[Linux上安装Zookeeper以及一些注意事项][一个简单的案例带你入门Dubbo分布式框架],但是小伙伴们应该也看到了,阿里的dubb ...
- Spring Cloud Eureka 服务注册列表显示 IP 配置问题
服务提供者向 Eureka 注册中心注册,默认以 hostname 的形式显示,Eureka 服务页面显示的服务是机器名:端口,并不是IP+端口的形式 ,可以通过修改服务提供者配置自己的 IP 地址, ...
- SpringBoot + Spring Cloud Eureka 服务注册与发现
什么是Spring Cloud Eureka Eureka是Netflix公司开发的开源服务注册发现组件,服务发现可以说是微服务开发的核心功能了,微服务部署后一定要有服务注册和发现的能力,Eureka ...
- Spring Cloud 之服务注册中心高可用
服务注册中心高可用 服务注册中心 eureka-server 高可用实施 版本 Spring Boot 版本 # Spring Boot 版本: <parent> <groupId& ...
- spring cloud (一) 服务注册中心 Eueka
1 pom.xml 添加依赖包 <dependency> <groupId>org.springframework.cloud</groupId> <arti ...
随机推荐
- HTTP 响应的分块传输
Transfer-Encoding 响应头用于告诉客户端服务器发送内容的编码格式. 其可选值有: chunked:数据分块发送.此时应缺省 Content-Length 响应头. compress:使 ...
- WPF默认控件模板的获取和资源词典的使用
一.获取默认的控件模板 WPF修改控件模板是修改外观最方便的方式,但是会出现不知道原来的控件的模板长什么样,或者想用来参考的,下面分享一下获取某控件默认控件模板的方式(已Button为例): 1.创建 ...
- SpringBoot(九)RabbitMQ安装及配置和使用,消息确认机制
Windows下RabbitMQ安装及配置地址: https://blog.csdn.net/zhm3023/article/details/82217222RabbitMQ(四)订阅模式:https ...
- java笔记----cpu消耗快速定位代码
下载ProcessExplorer ProcessExplorer下载地址:ProcessExplorer 下载运行代码 打开ProcessExplorer 查看javaw.exe的pid jstac ...
- css媒体查询aspect-ratio宽高比在less中的使用
css媒体查询有一个 宽高比很方便,aspect-ratio ,可以直接使用宽/高 来进行页面适配 使用样例如下: // 宽高比在((320/50)+(728/90))/2 两个尺寸中间值以内 适 ...
- Sublime Text 3 插件安装、搭建Python、Java开发环境
一.下载并安装 Sublime Text 3 官网地址:http://www.sublimetext.com目前最新版本为:3.2.1 (BUILD 3207)安装时勾选“Add to explore ...
- Spark的Monitoring
一.启动历史页面监控配置: $ vi spark-defaults.conf spark.eventLog.enabled true spark.eventLog.dir hdfs://hadoop0 ...
- ts开发环境搭建
ts为typescript的缩写,是javascript的超集. npm源改为国内 由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源. npm config set registry ...
- 7.3 DStream操作
一.Spark Streaming工作机制 在Spark Streaming中,会有一个组件Receiver,作为一个长期运行的task跑在一个Executor上: 每个Receiver都会负责一个i ...
- vue+node+elementUI实现注册功能
后端代码 在后端的文件 routes文件夹下的connect.js文件中 // 引入mysql const mysql = require('mysql'); // 创建连接对象 const conn ...