服务发现

1. 功能说明

http,stream upstream 配置域名格式的server,定期查询dns server进行域名解析,实现对upstream server 的添加,删除,修改。并且支持upstream中添加service字段,可以使用DNS服务器中配置的SRV记录。

2. 配置说明

2.1 配置示例

user root root;
worker_processes 1;
error_log /home/njet/logs/error.log debug;
events {
    worker_connections  1024;
}

http {
    dyn_kv_conf conf/iot.conf;
    error_log /home/njet/logs/error.log debug;
    access_log /home/njet/logs/access.log combined;

    upstream http1{
            zone upstream_http 64k;
            resolver 192.168.40.101 valid=10s;
            state  zyg11.conf;
    }
   upstream http2{
            zone upstream_http 64k;
            resolver 192.168.40.101 valid=10s;
            server  www.dev.test.com resolve;
    }
    server {
        listen        8000;
        server_name  cluster1;
        location / {
            proxy_pass http://http1;
        }
    }
    server {
        listen 8899;
        server_name cluster2;
    }
}
stream{

   upstream stream_upstream{
            zone upstream_stream 64k;
            resolver 192.168.40.101 valid=10s;
            state  zyg_stream.conf;
            }
   server {
    listen        9000;
    proxy_pass  stream_upstream;
   }
}
helper ctrl /home/njet/modules/njt_helper_ctrl_module.so /home/njet/conf/njet_ctrl.conf;
helper broker /home/njet/modules/njt_helper_broker_module.so conf/mqtt.conf;
cluster_name helper;
node_name node1;

3. 指令说明

3.1 resolver

Syntax: resolver address ... [valid=*time*] [ipv4=on|off] [ipv6=on|off] ;
Default:
Context: upstream

说明:配置自定义dns解析地址。

参数说明:

valid:域名失效的周期,也就是查询dns 的周期。支持标准的NJet时间字段。

3.2 resolver_timeout

Syntax: resolver_timeout time;
Default: resolver_timeout 30s;
Context: upstream

说明:设置dns解析超时时间,默认30s。

3.3 state

Syntax: state file;
Default:
Context: upstream

说明:state zyg_stream.conf; 通过upstream api 接口添加的upstream server 信息的保存路径。reload 之后不会丢失。不配置的话,不保存。 reload 之后丢失。

3.4 server

Syntax: server address [parameters]
Default:
Context: upstream

说明:配置server,可以配置ip,unix,域名等类型。

特别参数:

resolve : 配置静态的动态域名。删除后reload 之后,还会加载。 例如: serverwww.dev.test.comresolve;注意:server 字段和state 字段冲突。 不能静态动态混用。

service:server test.muti.com service=_sip._tcp resolve;根据域名下的,服务请求,ip 列表。

3. 调用样例

3.1 静态配置包含service的域名

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;

load_module  modules/njt_http_dyn_upstream_module.so;
load_module  modules/njt_http_upstream_member_module.so;

worker_processes  auto;

cluster_name helper;
node_name node1;

shared_slab_pool_size  100m;

error_log  logs/error.log info;
pid        logs/njet.pid;


events {
    worker_connections  1024;
}


http {
  
    dyn_kv_conf conf/iot-work.conf;
    include       mime.types;
    #default_type  application/octet-stream;

    include  test.conf;
   
    #default_type text/html;
 
    access_log  logs/access.log;
  
    sendfile        on;

    keepalive_timeout  65;

    resolver 192.168.40.101 valid=5s;
  

     upstream backend1 {
  
        zone backend1 128k;
    
        server test.muti.com service=_sip._tcp   resolve; 
   
  
     }

    server {
  
        listen 5555;
        server_name localhost;         

         location / {
           
              proxy_pass http://backend1;
         }

   }

     }

     server {

           listen 5900;

           location / {

                  return 200 "test 5900";
          }


     }

     server {

           listen 5901;

           location / {

                    return 200 "test 5901";
          }


     }

     server {

           listen 5902;

           location / {
  
                  return 200 "test 5902";

          }


     }




}


