Eureka

按照官方介绍:

Eureka is a REST (Representational State Transfer) based service that is primarily used in the AWS cloud for locating services for the purpose of load balancing and failover of middle-tier servers.

Eureka 是一个基于 REST 的服务,主要在 AWS 云中使用, 定位服务来进行中间层服务器的负载均衡和故障转移。

Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现。Eureka 采用了 C-S 的设计架构。Eureka Server 作为服务注册功能的服务器,它是服务注册中心。而系统中的其他微服务,使用 Eureka 的客户端连接到 Eureka Server,并维持心跳连接。这样系统的维护人员就可以通过 Eureka Server 来监控系统中各个微服务是否正常运行。Spring Cloud 的一些其他模块(比如Zuul)就可以通过 Eureka Server 来发现系统中的其他微服务,并执行相关的逻辑。

Eureka由两个组件组成:Eureka服务器和Eureka客户端。Eureka服务器用作服务注册服务器。Eureka客户端是一个java客户端,用来简化与服务器的交互、作为轮询负载均衡器,并提供服务的故障切换支持。Netflix在其生产环境中使用的是另外的客户端,它提供基于流量、资源利用率以及出错状态的加权负载均衡。

用一张图来认识以下:

上图简要描述了Eureka的基本架构,由3个角色组成:

1、Eureka Server

  • 提供服务注册和发现

2、Service Provider

  • 服务提供方
  • 将自身服务注册到Eureka,从而使服务消费方能够找到

3、Service Consumer

  • 服务消费方
  • 从Eureka获取注册服务列表,从而能够消费服务

案例实践

Eureka Server 单点模式

spring cloud已经帮我实现了服务注册中心,我们只需要很简单的几个步骤就可以完成。

1、pom中添加依赖

<dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka-server</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency>
</dependencies>

2、添加启动代码中添加@EnableEurekaServer注解

@SpringBootApplication
@EnableEurekaServer
public class EurekaServerApplication {public static void main(String[] args) {SpringApplication.run(EurekaServerApplication.class, args);}
}

3、配置文件

在默认设置下,该服务注册中心也会将自己作为客户端来尝试注册它自己,所以我们需要禁用它的客户端注册行为,在application.properties添加以下配置:

server:port: 9010
spring:application:name: spring-cloud-eureka
eureka:instance:prefer-ip-address: falseclient:serviceUrl:defaultZone: http://localhost:${server.port}/eureka/
  • eureka.client.register-with-eureka :表示是否将自己注册到Eureka Server,默认为true。
  • eureka.client.fetch-registry :表示是否从Eureka Server获取注册信息,默认为true。我的职责就是维护服务实例,并不需要去检索服务
  • eureka.client.serviceUrl.defaultZone :设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;多个地址可使用 , 分隔。
  • prefer-ip-address: false: 在Eureka中如果不指定任何的Ip参数的话,那么提供者注册到Eureka中,消费者进行消费的时候访问的Ip为部署Eureka服务器的Ip地址。【参考:https://www.jianshu.com/p/886947b52cb4】

启动工程后,访问:http://localhost:9010/,可以看到下面的页面,其中还没有发现任何服务

Eureka Server 集群模式

注册中心这么关键的服务,如果是单点话,遇到故障就是毁灭性的。在一个分布式系统中,服务注册中心是最重要的基础部分,理应随时处于可以提供服务的状态。为了维持其可用性,使用集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署,所以我们只需要将Eureke Server配置其他可用的serviceUrl就能实现高可用部署。

双节点注册中心

首次我们尝试一下双节点的注册中心的搭建。

  • 1、创建application.yml,添加2个服务中心:peer1:9010,peer2:9011.配置如下配置
spring:application:name: spring-cloud-eureka
eureka:instance:prefer-ip-address: falseclient:serviceUrl:defaultZone: http://localhost:${server.port}/eureka/register-with-eureka:  falsefetch-registry: false---
spring:profiles: peer1
server:port: 9010
eureka:instance:hostname: peer1client:serviceUrl:defaultZone: http://peer2:9011/eureka,http://peer3:9012/eureka
---
spring:profiles: peer2
server:port: 9011
eureka:instance:hostname: peer2client:serviceUrl:defaultZone: http://peer1:9010/eureka,http://peer3:9012/eureka
  • 2、host转换(windows host 路径:C:\Windows\System32\drivers\etc)

在hosts文件中加入如下配置

127.0.0.1 peer1
127.0.0.1 peer2
  • 3、启动运行
    添加启动参数运行(添加两个启动)

打包运行依次执行下面命令

#打包
mvn clean package
# 分别以peer1和peeer2 配置信息启动eureka
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
    1. 依次启动完成后,浏览器输入:http://localhost:9010/ 效果图如下:

根据图可以看出peer1的注册中心DS Replicas已经有了peer2的相关配置信息,并且出现在available-replicas中。我们手动停止peer2来观察,发现peer2就会移动到unavailable-replicas一栏中,表示peer2不可用。

到此双节点的配置已经完成。

eureka集群使用

在生产中我们可能需要三台或者大于三台的注册中心来保证服务的稳定性,配置的原理其实都一样,将注册中心分别指向其它的注册中心。这里只介绍三台集群的配置情况,其实和双节点的注册中心类似,每台注册中心分别又指向其它两个节点即可,使用application.yml来配置。

application.yml配置详情如下:

spring:application:name: spring-cloud-eureka
eureka:instance:prefer-ip-address: falseclient:serviceUrl:defaultZone: http://localhost:${server.port}/eureka/register-with-eureka:  falsefetch-registry: false---
spring:profiles: peer1
server:port: 9010
eureka:instance:hostname: peer1client:serviceUrl:defaultZone: http://peer2:9011/eureka,http://peer3:9012/eureka
---
spring:profiles: peer2
server:port: 9011
eureka:instance:hostname: peer2client:serviceUrl:defaultZone: http://peer1:9010/eureka,http://peer3:9012/eureka
---
spring:profiles: peer3
server:port: 9012
eureka:instance:hostname: peer3client:serviceUrl:defaultZone: http://peer1:9010/eureka,http://peer2:9011/eureka

分别以peer1、peer2、peer3的配置参数启动eureka注册中心。

java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer1
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer2
java -jar spring-cloud-eureka-0.0.1-SNAPSHOT.jar --spring.profiles.active=peer3

依次启动完成后,浏览器输入:http://localhost:8000/ 效果图如下:

可以在peer1中看到了peer2、peer3的相关信息。至此eureka集群也已经完成了

Eureka Client 注册

一般由服务提供方将自身服务注册到Eureka Server,从而使服务消费方能够找到

    1. pom 中添加依赖
<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-eureka</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency>
    1. 创建应用主类。@EnableDiscoveryClient 注解开启Eureka客户端,将当前应用加入到服务治理体系中。
@EnableDiscoveryClient
@SpringBootApplication
public class EurekaClient1Application {public static void main(String[] args) {SpringApplication.run(EurekaClient1Application.class, args);}
}
  • 3.启动 Eureka Client,刷新Eureka server 页面就可以发现 Eureka Client注册进来了

获取服务

消费者服务启动时,会发送一个Rest请求给服务注册中心,来获取上面注册的服务清单。为了性能考虑,Eureka Server会维护一份只读的服务注册清单来返回给客户端,同时该缓存清单默认会每隔30秒更新一次。
eureka.client.registery-fetch-interval-seconds:从Eureka服务器端获取注册信息的间隔时间,单位:秒,默认是30秒(对于api-gateway,如果要迅速获取服务注册状态,可以缩小该值,比如5秒)**

