基于Spring Cloud, Docker, Docker Swarm等构建微服务演示项目

Spring Cloud + Docker Swarm 演示环境

  • Windows 10 – Docker Client(Spring Cloud 开发环境)
  • CentOS-101 – Manager
  • Ubuntu-102 – Worker1
  • CentOS-103 – Worker2
  • Docker Registry v2 – 部署在CentOS-101上

    Spring Cloud 项目 – MallManagement

    项目源代码github:

    https://github.com/rickiechina/microservice-mallmanagement

    第一步,构建镜像,并上传到registry 仓库

    1. 设置 Docker的insecure-registries 属性,支持Docker Client 端推送images 镜像

    如不按照上述设置该属性,Docker Client 推送 Images 将产生如下异常:

    docker registry push错误“server gave HTTP response to HTTPS client”

    解决方法:

    在”/etc/docker/“目录下,创建”daemon.json“文件。在文件中写入:

    { “insecure-registries”:[“192.168.56.101:5000”] }

    [root@local ~]# vim /etc/docker/daemon.json

    重启 docker:

    [root@local ~]# systemctl daemon-reload

    [root@local ~]# systemctl restart docker.service

    验证insecure-registries 添加成功:

    [root@local ~]# docker info

    2. 对整个MallManagement 项目,进行maven build 操作:(可略过)

    mvn clean package — 仅仅构建 jar 包,验证代码是否正常。

    [INFO] microservice-mallmanagement 0.0.1-SNAPSHOT ……… SUCCESS [ 1.553 s]

    [INFO] microservice-eureka-server ……………………. SUCCESS [ 6.306 s]

    [INFO] microservice-gateway-zuul …………………….. SUCCESS [ 2.164 s]

    [INFO] microservice-orderservice …………………….. SUCCESS [ 4.694 s]

    [INFO] microservice-userservice 0.0.1-SNAPSHOT ………… SUCCESS [ 2.384 s]

    [INFO] ————————————————————————

    [INFO] BUILD SUCCESS

    [INFO] ————————————————————————

    [INFO] Total time: 18.801 s

    [INFO] Finished at: 2018-06-08T13:09:48+08:00

    3. Docker Client(在Windows 10 系统)向 Docker Registry 推送镜像:(可略过)

    针对单个项目,构建 image镜像。注意:需要在子项目的根目录下面,执行下面的命令,不能在项目的根目录。

    D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-server>mvn dockerfile:build

    下面是构建 eureka server image 镜像。

    [INFO] Detected build of image with id 47302f5bfdea

    [INFO] Building jar: D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-servertargetmicroservice-eureka-server-0.0.1-SNAPSHOT-docker-info.jar

    [INFO] Successfully built 192.168.56.101:5000/microservice-eureka-server:0.0.1-SNAPSHOT

    [INFO] ————————————————————————

    [INFO] BUILD SUCCESS

    [INFO] ————————————————————————

    [INFO] Total time: 17.412 s

    [INFO] Finished at: 2018-06-08T13:14:26+08:00

    [INFO] ————————————————————————

    如上述命令出现异常,也可以通过 docker build 命令行,手工构建镜像(需要到dockerfile 子项目目录下执行):

    D:GithubSpringCloudDockermicroservice-mallmanagementmicroservice-eureka-server>docker build -t 192.168.56.101:5000/microservice-eureka-server:0.0.1-SNAPSHOT .

    可以略过下面的步骤,直接使用 mvn clean install 来完成整个项目的 images 镜像推送。

    D:>docker push 192.168.56.101:5000/microservice-eureka-server

    The push refers to repository [192.168.56.101:5000/microservice-eureka-server]

    bfd212a869c0: Pushed

    73ad47d4bc12: Pushed

    c22c27816361: Pushed

    04dba64afa87: Pushed

    500ca2ff7d52: Pushed

    782d5215f910: Pushed

    0eb22bfb707d: Pushed

    a2ae92ffcd29: Pushed

    4. mvn clean install — 对整个MallManagement 项目构建images镜像,并推送到 docker registry 中。

    D:GithubSpringCloudDocker
    microservice-mallmanagement>
    mvn install 或者 mvn clean install

    [INFO] Reactor Summary:

    [INFO]

    [INFO] microservice-mallmanagement 0.0.1-SNAPSHOT ……… SUCCESS [ 1.481 s]

    [INFO] microservice-eureka-server ……………………. SUCCESS [ 23.748 s]

    [INFO] microservice-gateway-zuul …………………….. SUCCESS [ 19.344 s]

    [INFO] microservice-orderservice …………………….. SUCCESS [ 16.014 s]

    [INFO] microservice-userservice 0.0.1-SNAPSHOT ………… SUCCESS [ 35.721 s]

    [INFO] ————————————————————————

    [INFO] BUILD SUCCESS

    [INFO] ————————————————————————

    [INFO] Total time: 01:37 min

    [INFO] Finished at: 2018-06-08T14:23:22+08:00

    [INFO] ————————————————————————

    docker images — 查看构建完成的images 镜像

    D:GithubSpringCloudDockermicroservice-mallmanagement>docker images

    REPOSITORY TAG IMAGE ID CREATED SIZE

    192.168.56.101:5000/microservice-userservice 0.0.1-SNAPSHOT db5d7e7b3902 About an hour ago 354MB

    192.168.56.101:5000/microservice-orderservice 0.0.1-SNAPSHOT 06e8f2c4d4f8 About an hour ago 355MB

    192.168.56.101:5000/microservice-gateway-zuul 0.0.1-SNAPSHOT 3b2c1dc25574 About an hour ago 351MB

    192.168.56.101:5000/microservice-eureka-server 0.0.1-SNAPSHOT 5e200ceaa8ce About an hour ago 351MB

    访问
    http://192.168.56.101:5000/v2/_catalog,查看registry 仓库中的镜像列表:

    {

    repositories: [

    “microservice-eureka-server”,

    “microservice-gateway-zuul”,

    “microservice-orderservice”,

    “microservice-userservice”

    ]

    }

    第二步,Docker Compose 管理和控制由多个容器所组成的服务项目

    1. 使用 docker-compose up 命令,让Docker Compose 完成项目镜像的构建、容器创建、容器启动和容器之间的连接。

    D:GithubSpringCloudDockermicroservice-mallmanagement>docker-compose up mallmanagement

    可以通过 docker ps 查看启动的容器。

    同时,可以使用 docker-compose logs 获得服务日志。

    docker-compose logs <service>

    查看MallManagement 项目的服务:

    Eureka Server:

    http://192.168.56.101:8761/

    虽然在docker-compose.yml 文件中,有设置order-service和user-service的 replicas =2,但是在 eureka server的UI界面,发现注册的只有1个。

    其实,注册的是服务的虚拟IP地址(virtual IP),作为client 访问后端service 的前端入口。Docker 在client和service的工作节点之间路由请求,client 端不必了解服务service有多少个节点,或它们的IP地址和端口。

    Docker 1.12通过集群内置的DNS服务实现服务发现,通过vip实现自动负载均衡。

    所谓Vip机制,就是docker swarm为每一个启动的service分配一个vip,并在DNS中将service name解析为该vip,发往该vip的请求将被自动分发到service下面的诸多active task上(down掉的task将被自动从vip均衡列表中删除)。

    为了更明显地感知有多个 service instances 在运行,可以调整service 的application.yml 配置文件,设置
    eureka.instance.instance-ip 的属性值:

    eureka:

    instance:

    prefer-ip-address: true # true – 优选通过IP地址找到对应的服务名称

    instance-id: ${spring.application.name}:${spring.application.instance_id:${random.value}}

    重新构建images镜像,并上传到 registry 仓库,重新启动 docker-compose up 容器。

    可以看到如下效果:

    访问对应的service url,查看返回结果:

    Order Service:

    http://192.168.56.101:8050/order-service/order/findOrders/1

    User Service:

    http://192.168.56.101:8050/user-service/user/findOrders/rickie

    第三步,Docker Swarm 进行 Docker 集群管理和容器编排

    Swarm 内部的DNS 服务器能确保有一个稳定的名称解析机制。

    服务之间都能够通过服务的虚拟 IP 地址(带有负载均衡的服务),来访问到分布的容器。

    1. 创建 Docker Swarm 集群

    docker swarm init 【单节点的集群】

    docker swarm init –advertise-addr IP-ADDR 【IP-ADDR 为集群管理节点】

    2. 查看集群节点信息

    docker node ls

    C:UsersRickie>docker node ls

    ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION

    pygc47y3oj9utj1reqpgvjumn * linuxkit-00155d380113 Ready Active Leader 18.03.1-ce

    此时,集群中只有一个节点(默认为管理节点)。

    Status:指的是节点物理可访问性。如果节点是启动的,显示为 Ready,否则,显示为Down。

    Availability:指的是节点可用性。状态可以是 Active(节点正在运行,可以接受任务)、Pause(待命,挂起,不接受任务)、Drain(等待疏散其任务 )。

    Manager Status:指的是管理器的当前状态。如果节点不是管理器,该字段为空;如果节点是管理器,该字段可以为 Reachable(待命,保证高可用的管理器之一),或者为Leader(主导所有运营的主机)。

    管理很多的管理器和Worker时,务必保证高可用(管理器个数为奇数,大于或者等于3)。

    移除管理器

    管理器不能强制移除。在移除某个管理器节点时,必须首先将其降级(demote)为worker,兵器疏散其节点上的任务,然后关闭。

    docker node demote manager-node

    docker node update –availability drain manager-node

    # node shutdown

    docker node rm manager-node

    3. 向 Docker Swarm 集群中添加工作节点

    可以使用docker swarm join –token worker 显示如下加入指令:

    docker swarm join –token SWMTKN-1-50fiib3awfd9282eqq9cpo1evji1t7ieh2pgntrtfo2uskentq-4f0tl8wh3m0lkaiw98llwvm32 192.168.56.101:2377

    【Swarm v2 使用2377 作节点发现,端口2377 是Swarm v2节点用来发现集群里的其他节点的。】

    在join 2 台docker node之后,再次查看node 节点信息,总共有3台。

    访问 visualizer UI 服务:

    http://192.168.56.101:8081/

    可以查看服务实例在每个node节点上的部署情况。

    声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

    上一篇 2019年4月1日
    下一篇 2019年4月1日

    相关推荐