stream {
   
         resolver 192.168.40.101 valid=10s;
    
         upstream backend_s1 {
  
              zone backend_s1 128k;
 
              server 127.0.0.1:22222;
       
       }
   
       server {

                listen 22222;
                return "22222 ok";
       }


       server {

                listen 22223;
                proto_pass backend_s1;
       }


}

通过upstream api查询解析结果

curl -X GET http://127.0.0.1:8081/api/v1/upstream_api/http/upstreams/backend1/servers | jq

[
  {
    "id": 1,
    "server": "127.0.0.1:5901",
    "weight": 1,
    "max_conns": 0,
    "max_fails": 1,
    "fail_timeout": "10s",
    "slow_start": "0s",
    "route": "",
    "backup": false,
    "down": false,
    "parent": 0,
    "host": "test2.test.muti.com"
  },
  {
    "id": 2,
    "server": "127.0.0.1:5900",
    "weight": 1,
    "max_conns": 0,
    "max_fails": 1,
    "fail_timeout": "10s",
    "slow_start": "0s",
    "route": "",
    "backup": false,
    "down": false,
    "parent": 0,
    "host": "test1.test.muti.com"
  },
  {
    "id": 3,
    "server": "127.0.0.1:5902",
    "weight": 1,
    "max_conns": 0,
    "max_fails": 1,
    "fail_timeout": "10s",
    "slow_start": "0s",
    "route": "",
    "backup": false,
    "down": false,
    "parent": 0,
    "host": "test3.test.muti.com"
  },
  {
    "id": 0,
    "server": "test.muti.com",
    "weight": 1,
    "max_conns": 0,
    "max_fails": 1,
    "fail_timeout": "10s",
    "slow_start": "0s",
    "route": "",
    "service": "_sip._tcp",
    "backup": false,
    "down": false
  }
]

3.2 动态配置包含service的域名

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;

load_module  modules/njt_http_dyn_upstream_module.so;
load_module  modules/njt_http_upstream_member_module.so;

worker_processes  auto;

cluster_name helper;
node_name node1;

shared_slab_pool_size  100m;

error_log  logs/error.log info;
pid        logs/njet.pid;


events {
    worker_connections  1024;
}


http {
  
    dyn_kv_conf conf/iot-work.conf;
    include       mime.types;
    #default_type  application/octet-stream;

    include  test.conf;
   
    #default_type text/html;
 
    access_log  logs/access.log;
  
    sendfile        on;

    keepalive_timeout  65;

    resolver 192.168.40.101 valid=5s;
  

     upstream backend1 {
  
        zone backend1 128k;
    
  
     }

    server {
  
        listen 5555;
        server_name localhost;         

         location / {
           
              proxy_pass http://backend1;
         }

   }

     }

     server {

           listen 5900;

           location / {

                  return 200 "test 5900";
          }


     }

     server {

           listen 5901;

           location / {

                    return 200 "test 5901";
          }


     }

     server {

           listen 5902;

           location / {
  
                  return 200 "test 5902";

          }


     }




}


stream {
   
         resolver 192.168.40.101 valid=10s;
    
         upstream backend_s1 {
  
              zone backend_s1 128k;
 
              server 127.0.0.1:22222;
       
       }
   
       server {

                listen 22222;
                return "22222 ok";
       }


       server {

                listen 22223;
                proto_pass backend_s1;
       }


}

添加域名:

curl -X POST http://127.0.0.1:8081/api/v1/upstream_api/http/upstreams/backend1/servers -d '{
  "server": "test.muti.com",
  "weight": 4,
  "max_conns": 0,
  "max_fails": 1,
  "fail_timeout": "10s",
  "slow_start": "10s",
  "route": "",
  "backup": false,
  "down": false,
  "service": "_sip._tcp"
}'

返回