**eureka.client.eureka-server-connect-timeout-seconds:连接 Eureka Server 的超时时间,单位:秒,默认是5秒
eureka.client.eureka-server-read-timeout-seconds:读取 Eureka Server信息的超时时间,单位:秒,默认是8秒
eureka.client.filter-only-up-instances:获取实例时是否过滤,只保留UP状态的实例,默认为true
eureka.client.eureka-connection-idle-timeout-seconds:Eureka 服务端连接空闲关闭时间,单位:秒,默认是30秒
eureka.client.eureka-server-total-connections:从Eureka 客户端到所有Eureka服务端的连接总数,默认是200
eureka.client.eureka-server-total-connections-per-host:从Eureka客户端到每个Eureka服务主机的连接总数,默认是50

服务调用

服务消费者在获取服务清单后,通过服务名可以获取具体提供服务的实例名和该实例的元数据信息。因为有这些服务实例的详细信息,所以客户端可以根据自己的需要决定具体调用哪个实例,在Ribbon中会默认采用轮询的方式进行调用,从而实现客户端的负载均衡。

服务下线

在系统运行过程中必然会面临关闭或重启服务的某个实例的情况,在服务关闭操作时,会触发一个服务下线的Rest服务请求给Eureka Server,告诉服务注册中心该服务下线了。服务端在接收到该请求后,将该服务状态置位下线(DOWN),并把该下线事件传播出去。

服务启动

一定要先启动Eureka Server再启动Eureka Client
不然会报com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server意思就是找不到服务端

注:在测试的时候没加web依赖同样是报找不到服务端,所以还是加上吧

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>

官方对于自我保护机制的说明

自我保护模式正是一种针对网络异常波动的安全保护措施,使用自我保护模式能使Eureka集群更加的健壮、稳定的运行。

自我保护机制的工作机制是如果在15分钟内超过85%的客户端节点都没有正常的心跳,那么Eureka就认为客户端与注册中心出现了网络故障,Eureka Server自动进入自我保护机制,

此时会出现以下几种情况:
1、Eureka Server不再从注册列表中移除因为长时间没收到心跳而应该过期的服务。
2、Eureka Server仍然能够接受新服务的注册和查询请求,但是不会被同步到其它节点上,保证当前节点依然可用。
3、当网络稳定时,当前Eureka Server新的注册信息会被同步到其它节点中。
因此Eureka Server可以很好的应对因网络故障导致部分节点失联的情况,
而不会像Zookeeper那样如果有一半不可用的情况会导致整个集群不可用而变成瘫痪。

在开发模式下可以关闭保护机制

# 关闭保护机制,以确保注册中心可以将不用的实例正确剔除(本地调试可以使用,线上不推荐)
# 当Eureka服务器在短时间内丢失过多客户端时,自我保护模式可使服务端不再删除失去连接的客户端
eureka.server.enable-self-preservation=false

关于开启Eureka客户端

上面我们使用的是@EnableEurekaClient注解
其实@EnableDiscoveryClient@EnableEurekaClient都是可以的
SpringCloud中发现服务有许多种实现(eureka、consul、zookeeper等等)。
@EnableDiscoveryClient基于spring-cloud-commons,
@EnableEurekaClient基于spring-cloud-netflix

如果选用的注册中心是eureka,那么就推荐@EnableEurekaClient
如果是其他的注册中心,那么推荐使用@EnableDiscoveryClient

