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

查看集群中服务端

ui_consul

select_server

查看集群中节点

consul_nodes

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_consul

以下都显示绿色,则代表两台producer运行成功

producer_ping

将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

评论




正在载入...
PoweredHexo
HostedAliyun
DNSAliyun
ThemeVolantis
UV
PV
BY-NC-SA 4.0