快速搭建微服务--手把手教你服务发现与注册

Build MicroService Platform --- Service Register and Discovery

Docker + Etcd + Registrator + App

现在的微服务很火,网络上各种文章也特别多,准备写一个快速搭建微服务的系列文章,读本文之前最好有点微服务的基础知识,这样比较好理解,以Golang为开发语言(因为这个目前比较火哈)
今天下午有时间就写第一部分,微服务的服务注册与发现,下次准备写Gate相关的分享。

  • 本文原创: 王星鸽,转发请加入原创建链接
  • 使用Centos7 的虚拟机, IP: 192.168.196.88
  • 在安装Docker 之前,还是先关闭防火墙吧,因为有很多的端口需要开
  • 搭建环境的时候要了解基本的使用docker命令。
  • 本文共分5部分
    • 安装 Docker
    • 安装 etcd
    • 安装 etcd-viewer
    • 安装 registrator
    • 测试

一、安装 Docker

  1. 从阿里云安装Docker: curl -sSL http://acs-public-mirror.oss-cn-hangzhou.aliyuncs.com/docker-engine/internet | sh -
  2. 设置镜像加速(在国内很多东西会被墙,建议使用镜像加速)
    1. 首先要有自己的阿里云账户(当然是免费的)
    2. 在阿里云中找到镜像仓库-> Docker Hub 镜像站点-> 您的专属加速地址
    3. 执行加速器配置脚本, 别忘了把地址换成 "您的专属加速地址"
      sudo mkdir -p /etc/docker
      sudo tee /etc/docker/daemon.json <<-'EOF'
      {
      "registry-mirrors": ["your-mirror-address"]
      }
      EOF
      sudo systemctl daemon-reload
      sudo systemctl restart docker 

二、安装 Etcd

  1. 下载 etcd 地址: https://github.com/coreos/etcd/releases
  2. 搭建 etcd 的容器,因为要搭建的是etcd 集群,所以要创建多个etcd容器,我们用3个。

    1. 写 Dockerfile, 当然用官方的 Iamge 也可以。
    FROM centos:7
    
    COPY etcd /opt/etcd/etcd
    
    RUN chmod +x /opt/etcd/etcd
    
    EXPOSE 2379 2380
    
    CMD ["/opt/etcd/etcd"]
    1. Build Image: Docker build -rm -t etcd_image ./
    2. 启动容器,etcd启动参数详解
    # 启动容器1
    dk run --name ec_1 -p 12379:2379 -p 12380:2380 -d etcd_image \
    --name ec_node_1 \
    --listen-peer-urls http://0.0.0.0:2380 \
    --listen-client-urls http://0.0.0.0:2379 \
    --advertise-client-urls http://192.168.196.88:12379 \
    --initial-advertise-peer-urls http://192.168.196.88:12380  \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster ec_node_1=http://192.168.196.88:12380,ec_node_2=http://192.168.196.88:22380,ec_node_3=http://192.168.196.88:32380 \
    --initial-cluster-state new
    
    # 启动容器2
    dk run --name ec_2 -p 22379:2379 -p 22380:2380 -d etcd_image \
    --name ec_node_2 \
    --listen-peer-urls http://0.0.0.0:2380 \
    --listen-client-urls http://0.0.0.0:2379 \
    --advertise-client-urls http://192.168.196.88:22379 \
    --initial-advertise-peer-urls http://192.168.196.88:22380  \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster ec_node_1=http://192.168.196.88:12380,ec_node_2=http://192.168.196.88:22380,ec_node_3=http://192.168.196.88:32380 \
    --initial-cluster-state new
    
    # 启动容器3
    dk run --name ec_3 -p 32379:2379 -p 32380:2380 -d etcd_image \
    --name ec_node_3 \
    --listen-peer-urls http://0.0.0.0:2380 \
    --listen-client-urls http://0.0.0.0:2379 \
    --advertise-client-urls http://192.168.196.88:32379 \
    --initial-advertise-peer-urls http://192.168.196.88:32380  \
    --initial-cluster-token etcd-cluster-1 \
    --initial-cluster ec_node_1=http://192.168.196.88:12380,ec_node_2=http://192.168.196.88:22380,ec_node_3=http://192.168.196.88:32380 \
    --initial-cluster-state new
  3. 至此我们的 etcd集群搭建完成了。

三、安装 Etcd-viewer

  1. 搭建 etcd-viewer 的容器,直接从官方拉镜像:

    1. docker run -d -p 18080:8080 nikfoundas/etcd-viewer
    2. 访问etcd-viewer: http://192.168.196.88:18080
  2. 在etcd-viewer 中添加registry,成功之后如下图所示
    1. ec_1, http://192.168.196.88:12379
    2. ec_2, http://192.168.196.88:22379
    3. ec_3, http://192.168.196.88:32379

etcd-viewer

四、安装 Registrator

  1. 获取 Registrator镜像: docker pull gliderlabs/registrator
  2. 启动 Registrator容器,Registrator启动参数详解
    docker run -d --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest etcd://192.168.196.88:12379
  3. 启动之后,就可以看见在当前宿主机启动着的所有容器,通过etcd-viewer就可以看到。
    etcd-viewer-registrator
  4. 至此 docker + etcd + etcd-viewer + registrator, 这个基于docker的服务注册的环境搭建完成了。

五、测试Service Registrator环境

  1. 写一个简单的Golang 的http服务,并编译生成可执行文件
package main

import (
    "net/http"
    "github.com/julienschmidt/httprouter"
    "log"
)

func High(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
    w.Write([]byte("done"))
}

var (
    router = httprouter.New()
)

func main() {
    router.GET("/test", High)
    log.Fatal(http.ListenAndServe("0.0.0.0:80", router))
}
  1. 写 Dockerfile 来生成测试服务的镜像,写好就生成镜像: docker build --rm -t simple-http ./
FROM alpine:latest

RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2

COPY simpleService /opt/simpleService

RUN chmod +x /opt/simpleService

EXPOSE 80

CMD ["/opt/simpleService"]
  1. 创建并启动容器,我们测试的时候启动3个。

    1. docker run --name http_1 -d -P simple-http
    2. docker run --name http_2 -d -P simple-http
    3. docker run --name http_3 -d -P simple-http
  2. 创建完以后再查看容器是否都启动成功,docker ps -a
  3. 验证服务注册成功到etcd中,查看 etcd-viewer: http://192.168.196.88:18080
    etcd-test-service-1
    etcd-test-service-2
  4. 可以看到我们的服务都已经自动的写到了etcd集群中。再做两个测试:
    1. 动态添加容器,etcd中可以看到新服务。
    2. 动态添加容器,etcd中可以看到服务减少。
    3. 停止某个etcd容器,etcd集群还可以正常发现服务。

服务注册与发现环境搭建完成

2 个评论

etcd viewer 还有一个go语言版的 https://github.com/silenceper/dcmp
多谢分享。。我去看一下。。

要回复文章请先登录注册