乐趣区

consuldocker实现服务注册

近期新闻

css 宣布支持三角函数
ES10 即将来临

基本架构


注册中心:每个服务提供者向注册中心登记自己的服务,将服务名与主机 Ip,端口等一些附加信息告诉注册中心,注册中心按服务名分类组织服务清单。如 A 服务运行在 192.168.1.82:3000,192.168.1.83:3000 实例上。那么维护的内容如下:

简单来说,服务中心会维护一份,在册的服务名与服务 ip 的映射关系。同时注册中心也会检查注册的服务是否可用,不可用则剔除。
服务消费者:即在注册中心注册的服务,他们之间不再通过具体地址访问,而是通过服务名访问其他在册服务的资源。

技术说明

Consul: 采用 Go 开发的高可用的服务注册与配置服务,本文的注册中心采用 Consul 实现。
Docker: 基于 Go 语言的开源应用容器引擎。
Registor:Go 语言编写,针对 docker 使用的,通过检查本机容器进程在线或者停止运行状态,去注册服务的工具。这里主要用作对服务消费者的监控。
示例环境:系统:macos;docker: 17.09.1-ce;docker-compose:1.17.1。

docker 命令创建注册中心

docker run -h node1  --name consul -d --restart=always\
    -p  8400 \
    -p   8500:8500 \
progrium/consul -server \
-bootstrap-expect 1 -advertise 127.0.0.1

下面来解释下各个参数
-h 节点名字
–name 容器(container)名称,后期用来方便启动关闭,看日志等,这个一定要写
-d 后台运行
-v /data:/data 使用宿主机的 /data 目录映射到容器内部的 /data, 用于保存 consul 的注册信息,要不 docker 一重启,数据是不保留的。
–restart=always 这个可以活得长一点
下面几个参数都是 consul 集群用的,非集群模式可以不使用。

-p   8500:8500 \

progrium/consul 镜像名称,本地没有就自动从公共 docker 库下载
后面的都是 consul 的参数:
-server 以服务节点启动
-bootstrap-expect 3 预期的启动节点数 3,最少是 3,要不达不到 cluster 的效果
-advertise 127.0.0.1 告诉集群,我的 ip 是什么,就是注册集群用的

使用 docker-compose 创建注册中心

使用 docker 命令创建注册中心比较麻烦,并且不好维护,这里使用 docker-compose 来实现。
docker-compose:
compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器,使用 Docker Compose 不再需要使用 shell 脚本来启动容器。

Compose 通过一个配置文件来管理多个 Docker 容器,在配置文件中,所有的容器通过 services 来定义,然后使用 docker-compose 脚本来启动,停止和重启应用,和应用中的服务以及所有依赖服务的容器,非常适合组合使用多个容器进行开发的场景。
首先看下 docker-compose 配置文件:

version: "3.0"

services:
    # consul server,对外暴露的 ui 接口为 8500,只有在 2 台 consul 服务器的情况下集群才起作用
    consulserver:
        image: progrium/consul:latest
        hostname: consulserver
        ports:
            - "8300"
            - "8400"
            - "8500:8500"
            - "53"
        command: -server -ui-dir /ui -data-dir /tmp/consul --bootstrap-expect=3

    # consul server1 在 consul server 服务起来后,加入集群中
    consulserver1:
        image: progrium/consul:latest
        hostname: consulserver1
        depends_on:
            - "consulserver"
        ports:
            - "8300"
            - "8400"
            - "8500"
            - "53"
        command: -server -data-dir /tmp/consul -join consulserver

    # consul server2 在 consul server 服务起来后,加入集群中
    consulserver2:
        image: progrium/consul:latest
        hostname: consulserver2
        depends_on:
            - "consulserver"
        ports:
            - "8300"
            - "8400"
            - "8500"
            - "53"
        command: -server -data-dir /tmp/consul -join consulserver

这里 consulserver,consulserver1 等是服务名,image 定义镜像名,depends_on 定义依赖容器,command 可以覆盖容器启动后默认命令。详细的配置项介绍及 compose 命令,可查看这里。
下面进入模版目录,运行

docker-compose up -d

浏览器输入 http://127.0.0.1:8500,可以看到 consul server 服务已启动。效果如下:

接下来,添加 registrator。方法是在配置文件里加上 registrator 信息,registrator 保证了,如果服务已停止,则从注册中心中移除。

    registrator:
        image: gliderlabs/registrator:master
        hostname: registrator
        depends_on:
            - "consulserver"
        volumes:
            - "/var/run/docker.sock:/tmp/docker.sock"
        command: -internal consul://consulserver:8500

注册中心已经建好了,接下来我们创建需要注册在 consul server 上的服务。

搭建 service web 服务

首先我们创建一个服务的本地镜像,用来创建服务容器。
创建 server.js, 这里用 express 框架创建 node 服务,端口 3000。

var express = require("express");
var PORT = 3000;
var app = express();
const ip = require("ip");
app.get("/getRemoteIp", (req, res) => {res.send({ ip: ip.address() });
});
app.get("/", function(req, res) {res.send("Helloworld\n");
});
app.listen(PORT);
console.log("Running on http://localhost:" + PORT);

再创建 package.json 定义依赖。
创建镜像最重要的是 Dockerfile。

FROM node:alpine
RUN mkdir -p /home/Service
WORKDIR /home/Service 
COPY . /home/Service
RUN npm install
EXPOSE 3000
CMD npm start

FROM: 构建镜像的基础源镜像
WORKDIR:容器的工作目录
COPY: 将本地的东西拷贝到容器的指定目录下
EXPOSE: 将容器内的某个端口导出给主机,用于我们访问
CMD: 每次容器启动的时候执行的命令
详细配置项信息可以看这里。

接着就可以创建镜像了:

docker build -t client-server .

建成后使用 docker images 查看镜像,也可以运行镜像,验证是否创建成功。

docker run -d -p 3000:3000 client-server

下面可以创建 consul client 了,配置文件如下。

version: "3.0"
# 启动 node-service-web 节点服务
services:
    web:
        image: client-server:latest
        environment:
            SERVICE_3000_NAME: service-web
        ports:
            - "3000"

这里 client-server 就是刚创建的镜像。
运行 docker-compose -f docker-compose.web.yml up -d –scale web= 3 启动服务,–scale web= 3 表示启动三台服务器。效果如下:

验证 Registrator 功能

我们停止一个 service-web 服务,看下 Registrator 是否会将无效的服务移除。
首先看下当前服务 docker ps

再停止一个服务

docker stop de8848a31fe7

接着登录 http://localhost:8500/ui/#/dc1/services/consul,看到 service-web 变为两个,说明 Registrator 会移除下线服务。

参考文档:
https://zhuanlan.zhihu.com/p/…
https://www.jianshu.com/p/d16…
https://www.jianshu.com/p/ab7…
https://www.cnblogs.com/bossm…

退出移动版