zoukankan      html  css  js  c++  java
  • 第11章 服务自动注册与发现(Docker +Consul +Registrator)

      docker最核心的是容器,容器中有相应的业务环境,容器中跑的业务,那么怎么实现容器的创建和删除,业务还能够不收影响的提供服务

    如果创建新的容器,怎么样快速发现业务并且提供服务?

    这里就讲一下服务注册

    什么是服务注册中心?
           服务注册中心本质上是为了了解解耦服务提供者和服务消费者,对于任何一个微服务,原则上都存在多个支持者,所以为了支持弹性伸缩的特性,微服务的提供数量和分布往往是不同变换的,所以需要引用额外的组件来管理微服务提供者的注册和发现。而这个组件就是服务注册中心。

    服务注册中心的软件

    •  Zookeeper

      主要的应用在大数据领域,是一种分布式,开放源码的分布式应用程序协调服务,是Hadoop和Hbase的重要组件,他是一个分布式应用提供的一致性的服务软件。

    •  Eureka

      是基于REST服务,主要是AWS云服务为支持,提供服务发现并实现负载均衡和故障转移

    •  Etcd

            是基于一个分布式键值对存储系统,用于可靠,快速的保存关键的数据,并提供访问,通过分布式锁,leader选举和写屏障

    •  Consul

      是HashiCorp公司推出的开源工具,用来实现分布式系统的服务发现和配置,安装包是一个可执行的文件,方面部署

    Consul 主要功能

    • 1, 服务发现

        通过DNS和HTTP接口使得消费者发现服务,应用程序可以轻松找到所依赖的服务

    • 2, 健康检查

        防止将请求转发到不健康的主机上

    • 3, 键值存储

        可以使用分层键/值进行存储

    Consul agent 是Consul的核心组件,分为客户端和服务端两种模式

    1.  默认以客户端模式运行,提供服务注册,健康检查,转发查询等
    2. server模式去启动时使用-server的选项指定,用于维护Consul集群状态,Raft协议进行选举。
    3. Agent 必须在每个Consul节点运行,所以运行的Consul agent节点构成Consul集群。
    4. 建议Consul集群至少有3或者5个节点运行Consul agent server模式,client节点不限
    5. 通过join和rejoin选项加入集群,一旦加入,集群信息总使用gossip算法同步到整个集群节点

    自动发现自动注册的方案

    1. Docker+Etcd+Confd+Nginx
    2. Docker+Consul+Nginx

    注册器(registrator):根据服务运行状态,注册/注销服务。主要要解决的问题是,何时发起注册/注销动作。

    注册表(registry):存储服务信息。常见的解决方案有zookeeper、etcd、cousul等。

    发现机制(discovery):从注册表读取服务信息,给用户封装访问接口。

    项目部署(Docker+Consul+Nginx)

            使用Docker 将Consul,Consul Template,Registrator 和nginx结合成一个可拓展的服务架构,此架构可以添加和移除服务,具体部署如下

                                 

    •   当容器启动后registrator就会进行注册
    •        registrator会将注册信息传送给consul agent client
    •   consul agent client将文件直接传送给leader
    •   leader会将新的信息更新到consul template上
    •   consul template会将数据写入到nginx.conf中
    •   nginx会根据nginx.xonf文件给web提供数据

    服务搭建

    服务器

    IP地址

    软件

    操作系统

    Consul

    192.168.2.224

    Nginx consul conul-temliate

    Centos7

    Docker01

    192.168.2.222

    Docker-ce registrator

    Centos7

    Docker02

    192.168.2.223

    Docker-ce registrator

    Centos7

    1.部署consul

    • 解压consul包
    • [root@consul ~]# unzip consul_0.9.2_linux_amd64.zip
      
      Archive:  consul_0.9.2_linux_amd64.zip
      
        inflating: consul                 
      
      [root@consul ~]# mv consul /usr/bin/
      

        

    •  指定leader的consul,并且指定相应的数据参数
    • [root@consul ~]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &> /var/log/consul.log &
      
      [1] 2602  
      • 命令解释
    • consul agent -server -bootstrap :本身设置成为leader,一个的话指定一下,多个就不需要了
    • nohup 英文全称 no hang up(不挂起),用于在系统后台不挂断地运行命令,退出终端不会影响程序的运行。
    • -ui:指定开启UI界面显示
    • -data-dir=/var/lib/consul-data 数据放在的路径
    • -bind=192.168.2.224 监听的IP
    •  -client=0.0.0.0 绑定在哪个client地址
    • -node=consul-server01 节点在集群中的名字,在集群中节点是唯一的,默认是该节点的主机名 
    • 查看是否运行中
    • [root@consul ~]# jobs
      
      [1]+  运行中               nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.2.224 -client=0.0.0.0 -node=consul-server01 &>/var/log/consul.log &
      

        

    • 查看consul集群成员的信息(因为只部署了一个consul,所以现在只能可查看到一个)
    • [root@consul ~]# consul members
      
      Node             Address             Status  Type    Build  Protocol  DC
      
      consul-server01  192.168.2.224:8301  alive   server  0.9.2  2         dc1
      

        

    • 查看consul集群中的leader
    • [root@consul ~]# consul info |grep leader
      
             leader = true
      
             leader_addr = 192.168.2.224:8300
      

        

    • 查看consul所管理的服务
    • [root@consul ~]# consul catalog services
      
      Consul
      
      一共五个端口
      
      8300  replication leader farwarding的端口相互复制的端口
      
      8301   lan cossip的端口
      
      8302   wan gossip的端口
      
      8500    web ui界面的端口
      
      8600    使用dns协议查看节点信息的端口
      
    • 下载镜像
    • [root@docker01 docker]# docker pull gliderlabs/registrator:latest
      
      latest: Pulling from gliderlabs/registrator
      
      Image docker.io/gliderlabs/registrator:latest uses outdated schema1 manifest format. Please upgrade to a schema2 image for better future compatibility. More information at https://docs.docker.com/registry/spec/deprecated-schema-v1/
      
      c87f684ee1c2: Pull complete
      
      a0559c0b3676: Pull complete
      
      a28552c49839: Pull complete
      
      Digest: sha256:6e708681dd52e28f4f39d048ac75376c9a762c44b3d75b2824173f8364e52c10
      
      Status: Downloaded newer image for gliderlabs/registrator:latest
      
      docker.io/gliderlabs/registrator:latest
      
       
      

        

    2.部署registrator容器服务

    • 运行registrator容器
    • [root@docker01 docker]# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.222 consul://192.168.2.224:8500
      [root@docker02 docker]#  docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=192.168.2.223 consul://192.168.2.224:8500
    •  测试服务发现功能是正常
    • 宿主机访问http://192.168.2.224:8500/ui/#/dc1/services
    • 编写web脚本,要进行测试
    • [root@docker01 docker]# vim /web/index.jsp
      
      <%@ page language="java" contentType="text/html; charset=utf-8"
      
          pageEncoding="utf-8"%>
      
      <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
      
      <html>
      
      <head>
      
      <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
      
      <title>登录</title>
      
      </head>
      
      <body>
      
              <form action="LoginServlet" method="post">
      
                      <table>
      
                              <tr>
      
                                      <td>账号</td>
      
                                      <td><input type="text" name="username"></td>
      
                              </tr>
      
                              <tr>
      
                                      <td>密码</td>
      
                                      <td><input type="password" name="password"></td>
      
                              </tr>
      
                              <tr>
      
                                      <td><input type="submit" value="登录"></td>
      
                              </tr>
      
                      </table>
      
              </form>
      
      </body>
      
    • 开启两台容器进行测试  

    • [root@docker01 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat
      
      b51abc4d730170b906bc033c69bd2fa3eb44369fcabd41ea6c90eb55f116b02f
      
      [root@docker01 docker]# docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat
      
      7314559a133f23d5eebd08846922964ea5d9eeccd5cf3281c7bcfc5ff6061b0e
      
    • 测试成功
    • 增加两台tomcat,表示测试成功
    • 再次不同端口增加两台tomcat容器
    • [root@docker02 docker]#  docker run -itd -p:8001:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t1 -h docker01-t1 tomcat
      Unable to find image 'tomcat:latest' locally
      latest: Pulling from library/tomcat
      6c33745f49b4: Pull complete 
      c87cd3c61e27: Pull complete 
      05a3c799ec37: Pull complete 
      a61c38f966ac: Pull complete 
      396b39798a69: Pull complete 
      576b6480761a: Pull complete 
      0d66e5d46fdf: Pull complete 
      c9a19e25684c: Pull complete 
      511576b95265: Pull complete 
      7cbc3d736630: Pull complete 
      Digest: sha256:f728ca177fee0851aea29499fbb2013737231a00264f517cc3d185f6f8bf09a8
      Status: Downloaded newer image for tomcat:latest
      4f73eefca98e2e5eee55463e3a298e1d20529b08be2fb25971bcdaa657484af6
      [root@docker02 docker]# docker run -itd -p:8002:8080 -v /web:/usr/local/tomcat/webapps/ROOT --name docker01-t2 -h docker01-t2 tomcat
      ef8b5c1174cb45441a9ce68b124688c07ba228456fac8bef54a551bf2701fdac
      [root@docker02 docker]#
      
    • 进行测试

    3. 安装consul-template

    •    
      [root@consul ~]# mkdir consul
      
      [root@consul ~]# cd consul
      
      [root@consul consul]# vim /root/consul/nginx.tmp
      
      [root@consul consul]# cat /root/consul/nginx.tmp
      
       
      
      uptream http_backend {
      
             {{range service "tomcat"}}        
      
             server {{ .Address }}:{{ .Port }};       
      
             {{ end }}
      
      }
      
      server {
      
             listen 8080;
      
             server_name localhost 192.168.2.224;
      
             access_log /usr/local/nginx/logs/crushlinux-access.log;
      
             index index.html index.jsp index.php;
      
             location / {
      
             proxy_set_header HOST $host;
      
             proxy_set_header X-Real-IP $remote_addr;
      
             proxy_set_header Client-IP $remote_addr;
      
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
             proxy_pass http://http_backend;
      
             }
      
      }
      

        

    4.安装NGINX

    • [root@consul consul]# yum -y install gcc gcc-c++ make pcre-devel zlib-devel openssl-devel
      
      [root@consul ~]# tar xf nginx-1.12.1.tar_(1).gz -C /usr/src/
      
      [root@consul nginx-1.12.1]# cd /usr/src/nginx-1.12.1/
      
      [root@consul nginx-1.12.1]# ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_realip_module --with-pcre --with-http_ssl_module && make -j 2 && make install
      
    • 修改配置文件
    • 将下列加入配置文件:
      
      [root@consul nginx-1.12.1]# vim /usr/local/nginx/conf/nginx.conf
      
      include vhost/*.conf;
      
    • 创建目录,重新启动NGINX

    • [root@consul ~]# mkdir /usr/local/nginx/conf/vhost/
      
      [root@consul ~]# /usr/local/nginx/sbin/nginx
      

    5.测试:  

    • 目前目录下无东西,基于consul模板生成子文件
    • [root@consul ~]# ls /usr/local/nginx/conf/vhost/
      
      [root@consul ~]# ls consul
      
      nginx.tmp
      
    • 配置并启用consul-template
    • [root@consul ~]# unzip consul-template_0.19.3_linux_amd64_(1).zip
      
      Archive:  consul-template_0.19.3_linux_amd64_(1).zip
      
        inflating: consul-template        
      
      [root@consul ~]# ls
      
      anaconda-ks.cfg                             downloads.html
      
      CentOS-7-x86_64-DVD-1810.zip                index.html
      
      centos-7-x86_64.tar.gz                      mnt
      
      consul                                      mysql
      
      consul_0.9.2_linux_amd64.zip                nginx-1.12.1
      
      consul-template                             nginx-1.12.1.tar_(1).gz
      
      consul-template_0.19.3_linux_amd64_(1).zip  stress
      
      [root@consul ~]# mv consul-template /usr/bin/
      
      [root@consul ~]# consul-template -consul-addr 192.168.2.224:8500 -template "/root/consul/nginx.tmp:/usr/local/nginx/conf/vhost/Carrie.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
      
    • 查看子文件,已经出现了相应内容
    • [root@consul ~]# ls /usr/local/nginx/conf/vhost/
      
      Carrie.conf
      
      [root@consul ~]# cat  /usr/local/nginx/conf/vhost/Carrie.conf
      
       
      
      uptream http_backend {
      
                     
      
             server 192.168.2.222:8001;       
      
                     
      
             server 192.168.2.222:8002;       
      
                     
      
             server 192.168.2.223:8001;       
      
                     
      
             server 192.168.2.223:8002;       
      
            
      
      }
      
      server {
      
             listen 8080;
      
             server_name localhost 192.168.2.224;
      
             access_log /usr/local/nginx/logs/crushlinux-access.log;
      
             index index.html index.jsp index.php;
      
             location / {
      
             proxy_set_header HOST $host;
      
             proxy_set_header X-Real-IP $remote_addr;
      
             proxy_set_header Client-IP $remote_addr;
      
             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      
             proxy_pass http://http_backend;
      
             }
      
      }
      

    至此部署成功。

  • 相关阅读:
    作品-系统-[原生开发]新蓝景CRM管理系统
    作品-网站-[二次开发]汇名惠商城
    js声明json数据,打印json数据,遍历json数据,转换json数据为数组
    js 鼠标滚动到某屏时,加载那一屏的数据,仿京东首页楼层异步加载模式
    js转换数据类型为浮点型,并取两位小数点
    php判断是否是微信客户端的浏览器访问
    百度地图API地理位置和坐标转换
    php 对象中连贯执行方法
    php extract 函数的妙用 数组键名为声明为变量,键值赋值为变量内容
    php 获取远程图片保存到本地
  • 原文地址:https://www.cnblogs.com/hanjiali/p/14163352.html
Copyright © 2011-2022 走看看