当前位置: 首页 > 工具软件 > Upsync > 使用案例 >

nginx+Consul+Upsync 实现动态负载均衡

松茂实
2023-12-01

一、Consul

1、作用

        服务注册:可能通过API将服务注册到Consul中。

        服务发现:可以通过API获取服务的IP和PROT。

        故障检测:支持如TCP、HTTP等方式的健康检查机制,从而当服务有故障时自动摘除。

       K/V存储:使用K/V存储实现动态配置中心,其使用HTTP长轮询实现变更触发和配置更改。

        多数据中心:支持多数据中心,可以按照数据中心注册和发现服务,即支持只消费本地机房服务,使用多数据中心集群还可以避免单数据中心的单点故障。

        Raft算法:Consul使用Raft算法实现集群数据一致性。

二、环境搭建

1、安装consul

cd /usr/local/

//下载
wget https://releases.hashicorp.com/consul/1.10.1/consul_1.10.1_linux_amd64.zip

//解压
unzip consul_1.10.1_linux_amd64.zip

//如果解压出现错误:-bash:unzip 未找到命令
//解决办法
yum -y install unzip

//测试是否有安装成功,执行以下
./consul

//启动-----consul
//假设当前linux ip为 192.168.110.110
./consul agent -dev -ui -node=consul-dev-client=192.168.110.110

//如果consul在虚拟机启动后,本地浏览器无法访问的话,换种方式启动consul
./consul agent -dev -ui -node=consul-dev-client=0.0.0.0

//或
./consul agent -dev -client 0.0.0.0 -ui

//访问:浏览器输入 192.168.110.110:8500(默认端口8500)

//若无法访问,尝试关闭防火墙
systemctl stop firewalld

2、安装nginx-upsync-module

cd /usr/local

//下载
wget https://github.com/weibocom/nginx-upsync-module/archive/master.zip

//解压
unzip master.zip

3.配置nginx

groupadd nginx

useradd -g nginx -s /sbin/nologin nginx

mkdir -p /var/tmp/nginx/client/

mkdir -p /usr/local/nginx

4、编译nginx

cd nginx-1.9.0

./configure   --prefix=/usr/local/nginx   --user=nginx   --group=nginx   --with-http_ssl_module   --with-http_flv_module   --with-http_stub_status_module   --with-http_gzip_static_module   --with-http_realip_module   --http-client-body-temp-path=/var/tmp/nginx/client/   --http-proxy-temp-path=/var/tmp/nginx/proxy/   --http-fastcgi-temp-path=/var/tmp/nginx/fcgi/   --http-uwsgi-temp-path=/var/tmp/nginx/uwsgi   --http-scgi-temp-path=/var/tmp/nginx/scgi   --with-pcre --add-module=../nginx-upsync-module-master

make && make install

5、创建upsync_dump_path,指定从consul拉取的上游服务器后持久化到的位置,这样即使consul服务器出问题了,本地还有一个备份。

mkdir /usr/local/nginx/conf/servers/

6、nginx.conf 配置和启动

http {
    include       mime.types;
    
    ##动态去consul server 去获取 注册的真实反射代理地址
    upstream test {
        ##server是固定的,所以随便取个端口号
        server 127.0.0.1:11111;
        ##kv/upstreams/test-- 获取key-value  upstreams的test值
        upsync 192.168.227.134:8500/v1/kv/upstreams/test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=off;
        ##动态获取的consul相关的负载均衡配置 持久化保存到硬盘
        upsync_dump_path /usr/local/nginx/conf/servers/servers_test.conf;

    }
    
    server {
        listen       80;
        server_name  192.168.227.134;
        location / {
            proxy_pass   http://test;
						index index_index.do;
        }
    }
    
}

//启动nginx
/usr/local/nginx/sbin/nginx

//关闭nginx
/usr/local/nginx/sbin/nginx -s stop 

//重启nginx
/usr/local/nginx/sbin/nginx -s reload

//在启动nginx时报错
openssl: error while loading shared libraries: libssl.so.1.1: cannot open shared object file: No such file or directory

//百度都说这问题是安装openssl位置不对,也不知道怎么不对的,解决方案:
ln -s /usr/local/lib64/libssl.so.1.1 /usr/lib64/libssl.so.1.1
ln -s /usr/local/lib64/libcrypto.so.1.1 /usr/lib64/libcrypto.so.1.1


//使用postmen 发送put请求
http://consul服务IP:8500/v1/kv/upstreams/test/192.168.110.110:8081 
http://consul服务IP:8500/v1/kv/upstreams/test/192.168.110.110:8082

三、consul常用API

1、服务注册

        put/post访问 http://192.168.110.110:8500/v1/catalog/register

        选择body -JSON格式,参数:

{
"Datacenter": "dc1",
"Node":"tomcat", 
"Address":"192.168.5.165",
"Service": {
    "Id" :"192.168.5.165:8080", 
    "Service": "itmayiedu",
    "tags": ["dev"], 
    "Port": 8080
    }
}

        解释:

        Datacenter指定数据中心
        Address指定服务IP
        Service.Id指定服务唯一标识
        Service.Service指定服务分组,服务名
        Service.tags指定服务标签(如测试环境、预发环境等)
        Service.Port指定服务端口

2、获取服务

        GET请求:http://192.168.110.110:8500/v1/catalog/service/服务名  

c.添加Key/Value

//添加key value方式:
a.使用linux命令方式发送put请求
curl -X PUT http://consul服务IP:8500/v1/kv/upstreams/test/192.168.2.112:8080

b.使用postmen 发送put请求
http://consul服务IP:8500/v1/kv/upstreams/test/192.168.212.1:8081 

kv 表示key value
upstreams/test 表示添加的是给nginx upstream使用,test 类似分组

 类似资料: