Docker:16---分布式服务发现:Consul

一、服务发现

  • 服务发现是分布式应用程序之间管理相互关系的一种机制。一个分布式程序一般由多个组件组成。这些组件可以都放在一台机器上,也可以分布在多个数据中心,甚至分布在不同的地理区域。这些组件通常可以为其他组件提供服务,或者为其他组件消费服务
  • 服务发现允许某个组件在想要与其他组件交互时,自动找到对方。由于这些应用沈本是分布式的,服务发现机制也需要分布式的。而且,服务发现作为分布式应用不同组件之间的“胶水”,其本身还需要足够动态、可开,适应性强,而且可以快速且一致地共享关于这些服务的数据
  • 另外,Docker主要关注分布式应用以及面向服务架构与微服务架构。这些关注点很适合与某个服务发现工具集成。每个Docker容器可以将其中运行的服务注册到服务发现工具里。注册的信息可以是IP地址或者端口,或者两者都有,以便服务之间进行交互
  • 在最近3篇文章中,我们会介绍:
    • 简单的容器编配:
    • 分布式服务发现:
      • 这部分内容会介绍Consul。Consul使用Go原因开发,以MPL 2.0许可授权开源。这个工具提供了分布式且高可用的服务发现功能
      • 本文介绍的
    • Docker的编配和集群:

