服务的定义通过一个.json的json文件来进行定义,该文件中使用json格式定义所要注册服务的相关内容,以下为服务的json格式示例:
{
"service": {
"id": "firstservice",
"name": "firstservice",
"tags": ["dev"],
"port": 80,
}
}
sudo mkdir /etc/consul.d
说明:.d做后缀,表示一系列配置文件的存放目录
vim firstservice.json
内容是章节一部分的json中的内容。
说明:每一个服务都是以json文件格式的形式被单独声明在一个文件中,然后集中放到一个目录下。供consul启动时读取。
mv firstservice.json /etc/consul.d/
通过如上命令将自定义的firstservice.json服务文件移动至集中存放consul集群启动时要启动的服务目录中,即/etc/consul.d
由于我们添加了服务,启动的服务是以配置文件的形式进行配置的,因此,在启动时有必要指定服务配置文件所对应的目录,如下所示:
consul agent -dev -config-dir /etc/consul.d/
如上的命令表示:根据-config-dir指定的服务注册的目录中的文件来启动服务。
服务的查询支持两种方式的查询,分别为:DNS和HTTP
dig @127.0.0.1 -p 8600 dev.firstservice.service.consul
【说明:】
1、dev.firstservice.service.consul是固定的格式组合,具体格式为:tag.servicename.service.consul,即tag和servicename为服务创建时自定义配置内容。
2、DNS访问的端口是8600
b、第二种:HTTP
curl http://localhost:8500/v1/catalog/service/firstservice
【说明:】
例如,新建第二个服务sendservice,将新建secondservice.json文件,如下:
{
"service": {
"id": "secondservice",
"name": "secondservice",
"tags": ["dev"],
"port": 80,
}
}
使用http格式访问:
curl http://localhost:8500/v1/catalog/service/secondservice
除了将每一个服务单独定义为一个json配置文件外,consul还允许将多个服务组合定义在一个json文件中,具体的方式是对json文件的格式稍作修改,将原来的service修改为sevices,将原来service对应的对象类型,修改为数组类型。举例如下:
{
"services": [
{
"id": "firstservice",
"name": "firstservice",
"tags": ["dev"],
"port": 80
},
{
"id": "secondservice",
"name": "secondservice",
"tags": ["dev"],
"port": 80
}
]
}
说明:
在实际的开发过程中,微服务数量众多。如果每个文件都放在一个文件里,文件会非常多;而如果所有服务都放在一个文件里,文件太大,也不合适。因此,在实践中,往往二者结合使用。例如,假设有100个微服务,则,放在10json文件中,每个文件中放10个微服务。
在真实的生产环境中,需要真实的部署consul集群。在一台机器上想要模拟多台集群部署的效果,有两种方案:一种是借助虚拟机,另一种是借助容器技术。
在本系列课程中,使用后者容器技术来实现集群的搭建。
Docker是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源。
Docker可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化。
容器是完全使用沙箱机制,相互之间不会有任何的接口,更重要的是容器性能开销很低。
window系统下的安装可以参考如下的链接文档:https://www.runoob.com/docker/windows-docker-install.html
可以按照如上的链接在window系统下安装Docker。
MacOS系统下的安装,有两种方式。同样可以参考如下链接:https://www.runoob.com/docker/macos-docker-install.html
Docker安装完成以后,可以进行测试。可以通过终端命令的形式查看Docker是否安装成功:
docker version
Docker仅仅是一个容器,是搭建集群的一个环境。如果想要搭建多个集群,还必须安装consul环境。Docker中安装consul环境,可以使用指令实现。Docker安装consul指令如下:
docker search consul
使用如上命令查看consul的镜像文件,在终端输出如下所示内容:
docker pull consul
通过search查询了consul镜像的相关内容后,可以使用如上的docker pull命令安装consul环境。
在Docker中安装consul可以,可以通过如下命令查看docker中安装consul是否成功:
docker images
或者
docker run consul version
Docker中安装好了consul以后,首先尝试启动一个server节点,可以通过如下命令来启动docker中的单个节点:
$ docker run -p 8500:8500/tcp consul agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
如上的命令中,参数说明如下:
暴露了端口,分别是:HTTP端口:8500
-h:对应的node1为节点的名称
-server:表示启动的节点类型为server类型
-bootstrap-expect:用于server节点选举leader的参数,表示达到几个server节点时开始选举
在暴露的http端口中,还对应的映射到了主机的端口上,因此,我们可以通过在主机中访问server的信息。比如:
curl访问HTTP接口:
curl localhost:8500/v1/catalog/nodes
dig来和DNS接口进行交互:
dig @0.0.0.0 -p 8600 node1.node.consul
另外,我们还可以浏览器来进行访问,在主机的浏览器中键入:http://127.0.0.1:8500 进行访问,可以查看到server节点的相关信息。
consul members
借助Docker容器,已经启动了一个server节点,并能够与之通信。
接下来,希望借助Docker来搭建consul集群。以启动3个consul集群节点为例:
启动第一个节点的时候没有使用了 -bootstrap 参数, 而是使用了 -bootstrap-expect 3, 使用这个参数节点会等到所有三个端都连接到一起了才会启动并且成为一个可用的cluster。
$ docker run -d -p 8500:8500 -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_1 consul agent -server -bootstrap -ui -node=1 -client='0.0.0.0'
对如上的参数做如下说明:
我们需要知道这个container的内部IP, 使用下面的命令我们吧这个IP放到了环境变量 JOIN_IP 里。
$ JOIN_IP="$(docker inspect -f '{{ .NetworkSettings.IPAddress }}' node1)"
也可以直接查看container的IP,如下命令:
$docker inspect -f '{{ .NetworkSettings.IPAddress }}' node1
启动 node2并且告诉他通过 $JOIN_IP 加入到 node1:
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_2 consul agent -server -node=2 -join='172.17.0.2'
这里需要对参数作一下说明:
按照同样的方法我们启动 node3:
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_3 consul agent -server -node=3 -join='172.17.0.2'
现在我们就有了一个拥有3个节点的运行在一台机器上的集群。注意,根据Consul Agent的名字给container起了名字。
我们没有暴露出任何一个端口用以访问这个集群, 但是我们可以使用第四个agent节点以client的模式(不是用 -server参数)。这意味着他不参与选举但是可以和集群交互。而且这个client模式的agent也不需要磁盘做持久化。
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_4 consul agent -client -node=4 -join='172.17.0.2' -client='0.0.0.0'
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_5 consul agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
$ docker run -d -e CONSUL_BIND_INTERFACE='eth0' --name=consul_server_6 consul agent -client -node=5 -join='172.17.0.2' -client='0.0.0.0'
如果上述命令都能执行成功,就意味着我们的集群搭建成功了。
集群搭建完成以后,我们可以通过浏览器或者终端命令行的形式来查看,集群里面的节点的状态。
我们可以在浏览器中访问localhost:8500端口,可以看到如下效果:
三个serve类型的节点集群节点:
所有的Node节点(server和client):
在终端下执行如下命令:
$consul members
或者是:
$docker exec consul_server_1 consul members
$docker ps
$docker stop containerID
如果要停止多个,可以用空格隔开。
$docker rm containerID
consul命令的使用形式为:
consul command [option]
除command命令外,还有option选项供开发者使用,常见的和常使用的option有:
除了命令行选项,微服务的定义和配置也可以放入文件中。在某些情况下,这可能更容易,比如当使用配置管理系统配置时。配置文件是JSON格式的,使得它们易于被人和计算机读取和编辑。配置被格式化为单个JSON对象,其中包含配置。
配置文件不仅用于设置代理,还用于提供检查和服务定义。这些配置文件同样可以被其他软件和功能所识别。它们分别记录在检查配置和服务配置下。服务和检查定义支持在重新加载期间更新。
例如,如下的JSON格式配置文件:
{
"datacenter": "east-aws",
"data_dir": "/opt/consul",
"log_level": "INFO",
"node_name": "foobar",
"server": true,
"watches": [
{
"type": "checks",
"handler": "/usr/bin/health-check-handler.sh"
}
],
"telemetry": {
"statsite_address": "127.0.0.1:2180"
}
}
上述的json文件格式是一个案例,consul的json文件配置可选项有很多,比如:
如上,只是列出了部分json配置文件的配置项,全部的配置选项在consul的官方网站有相关的说明,可以访问如下链接进行查看:https://www.consul.io/docs/agent/options.html