Docker Swarm运行Spring Cloud应用(二):Eureka高可用

摘要: 本文章为楼主本人需要时查找方便故转载云栖大神文章并加以修改留存,原文地址。

在上篇文章中介绍了如何如何在Docker Swarm集群中部署Spring Cloud应用。本文章为大家介绍如何实现Eureka的高可用。

Docker Swarm运行Spring Cloud应用(一):部署

Docker Swarm运行Spring Cloud应用(二):Eureka高可用(本文)

基础服务独立部署

把所有服务一次性部署好非常方便,但是在生产环境中使用的时候需要考虑这样一些因素:

  • 在生产环境中的基础服务,如Eureka由于更新不频繁,应该和频繁更新应用服务分开部署
  • 作为基础服务的Eureka需要考虑高可用

我们可以把部署描述文件分成两部分,eureka.yml 用来部署作为基础服务的Eureka Server,是包含三各节点的集群。

eureka.yml

version: '3'
services:
  eureka1:
    image: guagusi/sc-eureka:buid20190516V1.6
    networks:
      springcloud-overlay:
        aliases:
          - eureka
    ports:
      - "8761:8022"
    environment:
      - eureka.instance.hostname=eureka1 #指定当前启动服务的hostname
      - spring.cloud.inetutils.preferred-networks=192.168.3 #指定当前启动服务ip段,支持正则
      - ADDITIONAL_EUREKA_SERVER_LIST=http://eureka2:8022/eureka/,http://eureka3:8022/eureka/
  eureka2:
    image: guagusi/sc-eureka:buid20190516V1.6
    networks:
      springcloud-overlay:
        aliases:
          - eureka
    ports:
      - "8762:8022"
    environment:
      - eureka.instance.hostname=eureka2
      - spring.cloud.inetutils.preferred-networks=192.168.3
      - ADDITIONAL_EUREKA_SERVER_LIST=http://eureka1:8022/eureka/,http://eureka3:8022/eureka/
  eureka3:
    image: guagusi/sc-eureka:buid20190516V1.6
    networks:
      springcloud-overlay:
        aliases:
          - eureka
    ports:
      - "8763:8022"
    environment:
      - eureka.instance.hostname=eureka3
      - spring.cloud.inetutils.preferred-networks=192.168.3
      - ADDITIONAL_EUREKA_SERVER_LIST=http://eureka1:8022/eureka/,http://eureka2:8022/eureka/
    ...
networks:
  springcloud-overlay:
    external:
      name: springcloud-overlay

Eureka部署到的网络springcloud-overlay需要手动创建,注意要设置子网(--subnet),虽然不设置docker会帮你自动设置,不过有bug 命令如下:

docker network create --driver overlay --subnet 192.168.0.0/24 springcloud-overlay

从部署模版中可以看出这三个Eureka实例在网络上的别名(alias)都是eureka,对于客户端可以在配置文件中指定这个别名即可,不必指定三个示例的名字。

application.yml

eureka.client.serviceUrl.defaultZone=http://${EUREKA_SERVER_ADDRESS}:8022/eureka/

Eureka Server的地址通过${EUREKA_SERVER_ADDRESS} 环境变量传入给每个客户端服务。

services:
  web:
    image: binblee/demo-web
    ...
    environment:
      - EUREKA_SERVER_ADDRESS=eureka

另外要注意的是所有依赖于Eureka的应用服务都要挂到springcloud-overlay网络上,否则无法和Eureka Server通信。下面是比较完整的部署描述文件的示例:

version: '3'
services:
  web:
    image: binblee/demo-web
    networks:
      - springcloud-overlay
    environment:
      - EUREKA_SERVER_ADDRESS=eureka
    ports:
      - "8080"
    ...

  bookservice:
    image: binblee/demo-bookservice
    networks:
      - springcloud-overlay
    environment:
      - EUREKA_SERVER_ADDRESS=eureka
    ...

networks:
  springcloud-overlay:
    external:
      name: springcloud-overlay

每个Eureka Server服务的application.yml通过${ADDITIONAL_EUREKA_SERVER_LIST}送入启动相互注册地址

eureka:
  instance:
    lease-renewal-interval-in-seconds: 5
    lease-expiration-duration-in-seconds: 10
  server:
    enable-self-preservation: true
    eviction-interval-timer-in-ms: 50000
  client:
    fetchRegistry: true
    registerWithEureka: true
    registry-fetch-interval-seconds: 10
    serviceUrl:
      defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/,${ADDITIONAL_EUREKA_SERVER_LIST}

部署这几个服务需要3个步骤,首先创建overlay网络,然后部署Eureka,最后再部署应用服务。命令如下:

docker network create -d overlay springcloud-overlay
cd compose/
docker stack deploy -c eureka.yml
docker stack deploy -c demoweb.yml

访问Swarm集群中的任意节点的8761端口,可以看到Eureka实例1有两个副本,eureka2和eureka3,2个应用服务已经注册上去了。访问8762和8763,可以看到另外两个Eureka的管理界面,内容类似。

Docker Swarm运行Spring Cloud应用(二):Eureka高可用_第1张图片

注意:1 . 由于各种原因,docker多网卡情况下,启动的服务不指定ip段会导致各种服务间可能被分配到其它网卡ip,以至于服务间不再同一内网下导致各种通讯异常,所以需要通过环境变量指定服务ip段spring.cloud.inetutils.preferred-networks。 2 .由于这里采用多eureka相互注册,不指定当前所启动eureka自身hostname会导致服务启动异常,但如果在eureka的application.yml中指定当前服务hostname为“localhost”又会导致启动的每个eureka服务间的相互注册副本不可用 unavailable-replicas,频繁触发eureka自我保护模式,即无法高可用, 所以需要通过环境变量指定hostname即eureka.instance.hostname。启动后相互正常注册如下图

Docker Swarm运行Spring Cloud应用(二):Eureka高可用_第2张图片

 

 

 

 

你可能感兴趣的:(Docker相关,java相关)