什么是集群?

在讲解如何搭建eureka集群前,先给大家普及一下集群的概念,有些小伙伴可能还不知道什么是集群。

说到集群可能就有人会想到分布式,可能有很多人对分布式集群这两个概念有点混淆:

  • 分布式:将一套系统拆分成不同子系统部署在不同服务器上
  • 集群:部署多个相同的子系统在不同的服务器上

分布式的每一个子系统,完成的是不同的业务,一台服务挂了,那么这个业务功能就无法访问了,甚至可能会影响到其他业务。而集群是多个子系统完成的是一个业务,正因为这样,其中一台服务挂了,其他服务节点可以顶上来,从而保证了服务的健壮性。

所以说,集群可以理解为:你中有我,我中有你,手拉手肩并肩,一起保证服务的健壮性

Eureka集群原理



微服务和集群的关系 微服务怎么做集群_SpringCloud


基本原理

上图是来自eureka的官方架构图,这是基于集群配置的eureka;

  • 处于不同节点的eureka通过Replicate进行数据同步
  • Application Service为服务提供者
  • Application Client为服务消费者
  • Make Remote Call完成一次服务调用

服务启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。

当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。

服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

Eureka集群搭建

在搭建eureka集群前,咱们先来回顾一下,单个eureka服务的时候,是如何来配置的

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)

从上面的配置文件可以看出,eureka7001就是一个eureka服务,所有服务都是往这台服务上注册。那么我们如何去搭建一个 Eureka 集群呢?假设现在有三个 Eureka 服务:eureka7001eureka7002eureka7003

为了体现出集群的你中有我,我中有你,不难想象,eureka7001 中应该挂上 eureka7002eureka7003eureka7002中应该挂上 eureka7001eureka7003eureka7003 中应该挂上 eureka7001eureka7002。如下图所示:

微服务和集群的关系 微服务怎么做集群_微服务和集群的关系_02


现在集群的雏形已经有了,下面我们来一步步实现。

Eureka7001改造

修改defaultZone配置。

server:
  port: 7001

eureka:
  instance:
    hostname: eureka7001 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
      defaultZone: http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)

搭建Eureka7002

将Eureka7001拷贝一份,修改其配置文件即可

server:
  port: 7002

eureka:
  instance:
    hostname: eureka7002 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7003:7003/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)

搭建Eureka7003

步骤同上

server:
  port: 7003

eureka:
  instance:
    hostname: eureka7003 #eureka服务端的实例名称
  client:
    register-with-eureka: false #false表示不向注册中心注册自己。
    fetch-registry: false #false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
    service-url:
      #defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(单机)
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/ #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址。(集群)

host映射

从前面的配置文件可以看到,为了区分不同的服务,hostname不再是localhost了,因此我们还要修改一下host文件,此处环境为Mac,Windows下如何修改host文件自行百度

打开命令行,输入sudo vi /private/etc/hosts 修改host文件。注意:执行此命令需要输入用户密码
将一下内容添加到host文件中,保存即可:

127.0.0.1 eureka7001
127.0.0.1 eureka7002
127.0.0.1 eureka7003

用户服务提供者改造

因为现在是集群模式,所有我们需要将服务分别注册到三个eureka中,同样是修改defaultZone配置

server:
  port: 8001

mybatis:
  config-location: classpath:mybatis/mybatis-config.xml        # mybatis配置文件所在路径
  type-aliases-package: com.chaytech.model.*    # 所有Entity别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件

spring:
   application:
    name: user-provider
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://127.0.0.1:3306/spring_cloud_db01              # 数据库名称
    username: root
    password: root
    dbcp2:
      min-idle: 5                                           # 数据库连接池的最小维持连接数
      initial-size: 5                                       # 初始化连接数
      max-total: 5                                          # 最大连接数
      max-wait-millis: 200                                  # 等待连接获取的最大超时时间

eureka:
  client: #客户端注册进eureka服务列表内
    service-url:
      #defaultZone: http://localhost:7001/eureka (单机)
      defaultZone: http://eureka7001:7001/eureka/,http://eureka7002:7002/eureka/,http://eureka7003:7003/eureka/ #(集群)

info:
  app.name: user-provider
  build.artifactId: $project.artifactId$
  build.version: $project.version$

测试

通过前面的步骤已经将eureka集群搭建好了,下面我们来测试一下:

依次启动Eureka7001、Eureka7002、Eureka7003、UserProvider8001等服务

访问Eureka7001:http://eureka7001:7001/

微服务和集群的关系 微服务怎么做集群_微服务架构_03


可以看到Eureka7001上挂着 eureka7002eureka7003,并且用户服务也成功注册到该注册中心接着访问Eureka7002:http://eureka7002:7002/

微服务和集群的关系 微服务怎么做集群_SpringCloud_04


可以看到Eureka7002上挂着 eureka7001eureka7003,并且用户服务也成功注册到该注册中心接着访问Eureka7003:http://eureka7003:7003/

微服务和集群的关系 微服务怎么做集群_SpringCloud_05


可以看到Eureka7003上挂着 eureka7001eureka7002,并且用户服务也成功注册到该注册中心