springcloud实战篇二之Eureka-Server集群创建

下图为Eureka的官方架构图


上图描述了基于集群配置的eureka,由图总结出以下几条结论

1. 处于不同节点的eureka通过Replicate(复制)进行数据同步 

2. Application Service为服务提供者 集群

3. Application Client为服务消费者集群

4. Make Remote Call完成一次服务调用

服务提供者启动后向Eureka注册,Eureka Server会将注册信息向其他Eureka Server进行同步,当服务消费者要调用服务提供者,则向服务注册中心获取服务提供者地址,然后会将服务提供者地址缓存在本地,下次再调用时,则直接从本地缓存中取,完成一次调用。
当服务注册中心Eureka Server检测到服务提供者因为宕机、网络原因不可用时,则在服务注册中心将服务置为DOWN状态,并把当前服务提供者状态向订阅者发布,订阅过的服务消费者更新本地缓存。
服务提供者在启动后,周期性(默认30秒)向Eureka Server发送心跳,以证明当前服务是可用状态。Eureka Server在一定的时间(默认90秒)未收到客户端的心跳,则认为服务宕机,注销该实例。

Eureka的自我保护机制


在默认配置中,Eureka Server在默认90s没有得到客户端的心跳,就会注销该实例,但是经常由于微服务跨进程跨服务调用,网络通信偶尔会出现故障,例如微服务状态正常,但是因为网络分区之间故障时,Eureka Server注销服务实例则会让大部分微服务不可用,这很不安全,因为服务本身是没有问题的。
为了解决这个问题,Eureka 有自我保护机制,通过在Eureka Server配置如下参数,可启动保护机制

eureka.server.enable-self-preservation=true

它的原理是,当Eureka Server节点在短时间内丢失过多的客户端时(可能发送了网络故障),那么这个节点将进入自我保护模式,不再注销任何微服务,当网络故障回复后,该节点会自动退出自我保护模式。

自我保护模式的架构哲学是宁可放过一个,决不可错杀一千


Eureka Server高可用集群
理论上来讲,因为服务消费者本地缓存了服务提供者的地址,即使Eureka Server宕机,也不会影响服务之间的调用,但是一旦新服务上线,已经在缓存在本地的服务提供者不可用了,服务消费者也无法知道,所以保证Eureka Server的高可用还是很有必要的。
在分布式系统中,任何的地方存在单点,整个体系就不是高可用的,Eureka 也一样,在上面的架构图中Eureka Server不是以单点存在的,而是以集群的方式对外提供服务。
这节我们说说如何将Eureka Server进行集群配置(在本地搭建一个伪集群)。 

下图为三个Eureka-server服务工程总目录,每个工程除了yml文件配置不一致,其他的基本一样


由于我是在单机里面的IDE起的服务,所以需要给三个Eureka-Server取了域名映射(Eureka-Server集群中每个实例的名称不能一样)


相应的得修改C:\Windows\System32\drivers\etc下面的hosts文件


下面再贴出三个集群实例的application.yml文件

eureka1001

server: 
  port: 1001
 
eureka: 
  instance:
    hostname: eureka1001.com #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://eureka1002.com:1002/eureka/,http://eureka1003.com:1003/eureka/

eureka1002

server: 
  port: 1002
 
eureka: 
  instance:
    hostname: eureka1002.com #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://eureka1001.com:1001/eureka/,http://eureka1003.com:1003/eureka/

eureka1003


server: 
  port: 1003
 
eureka: 
  instance:
    hostname: eureka1003.com #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://eureka1002.com:1002/eureka/,http://eureka1001.com:1001/eureka/

然后把三个工程服务跑起来.可以看下有啥规律


至于服务提供者,只需要修改他的application.yml文件(红亮部分)

server:
  port: 8001
  
mybatis:
  config-location: classpath:mybatis/mybatis.cfg.xml        # mybatis配置文件所在路径
  type-aliases-package: com.yxf.springcloud.entities    # 所有Entity别名类所在包
  mapper-locations:
  - classpath:mybatis/mapper/**/*.xml                       # mapper映射文件
    
spring:
   application:
    name: MICROSERVICECLOUD-DEPT                        #对外暴露的服务(微服务)
   datasource:
    type: com.alibaba.druid.pool.DruidDataSource            # 当前数据源操作类型
    driver-class-name: org.gjt.mm.mysql.Driver              # mysql驱动包
    url: jdbc:mysql://localhost:3306/clouddb1              # 数据库名称
    username: root
    password: 123456
    dbcp2:
      min-idle: 5                                           # 数据库连接池的最小维持连接数
      initial-size: 5                                       # 初始化连接数
      max-total: 5                                          # 最大连接数
      max-wait-millis: 200                                  # 等待连接获取的最大超时时间
      
eureka:
  client: #客户端注册进eureka服务列表内
    service-url: 
      #defaultZone: http://localhost:1001/eureka
      defaultZone: http://eureka1001.com:1001/eureka/,http://eureka1002.com:1002/eureka/,http://eureka1003.com:1003/eureka/      
  instance:
    instance-id: microservicecloud-dept8001    
    prefer-ip-address: true     # 访问路径可以显示IP地址     
 
info: 
  app.name: yxf-mymicroservicecloud
  company.name: www.yxf.com
  build.artifactId: $project.artifactId$
  build.version: $project.version$


猜你喜欢

转载自blog.csdn.net/weixin_39666581/article/details/81052749