摘要:同时注册中心也会检查注册的服务是否可用,不可用则剔除。服务消费者即在注册中心注册的服务,他们之间不再通过具体地址访问,而是通过服务名访问其他在册服务的资源。方法是在配置文件里加上信息,保证了,如果服务已停止,则从注册中心中移除。
近期新闻
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 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命令创建注册中心比较麻烦,并且不好维护,这里使用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 "); }); 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表示启动三台服务器。效果如下:
我们停止一个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...
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27906.html
摘要:前两个数据业务相关的服务即下图的,第三个项目就是的实现的负载均衡。这里后台,前台项目各启动了三个实例,用户访问的时候,就会根据配置的负载均衡的策略,访问其中一个。这一部分与之前我转发的实现服务发现及网关其实也只是差了个网关和负载均衡。 一.简介 上一篇只讲了博客的前端问题,这一篇讲一下后端的微服务搭建。项目的后端使用的thinkjs框架,在我之前的博客中已经写过,这里就不重点说明了。后...
摘要:注册器监视每个守护进程的事件,并在生命周期事件期间自动更新。条件可以包括亲和规则否定至软强制意味着尽可能地避免。当使用通用标记如或部署服务时,可能会出现意外的后果。月日,北京海航万豪酒店,容器技术大会即将举行。 在这篇文章中,我们将讨论如何用Rancher实现consul的服务发现。 如果你还没有准备好,推荐你阅读本系列中先前的文章:第一篇:CI /CD和Docker入门第二篇:使部署...
摘要:个推针对服务场景,基于和搭建了微服务框架,提高了开发效率。三容器化在微服务落地实践时我们选择了,下面将详细介绍个推基于的实践。 2016年伊始Docker无比兴盛,如今Kubernetes万人瞩目。在这个无比需要创新与速度的时代,由容器、微服务、DevOps构成的云原生席卷整个IT界。个推针对Web服务场景,基于OpenResty和Node.js搭建了微服务框架,提高了开发效率。在微服...
摘要:个推针对服务场景,基于和搭建了微服务框架,提高了开发效率。三容器化在微服务落地实践时我们选择了,下面将详细介绍个推基于的实践。 2016年伊始Docker无比兴盛,如今Kubernetes万人瞩目。在这个无比需要创新与速度的时代,由容器、微服务、DevOps构成的云原生席卷整个IT界。个推针对Web服务场景,基于OpenResty和Node.js搭建了微服务框架,提高了开发效率。在微服...
阅读 3632·2021-09-27 14:02
阅读 1782·2019-08-30 15:56
阅读 1741·2019-08-29 18:44
阅读 3272·2019-08-29 17:21
阅读 483·2019-08-26 17:15
阅读 1173·2019-08-26 13:57
阅读 1237·2019-08-26 13:56
阅读 2877·2019-08-26 11:30