二、Consul介绍

  • 本文使用Consul(https://www.consul.io/)作为服务发现工具的例子。Consul是一个使用一致性算法的特殊数据存储器。Consul使用Raft一致性算法来提供确定的写入机制。Consul暴露了键值存储系统和服务分类系统,并提供可用性、高容错能力,并保证强一致性。服务可以将自己注册到Consul,并以高可用且分布式的方式共享这些信息
  • Consul还提供了一些有趣的功能:
    • 提供了根据API进行服务分类,代替了大部分传统服务发现工具的键值对存储
    • 提供两种接口来查询信息:基于内置的DNS服务的DNS查询接口和基于HTTP的REST API查询接口。选择适合的接口,尤其是基于DNS的接口,可以很方便地将Consul与现有环境集成
    • 提供了服务监控,也称作健康监控。Consul内置了强大的服务监控系统
  • 为了更好地理解Consul是如何工作的,本文先介绍如何在Docker容器里分布式运行Consul。之后会从Docker容器将服务注册到Consul,并从其他Docker容器访问注册的数据。为了更有挑战,会让这些容器运行在不同的Docker宿主机上
  • 为了做到这些,需要做到以下几点:
    • 创建Consul服务的Docker镜像
    • 构建3台运行Docker的宿主机,并在每台上运行一个Consul。这3台宿主机会提供一个分布式环境,来展现Consul如何处理弹性和失效工作的
    • 构建服务,并将其注册到Consul,然后从其他服务查询该数据
  • 附加:可以在http://consul.io/intro/index.html找到对Consul更通用的介绍

三、构建Consul镜像

  • 第一步:创建一个目录consul,作为本文所有实验环境的根目录
mkdir consul

  • 第二步:进入consul,创建一个Dockerfile
cd consul

touch Dockerfile

  • 第三步:编写Dockerfile,内容如下:
    • FROM指令:基于ubuntu 16.04构建镜像
    • LABEL指令:设置元数据,此处设置为作者(我的博客地址)
    • ENV指令:与Dockerfile构建缓存有关,请参阅:https://blog.csdn.net/qq_41453285/article/details/107389320
    • 2条RUN指令:更新包、并安装curl和unzip工具
    • 第1组ADD指令、RUN指令:
      • 下载了包含consul可执行程序的zip文件到/tmp/目录下
      • 进入/usr/sbin目录,解压上面下载的zip文件,将可执行文件移动到/usr/sbin/下
    • 第2组ADD指令、RUN指令:下载Consul网页界面,放到/webui目录里
    • ADD指令:当宿主机当前路径下的consul.json文件复制到容器的/config/目录下(consul.json文件见下面第四步)
    • EXPOSE指令:开放宿主机的这些端口
    • VOLUME指令:设将/data设置为卷
    • ENTRYPOINT指令:启动容器中的consul服务,agent选项奶奶个告诉consul以dialing节点的模式运行,-config-dir选项指定了配置文件所在的目录是/config
    • CMD指令:
FROM ubuntu:16.04
LABEL maintainer="https://blog.csdn.net/qq_41453285"
ENV REFRESHED_AT 2020-07-28

RUN apt-get -qq update
RUN apt-get -qq install curl unzip

ADD https://releases.hashicorp.com/consul/0.3.1/consul_0.3.1_linux_amd64.zip /tmp/consul.zip
RUN cd /usr/sbin && unzip /tmp/consul.zip && chmod +x /usr/sbin/consul && rm /tmp/consul.zip

ADD https://releases.hashicorp.com/consul/0.3.1/consul_0.3.1_web_ui.zip /tmp/webui.zip
RUN cd /tmp/ && unzip webui.zip && mv dist/ /webui/

ADD consul.json /config/

EXPOSE 8300 8301 8301/udp 8302 8302/udp 8400 8500 53/udp

VOLUME ["/data"]

ENTRYPOINT [ "/usr/sbin/consul", "agent", "-config-dir=/config" ]
CMD []
  • 上面的Dockferfile公开了容器的一系列端口,这些端口是Consul运行时需要操作的端口,每个端口的用途如下所示:
    • 比较重要的是53/UDP端口,consul会使用这个端口于宁DNS,之后会使用DNS来获取服务信息
    • 另一个重要的是8500端口,它用于提供HTTP API和网页界面。其余的端口用于处理后台通信,将多个Consul节点组成集群
    • 可以在https://www.consul.io/docs/agent/options.html找到每个端口更详细的信息

  • 第三步:Dockerfile中用到了consul.json文件,因此需要建立一个consul.json文件。内容如下:
    • 该文件提供了Consul运行时需要的信息
    • data_dir指定了数据目录/data来保存Consul的数据
    • ui_dir指定了网页界面文件的位置
    • client_addr将Consul绑定到容器内的所有网页界面
    • ports配置Consul服务运行时需要的端口,这里指定了Consul的DNS服务运行在53端口
    • recursor指定了DNS服务器,这个服务器会用来解析Consul无法解析的DNS请求(此处使用的是8.8.8.8,是Google的公共DNS服务的一个IP地址)
    • 可以在https://www.consul.io/docs/agent/options.html找到所有可用的Consul配置选项
touch consul.json
{
  "data_dir": "/data",
  "ui_dir": "/webui",
  "client_addr": "0.0.0.0",
  "ports": {
    "dns": 53
  },
  "recursor": "8.8.8.8"
}

  • 第四步:上面的环境弄好了,现在就可以来构建镜像了,镜像取名为“dongshao/consul”
sudo docker build -t="dongshao/consul" .

  • 构建成功之后查看构建好的镜像
sudo docker images

  • 第五步:此处我们在本地测试Consul容器,我们先启动一个容器来看看,命令如下:
    • 将容器的8500端口映射到了宿主机的8500端口上
    • 将容器的53端口映射到了主机的54端口(本来应该是映射到宿主机的53端口上的,但是我主机的53端口被占用了,因此就改成54了)
    • -h:指定容器的主机名为node,这个名字也是Consul节点的名字
    • dongshao/consul:指定了上面的镜像
    • -srever:告诉Consul代理以服务器的模式运行
    • --bootstrap:告诉Consul本节点可以自选举为集群领导者
sudo docker run -p 8500:8500 -p 54:53/udp -h nodel dongshao/consul -server -bootstrap

  • 备注:有一点很重要:每个数据中心最多只有一台Consul服务器可以用自动启(bootstrap)模式运行。否则,如果有多个可以进行自选举的节点,整个集群无法保证一致性。文章下面的演示案例中将其他节点加入集群时会介绍更多详细的信息
  • 第六步:上面我们已经启动的Consul节点(node1节点),并在本地进行了领导者选举,因为没有别的Consul节点运行,刚启动的节点也没有其余的连接动作。现在我们可以通过Consul的网页界面来访问节点的情况。通过"IP:8500"访问

四、使用Consul搭建集群

  • 待续更新吧,目前手头上的机器不够

猜你喜欢

转载自blog.csdn.net/qq_41453285/article/details/107623235
今日推荐