Eurea是Netflix提供的一款开源的提供服务注册与发现的产品。它提供了完整的Service Registry和Service Discovery实现,是Spring cloud体系中最重要最核心的组件之一
服务中心
服务中心即注册中心,管理各种服务功能包括服务的注册、发现、熔断、负载、降级等,比如dubbo admin后台的各种功能。在没有服务中心时各个系统之间的调用方式是直接调用,如图:
在有服务中心以后,任何应用之间都不能互相直接调用,需要先通过服务中心来调用:
应用A调用应用B,应用B再调用应用C:
有服务中心则需要分两步,A通过服务中心调用B,B通过服务中心调用C:
上述情况仅仅是两三个应用相互调用的情况下,如果应用多了的情况,互相调用的情况会变得及其复杂。一旦某个应用有改动会影响好几个应用重启,麻烦且易出错。使用服务中心不需要关注所调用的应用的服务IP地址有多少台服务器,每次调用直接去服务中心取服务即可。
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结构图
- Eureka Server: 提供服务注册与发现
- Service Provider: 服务提供方,注册自身到server使得consumer能够找到。
- Service Consumer: 服务消费方,从Eureka Service获取服务列表用于消费。
Eureka Server实例
单节点
- 新建一个spring boot 项目cloud
- 在cloud中新建一个模块,选中项目右键->new->module->next
改名继续next
选中Eureka Server继续next直到结束。
- 添加如下配置:
spring:
application:
name: spring-cloud-eureka
server:
port: 8000
eureka:
client:
#表示是否将自己注册到Eureka Server,默认为true。
register-with-eureka: false
#表示是否从Eureka Server获取注册信息,默认为true。
fetch-registry: false
#设置与Eureka Server交互的地址,查询服务和注册服务都需要依赖这个地址。默认是http://localhost:8761/eureka ;
#多个地址可使用 , 分隔。
service-url:
defaultZone: http://localhost:${server.port}/eureka/
- 在启动类中加上@EnableEurekaServer,直接启动
- 启动成功后打开http://localhost:8000/,暂时没有服务注册
集群
注册中心作为springcloud中及其关键的部分,如果是单节点一旦遇到故障那后果就是毁灭性的。服务注册中心作为最重要的基础部分,应当随时都能够提供服务。为了维持其可用性,集群是很好的解决方案。Eureka通过互相注册的方式来实现高可用的部署。只需要将Eureka Server配置为其他的ServiceUrl即可实现高可用部署。
双节点注册中心搭建
- 新建一个模块,步骤同上
- 新建配置文件application-node1.yml
spring:
application:
name: spring-cloud-eureka
freemarker:
prefer-file-system-access: false
server:
port: 8001
eureka:
client:
serviceUrl:
defaultZone: http://node2:8002/eureka/
instance:
hostname: node1
application-node2.yml:
spring:
application:
name: spring-cloud-eureka
server:
port: 8002
eureka:
client:
serviceUrl:
defaultZone: http://node1:8001/eureka/
instance:
hostname: node2
- 修改hosts文件 C:\Windows\System32\drivers\etc\
127.0.0.1 node1
127.0.0.1 node2
- 启动类增加@EnableEurekaServer注解
- 执行以下命令
mvn clean package -pl 指定的模块名 -am
#分别以node1,node2启动服务
java -jar eureka-server-double-node-0.0.1-SNAPSHOT.jar --spring.profiles.active=node1
java -jar eureka-server-double-node-0.0.1-SNAPSHOT.jar --spring.profiles.active=node2
多节点注册中心搭建
实际项目中会需要多个注册中心节点来维持其可用性,原理都是一一致的将注册中心分别指向其他注册中心即可。
新建一个模块,三个注册中心application.yml配置文件如下
---
spring:
application:
name: spring-cloud-eureka
profiles: node1
server:
port: 8001
eureka:
instance:
hostname: node1
client:
serviceUrl:
defaultZone: http://node2:8002/eureka/,http://node3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: node2
server:
port: 8002
eureka:
instance:
hostname: node2
client:
serviceUrl:
defaultZone: http://node1:8001/eureka/,http://node3:8003/eureka/
---
spring:
application:
name: spring-cloud-eureka
profiles: node3
server:
port: 8003
eureka:
instance:
hostname: node3
client:
serviceUrl:
defaultZone: http://node1:8001/eureka/,http://node2:8002/eureka/