* processing: http://127.0.0.1:8081/api/v1/upstream_api/http/upstreams/backend1/servers
*   Trying 127.0.0.1:8081...
* Connected to 127.0.0.1 (127.0.0.1) port 8081
> POST /api/v1/upstream_api/http/upstreams/backend1/servers HTTP/1.1
> Host: 127.0.0.1:8081
> User-Agent: curl/8.2.1
> Accept: */*
> Content-Length: 207
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 201 Created
< Server: njet/3.2.2
< Date: Tue, 01 Jul 2025 06:18:07 GMT
< Content-Type: application/json
< Content-Length: 173
< Connection: keep-alive
< 
* Connection #0 to host 127.0.0.1 left intact

{
  "id": 0,
  "server": "test.muti.com",
  "weight": 4,
  "max_conns": 0,
  "max_fails": 1,
  "fail_timeout": "10s",
  "slow_start": "10s",
  "route": "",
  "service":"_sip._tcp"
  "backup": false,
  "down": false
}

3.3 动态upstream并配置包含service的域名

helper broker modules/njt_helper_broker_module.so conf/mqtt.conf;
helper ctrl modules/njt_helper_ctrl_module.so conf/ctrl.conf;

load_module  modules/njt_http_dyn_upstream_module.so;
load_module  modules/njt_http_upstream_member_module.so;

worker_processes  auto;

cluster_name helper;
node_name node1;

shared_slab_pool_size  100m;

error_log  logs/error.log info;
pid        logs/njet.pid;


events {
    worker_connections  1024;
}


http {
  
    dyn_kv_conf conf/iot-work.conf;
    include       mime.types;
    #default_type  application/octet-stream;

    include  test.conf;
   
    #default_type text/html;
 
    access_log  logs/access.log;
  
    sendfile        on;

    keepalive_timeout  65;

    resolver 192.168.40.101 valid=5s;
  

     upstream backend1 {
  
        zone backend1 128k;
    
  
     }

    server {
  
        listen 5555;
        server_name localhost;         

         location / {
           
              proxy_pass http://backend1;
         }

   }

     }

     server {

           listen 5900;

           location / {

                  return 200 "test 5900";
          }


     }

     server {

           listen 5901;

           location / {

                    return 200 "test 5901";
          }


     }

     server {

           listen 5902;

           location / {
  
                  return 200 "test 5902";

          }


     }




}


stream {
   
         resolver 192.168.40.101 valid=10s;
    
         upstream backend_s1 {
  
              zone backend_s1 128k;
 
              server 127.0.0.1:22222;
       
       }
   
       server {

                listen 22222;
                return "22222 ok";
       }


       server {

                listen 22223;
                proto_pass backend_s1;
       }


}

添加动态upstream

curl -X POST http://127.0.0.1:8081/api/v1/dyn_ups -d '{
  "type": "add",
  "upstream_name": "dyn_backend1",
  "upstream_body": "zone dyn_backend1 1m;state upstream_dyn_backend1.conf;resolver 192.168.40.101 valid=10s;"
}'

返回

{
  "code": 0,
  "msg": "success."
}

向动态upstream中添加域名

curl -X POST http://127.0.0.1:8081/api/v1/upstream_api/http/upstreams/dyn_backend1/servers -d '{
  "server": "test.muti.com",
  "weight": 4,
  "max_conns": 0,
  "max_fails": 1,
  "fail_timeout": "10s",
  "slow_start": "10s",
  "route": "",
  "backup": false,
  "down": false,
  "service": "_sip._tcp"
}'

返回

* processing: http://127.0.0.1:8081/api/v1/upstream_api/http/upstreams/dyn_backend1/servers
*   Trying 127.0.0.1:8081...
* Connected to 127.0.0.1 (127.0.0.1) port 8081
> POST /api/v1/upstream_api/http/upstreams/backend1/servers HTTP/1.1
> Host: 127.0.0.1:8081
> User-Agent: curl/8.2.1
> Accept: */*
> Content-Length: 207
> Content-Type: application/x-www-form-urlencoded
> 
< HTTP/1.1 201 Created
< Server: njet/3.2.2
< Date: Tue, 01 Jul 2025 06:18:07 GMT
< Content-Type: application/json
< Content-Length: 173
< Connection: keep-alive
< 
* Connection #0 to host 127.0.0.1 left intact

{
  "id": 0,
  "server": "test.muti.com",
  "weight": 4,
  "max_conns": 0,
  "max_fails": 1,
  "fail_timeout": "10s",
  "slow_start": "10s",
  "route": "",
  "service":"_sip._tcp"
  "backup": false,
  "down": false
}