Spring Cloud(二): 注册中心Eureka的使用相关推荐

  1. Spring Cloud 服务注册中心Eureka

    Eureka介绍 在Spring Cloud Netflix 整合技术栈中,Eureka既可以作为服务注册中心也可以用于服务发现对整个微服务架构起着最核心的整合作用. Eureka是基于REST(Re ...

  2. 3.spring cloud + zookeeper注册中心 + Feign调用案例

    3.spring cloud + zookeeper注册中心 + Feign调用案例 3.1.pom.xml定义 <?xml version="1.0" encoding=& ...

  3. Spring Cloud的注册中心和服务者,消费者的构建

    注册中心Eureka: 新建项目stu-eureka: StuEurekaApplication: package com.demo.stueureka;import org.springframew ...

  4. spring cloud Euraka注册中心实例Dalston

    1.介绍:注册中心eureka是spring cloud微服务架构的基石,所有服务比如网关.配置中心等等都需要依赖于网关服务.当然你也可以使用zokkeeper来替代.两者最主要区别是zk有leade ...

  5. 【Spring Cloud】注册中心-Euraka

    Eureka是什么 eureka是springcloud Netflix微服务套件中的一部分,是一个服务注册和发现模块. eureka包含了服务器端和客户端组件.服务器端,也被称作是服务注册中心,用于 ...

  6. 【065】Spring Cloud服务注册中心双节点集群,使用Eureka实现,以IP方式配置,基于Spring Cloud的Camden SR5版本

    Spring Cloud 封装了 Netflix 公司开发的 Eureka 模块来实现服务注册和发现.Eureka 采用了 C-S 的设计架构.Eureka Server 作为服务注册功能的服务器,它 ...

  7. Spring Cloud ---02-- Eureka注册中心

    Eureka 注册中心 作用:服务注册和发现 提供者(Provider) 向注册中心注册自己的地址 消费者(Consumer) 从注册中心发现其他服务 eureka的运行机制 注册 - 一次次反复连接 ...

  8. Spring cloud nacos注册中心 seata分布式事务

    准备环境的软件 seata 官网地址为 Seata 是什么 基本介绍 ,一下是一些大企业在使用 下载资源 GitHub - seata/seata: Seata is an easy-to-use, ...

  9. 什么是Vant? Spring Cloud Nacos注册中心

    文章目录 Vant 什么是Vant Vant的优势 Vant特性 第一个Vant程序 创建Vue项目 添加\安装Vant支持 添加Vant引用 按钮组件 表单页面 area省市区选择 商品列表 服务器 ...

  10. 【Spring Cloud】注册中心-Nacos

    1.名字的由来 前四个字母分别为 Naming 和 Configuration 的前两个字母,最后的 s 为 service 2.是什么 Nacos是一个更易于构建云原生应用的动态服务发现.配置管理和 ...

最新文章

  1. linux命令:ln 使用方法
  2. 设计模式 分类和原则
  3. Qt Creator使用Bazaar集市
  4. dynamodb java_使用Java更新DynamoDB项
  5. AssertJ断言系列一
  6. Java设计模式学习总结(6)——创建型模式之原型模式
  7. 风控人必知必会的征信知识
  8. dubbo超时机制原理
  9. 可编程并行接口芯片8255
  10. 计算二叉树叶子结点数目(C语言)
  11. Java_GPS经纬度转坐标
  12. 小米盒子显示连不上服务器,小米盒子连不上WiFi?这七个技巧绝对管用
  13. CVPR2020 3D点云相关论文思想和方法总结
  14. 麻雀要革命2 第44节:怦然心动的星月童话
  15. laravel-admin Model does not exists添加模型报错
  16. 企业级DevOps容器云平台流水线综合解决方案详解(一)
  17. 〖Web全栈开发③〗—HTTP协议和静态web服务器
  18. 万向节死锁的个人理解
  19. 微信小程序打开微信公众号中的文章实战教程
  20. 网络安全--解除认证攻击wifi(详细教程)

热门文章

  1. Science组合图表解读
  2. QIIME 2教程. 08差异丰度分析gneiss(2020.11)
  3. 扩增子图表解读5火山图:差异OTU的数量及变化规律
  4. R语言ggplot2可视化:ggplot2可视化分组散点图并使用geom_smooth函数在散点图图中为不同的散点簇添加对应的回归曲线
  5. R语言ggplot2可视化将颜色图例和形状的图例组合成综合图例实战
  6. R语言临床预测模型的评价指标与验证指标实战:自定义的净重新分类指数NRI(Net Reclassification Index, NRI)函数
  7. R语言libPaths函数获取或者设置包安装的路径实战
  8. 3D Slicer实现纤维追踪(大脑纤维束成像)+核磁共振影像数据处理
  9. 机器翻译之Facebook的CNN与Google的Attention
  10. Benchmarking of long-read correction methods长期校正方法的基准测试