Consul微服务注册
作用
微服务注册中心
服务发现
键值对存储(docker swarm集群)
Consul服务端口:8300
Consul服务http/api端口:8500
producer端口:8501
producer-2端口:8502
consumer端口:8503
Consul集群搭建
实验环境
四台Linux,其中三台需要Maven环境
192.168.1.4(Maven使用私服1.1)
192.168.1.5(Maven使用私服1.1)
192.168.1.6
192.168.1.7(Maven使用私服1.1)
四台主机都必须有consul
1.7需要两个包consul-template/nginx
实验步骤
四台主机都安装Consul(Spring-cloud-consul)
unzip consul_1.4.0_linux_amd64.zip -d /usr/local/sbin
consul -v # 查看版本号
然后同样四台主机创建三个目录
mkdir -p /opt/consul/{data,config,logs}
consul agent
对consul实例进行操作,多指创建集群或添加节点
192.168.1.4
consul agent -server -node=consul1 -bootstrap-expect 2 \
-data-dir /opt/consul/data -config-dir /opt/consul/config \
-bind 192.168.1.4 -client 0.0.0.0 \
-enable-script-checks=true -datacenter=pjf01
选项释义
consul agent:表示启动一个consul
-server:表示以服务端的形式启动
-node:当前节点在集群中的名称
-bootstrap-expect:集群最少节点数量
-data-dir:数据存放目录
-config-dir:集群配置信息的存放目录
-bind:当前counsul的绑定ip,也就是本机ip
-client:客户端地址,0.0.0.0允许所有人访问
-enable-script-checks:开启心跳检测
-datacenter:数据中心名称,用来存放当前consul的数据
192.168.1.5
consul agent -server -node=consul2 -bootstrap-expect 2 \
-data-dir /opt/consul/data/ -config-dir /opt/consul/config/ \
-bind 192.168.1.5 -client 0.0.0.0 \
-enable-script-checks=true -datacenter=pjf01 \
-join 192.168.1.4
-join:加入第一台中的集群
192.168.1.6
consul agent -server -node=consul3 \
-data-dir /opt/consul/data/ -config-dir /opt/consul/config/ \
-bind 192.168.1.6 -client 0.0.0.0 \
-enable-script-checks=true -datacenter=pjf01 \
-join 192.168.1.4 -ui
-ui:启动命令中加入该选项可以查看集群的web界面
前三个为一个Consul集群
将192.168.1.7作为集群中的客户端来启动
consul agent -node=client \
-data-dir /opt/consul/data/ -config-dir /opt/consul/config/ \
-bind 192.168.1.7 -client 0.0.0.0 \
-enable-script-checks=true -datacenter=pjf01 \
-join 192.168.1.4
Consul的常用指令
查看集群成员
consul members(包括客户端和服务端),可以用来验证是否启动成功
Node Address Status Type Build Protocol DC Segment
consul1 192.168.1.4:8301 alive server 1.4.0 2 pjf01 <all>
consul2 192.168.1.5:8301 alive server 1.4.0 2 pjf01 <all>
consul3 192.168.1.6:8301 alive server 1.4.0 2 pjf01 <all>
client 192.168.1.7:8301 alive client 1.4.0 2 pjf01 <default>
查看集群leader(领导)
http://ip:8500/v1/status/leader
ip只要是集群中的即可
查看集群详细信息
http://ip:8500/v1/catalog/nodes?pretty
?pretty用来美化输出,相当于MySQL中的\G
查看已有服务
http://ip:8500/v1/catalog/services
查看具体微服务信息
http://ip:8500/v1/catalog/微服务名
如:http://192.168.1.5:8500/v1/catalog/producer
查看集群server成员
http://ip:8500/v1/status/peers
刚才创建集群时,有一个主机中加入了-ui
选项,浏览器中访问这台主机的ip可以进入到consul的存储界面
http://192.168.1.6:8500/ui/pjf01
查看集群中服务端
查看集群中节点
Consul键值对存储
只要在集群中的主机都可以使用
consul kv
对键值对进行操作,例如数据存储,kv
就表示key value
创建或者更新键值对
[root@192 ~]# consul kv put redis/config/connection 5
Success! Data written to: redis/config/connection
[root@192 ~]# consul kv put cyj pjf
Success! Data written to: cyj
获取键值
[root@192 ~]# consul kv get redis/config/connection
5
[root@192 ~]# consul kv get cyj
pjf
查看键详情
[root@192 ~]# consul kv get -detailed redis/config/connection
CreateIndex 556
Flags 0
Key redis/config/connection
LockIndex 0
ModifyIndex 556
Session -
Value 5
[root@192 ~]# consul kv get -detailed cyj
CreateIndex 583
Flags 0
Key cyj
LockIndex 0
ModifyIndex 583
Session -
Value pjf
删除键
[root@192 ~]# consul kv delete redis/config/connection
Success! Deleted key: redis/config/connection
递归删除
# 创建3个递归键值
[root@192 ~]# consul kv put redis/one 1
Success! Data written to: redis/one
[root@192 ~]# consul kv put redis/two 2
Success! Data written to: redis/two
[root@192 ~]# consul kv put redis/three 3
Success! Data written to: redis/three
[root@192 ~]# consul kv delete -recurse redis/
Success! Deleted keys with prefix: redis/
# 验证删除成功
[root@192 ~]# consul kv get /redis/one
Error! No key exists at: redis/one
导出指定前缀的键
# 创建测试键值
[root@192 ~]# consul kv put redis/one 1
Success! Data written to: redis/one
[root@192 ~]# consul kv put redis/two 2
Success! Data written to: redis/two
[root@192 ~]# consul kv put redis/three 2
Success! Data written to: redis/three
[root@192 ~]# consul kv put redis/four 2
Success! Data written to: redis/four
# 导出前缀为redis/的所有键
[root@192 ~]# consul kv export redis/
[
{
"key": "redis/four",
"flags": 0,
"value": "Mg=="
},
{
"key": "redis/one",
"flags": 0,
"value": "MQ=="
},
{
"key": "redis/three",
"flags": 0,
"value": "Mg=="
},
{
"key": "redis/two",
"flags": 0,
"value": "Mg=="
}
]
列出所有键
[root@192 ~]# consul kv get -keys
cyj
redis/
列出指定前缀的所有键
# -separator=""表示禁用分隔符
[root@192 ~]# consul kv get -keys -separator="" redis
redis/four
redis/one
redis/three
redis/two
从文件中导入键值对
json格式可以是,像上面consul导出后的格式的内容
consul kv import @json文件名
使用Consul作为注册中心监控到SpringCloud微服务
192.168.1.4/192.168.1.5/192.168.1.7三台服务器需要下载SpringCloud代码
下载一个scp即可
使用192.168.1.6作为注册中心,也就是没有安装maven那一台,1.4/1.5运行一个producer服务,1.7作为消费者访问轮询
192.168.1.4(第二终端,运行的consul并没有停止)
cd spring-cloud-examples/spring-cloud-consul/spring-cloud-consul-producer
vim src/main/resources/application.properties
修改:该ip作为注册中心地址
spring.cloud.consul.host=192.168.1.6
在当前目录运行producer微服务(8501)
mvn spring-boot:run
192.168.1.5(第二终端,运行的consul并没有停止)
cd spring-cloud-examples/spring-cloud-consul/spring-cloud-consul-producer-2/
vim src/main/resources/application.properties
修改:
spring.cloud.consul.host=192.168.1.6
在当前目录运行producer-2微服务(8502)
mvn spring-boot:run
访问ui界面验证是否启动成功http://192.168.1.6:8500/ui
以下都显示绿色,则代表两台producer运行成功
将192.168.1.7的Consul的client停掉来做消费者
cd spring-cloud-examples/spring-cloud-consul/spring-cloud-consul-consumer/
vim src/main/resources/application.properties
修改
spring.cloud.consul.host=192.168.1.6
运行消费者Consumer
mvn spring-boot:run
验证访问消费者验证两台producer轮询
[root@192 ~]# curl http://192.168.1.7:8503/call
helle consul
curl http://192.168.1.7:8503/call
helle consul two
Consul+Nginx实现对微服务动态代理
使用Nginx反向代理的upstream弹性伸缩,可以动态的添加upstream的server,需要用到consul_template来完成Nginx配置文件的转换
将消费者停掉,在1.7安装consul-template
tar zxf consul-template_0.19.5_linux_amd64.tgz -C /usr/local/bin
继续在1.7安装nginx
yum -y install pcre* openssl*
tar zxf nginx-1.17.8.tar.gz -C /usr/src
cd /usr/src/nginx-1.17.8/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx \
--with-http_ssl_module \
--with-http_stub_status_module \
--with-pcre
make && make install
useradd -M -s /sbin/nologin nginx
ln -s /usr/local/nginx/sbin/* /usr/sbin/
nginx -v # 确认安装完成
自己创建Nginx的upstream模板文件
mkdir /usr/local/nginx/conf/vhost
vim /opt/consul/config/nginx-template.ctmpl
添加:
upstream web1 {
ip_hash; # 使用哈希轮询
# {{}}调用变量,consul中service为service-producer的服务信息
{{ range service "service-producer"}}
# 引用service-producer.Address和.Port,将服务的端口号和ip调用出来
server {{.Address}}:{{.Port}} max_fails=2 fail_timeout=30;
{{end}}
}
server {
listen 80;
server_name web1.consul.com;
location / {
proxy_connect_timeout 900s; # tcp连接超时时间
proxy_send_timeout 900s; # 发送数据超时时间
proxy_read_timeout 900s; # 读取数据超时时间
proxy_buffer_size 32k; # 缓存大小
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_set_header Host $Host; # 添加http协议头部
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
}
测试模板是否正确
# ip地址是添加过-ui的主机
consul-template -consul-addr 192.168.1.6:8500 \
-template /opt/consul/config/nginx-template.ctmpl:/usr/local/nginx/conf/vhost/web1.conf:"nginx -s reload" -dry
-consul-addr:指定consulip
-template:指定模板文件
# 根据模板生成配置文件,然后执行配置文件重载
/opt/consul/config/nginx-template.ctmpl:/usr/local/nginx/conf/vhost/web1.conf
-dry:表示只运行命令,不上传配置文件
然后会以阻塞方式将刚才编写的模板输出
> /usr/local/nginx/conf/vhost/web1.conf
upstream web1 {
ip_hash;
server 192.168.1.4:8501 max_fails=2 fail_timeout=30;
server 192.168.1.5:8502 max_fails=2 fail_timeout=30;
}
server {
listen 80;
server_name web1.consul.com;
location / {
proxy_connect_timeout 900s;
proxy_send_timeout 900s;
proxy_read_timeout 900s;
proxy_buffer_size 32k;
proxy_buffers 4 32k;
proxy_busy_buffers_size 64k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_pass http://web1;
}
}
断掉阻塞模式,验证成功,编辑nginx主配置文件
vim /usr/local/nginx/conf/nginx.conf
添加到server {上面,#gzip on;下面
# 表示将生成的web1.conf使服务可以读取到这个文件
include /usr/local/nginx/conf/vhost/*.conf;
启动nginx,执行nginx
即可
然后运行consul-template
consul-template -consul-addr 192.168.1.6:8500 \
-template /opt/consul/config/nginx-template.ctmpl:/usr/local/nginx/conf/vhost/web1.conf:"nginx -s reload" --log-level=info > \
/opt/consul/logs/consul-nginx.log 2>&1 &
# >:标准输出导入到文件中
# 最后的2>&1表示,将报错输出转化为标准输出
确保consul-template命令在后台运行着
ps -elf | grep -v grep | grep consul
4 S root 10424 1931 0 80 0 - 2641 futex_ 10:08 pts/0 00:00:00 consul-template -consul-addr 192.168.1.6:8500 -template /opt/consul/config/nginx-template.ctmpl:/usr/local/nginx/conf/vhost/web1.conf:nginx -s reload --log-level=info
# 如果输出退出,则再将consul-template运行一遍
下载来验证nginx生成的web1.conf配置文件是否生成,且upstream模块中server的变化
cat /usr/local/nginx/conf/vhost/web1.conf
upstream web1 {
ip_hash;
server 192.168.1.4:8501 max_fails=2 fail_timeout=30;
server 192.168.1.5:8502 max_fails=2 fail_timeout=30;
}
为了更加灵活的看到是动态代理微服务,现在通过tail -f
查看日志文件,然后将其中一台producer生产者停掉,在查看日志文件和web1.conf文件的变化
# 日志文件变化
# 读取了consul中服务的变化,并写入到web1.conf配置文件中
2020/02/28 02:29:12.908432 [INFO] (runner) rendered "/opt/consul/config/nginx-template.ctmpl" => "/usr/local/nginx/conf/vhost/web1.conf"
# 将服务文件重载
2020/02/28 02:29:12.908518 [INFO] (runner) executing command "nginx -s reload" from "/opt/consul/config/nginx-template.ctmpl" => "/usr/local/nginx/conf/vhost/web1.conf"
# 服务的所有子进程重载
2020/02/28 02:29:12.908631 [INFO] (child) spawning: nginx -s reload
# web1.conf配置文件upstream模块变化
upstream web1 {
ip_hash;
server 192.168.1.5:8502 max_fails=2 fail_timeout=30;
}
也可以使producer重新上线
现在就可以直接访问nginx来获取微服务的producer的页面
http://192.168.1.7/hello