<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>api 网关功能 :: NJET文档</title>
    <link>https://docs.njet.org.cn/docs/v4.0.1/reference/integration/api_gateway/index.html</link>
    <description>1.功能描述 支持用户角色维护，OpenAPI导入，授权关系维护，应用部署，后端服务注册，主动健康检查配置，登录及授权校验&#xA;用户维护API 需要提供对用户，组及角色及相互关系维护的API&#xA;一个用户可以对应多个用户组&#xA;角色将赋予用户组&#xA;登录API API设计时，需要考虑不同的后端登录服务类型&#xA;需要提供一个内置的登录服务，内置的登录服务提供如下登录方式：a.)持久化存储中保存的用户名密码做登录校验 b.)通过Email 发送校验码，用户通过校验码登录。&#xA;客户端调用登录API后，将获得一个 token, token 只是一个uuid, 其它的信息（expire_time, role, …) 保存到持久化存储中。&#xA;后续对其它API的调用需要在Header 中设置该token。&#xA;授权API 需要提供 location 下api与角色间授权关系维护的API&#xA;HTTP 不同的method 需要能够设置不同的访问权限&#xA;访问校验 对应用提供的API 访问，API网关需要校验token 有效性及授权关系。&#xA;Token 无效或过期返回 401错误。&#xA;对应角色无访问权限返回403 错误。&#xA;校验成功则由应用进行后续处理。&#xA;应用部署 文件上传使用已有的 /api/v1/upload 接口，做为应用服务器，提供应用部署接口， 需要能够将上传的压缩包解压，部署接口中需要调用动态location , 入口文件可以使用预先约定的方式&#xA;API Gateway 管理员agw_admin 的默认密码，rpm/deb 安装时，将生成默认密码，使用 sbin/agw_passwd 工具进行密码设置 API Gateway 不允许删除默认的用户 2.依赖模块 这个版本将openapi module从静态改变为动态module,需要在njet.conf中增加load_module modules/njt_openapi_util_module.so&#xA;njet.conf:&#xA;load_module modules/njt_http_token_sync_module.so; load_module modules/njt_openapi_util_module.so; njet_ctrl.conf:&#xA;load_module modules/njt_http_lua_module.so; 3.配置样例 njet.conf&#xA;helper broker modules/njt_helper_broker_module.so conf/mqtt.conf; helper ctrl modules/njt_helper_ctrl_module.so conf/njet_ctrl.conf; helper rsync modules/njt_helper_rsync_module.so conf/rsync.conf; load_module modules/njt_http_dyn_map_module.so; load_module modules/njt_agent_dynlog_module.so; load_module modules/njt_http_location_module.so; load_module modules/njt_dyn_ssl_module.so; load_module modules/njt_http_vtsc_module.so; load_module modules/njt_http_dyn_limit_module.so; load_module modules/njt_http_dyn_crl_module.so; load_module modules/njt_http_lua_module.so; load_module modules/njt_http_dyn_lua_module.so; load_module modules/njt_http_token_sync_module.so; ## 依赖该模块 load_module modules/njt_openapi_util_module.so; cluster_name helper; node_name node156; worker_processes 1; #user root; error_log logs/error.log info; pid logs/njet.pid; events { worker_connections 1024; } http { resolver 8.8.8.8; include mime.types; access_log off; vhost_traffic_status_zone; lua_package_path &#34;$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;/usr/local/njet/modules/?.lua;$prefix/apps/?.lua;;&#34;; lua_package_cpath &#34;$prefix/lualib/clib/?.so;;&#34;; token_sync zone=token:4M sync_time=5s clean_time=10s; lua_shared_dict configuration_data 20M; init_by_lua_block { local api_gateway=require(&#34;api_gateway&#34;) api_gateway.init_master() } init_worker_by_lua_block { local api_gateway=require(&#34;api_gateway&#34;) api_gateway.init_worker() } upstream upstream_balancer { server 0.0.0.1; balancer_by_lua_block { balancer.balance() } keepalive 320; keepalive_time 1h; keepalive_timeout 120s; keepalive_requests 10000; } server { listen 8080; server_name frontserver8080; location / { root html; } location /api_gateway { # content_by_lua_file modules/api_gateway/auth.lua; content_by_lua_block { local api_gateway=require(&#34;api_gateway&#34;) api_gateway.auth() } } location /token_get { content_by_lua_block { local token_lib=require(&#34;njt.token&#34;) local args, err = njt.req.get_uri_args() local key = args[&#34;key&#34;] local rc,msg = token_lib.token_get(key) if rc == 0 then njt.say(&#34;old value is: &#34;..msg) else njt.say(&#34;there is no such key in kv&#34;) end } } } server { listen 8001; server_name backserver8001; location / { return 200 &#34;80018001&#34;; } } server { listen 8002; server_name backserver8002; location / { return 200 &#34;80028002&#34;; } } server { listen 8003; server_name backserver8003; location / { return 200 &#34;80038003&#34;; } } } stream { server { listen 238.255.253.251:5557 udp; gossip zone=test:1m heartbeat_timeout=100ms nodeclean_timeout=1s local_ip=192.168.40.156 sync_port=8873 ctrl_port=8081 ; } } njet_ctrl.conf:</description>
    <generator>Hugo</generator>
    <language>zh</language>
    <lastBuildDate>Mon, 13 Oct 2025 17:00:18 +0800</lastBuildDate>
    <atom:link href="https://docs.njet.org.cn/docs/v4.0.1/reference/integration/api_gateway/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>token持久化</title>
      <link>https://docs.njet.org.cn/docs/v4.0.1/reference/integration/api_gateway/token_sync/index.html</link>
      <pubDate>Mon, 13 Oct 2025 17:00:18 +0800</pubDate>
      <guid>https://docs.njet.org.cn/docs/v4.0.1/reference/integration/api_gateway/token_sync/index.html</guid>
      <description>1.功能描述 集群内API网关的token，需要及时同步，用于client访问节点A进行认证，后续请求访问B。 NJet 需要提供一个通用的会话同步机制，设置会话信息时，会话 id 是一个长字符串，会话信息需要能够设置有效期（TTL)，过期的会话信息能够自动清除。查询时，输入参数是会话 id, 返回 addtional_data 。 token信息支持持久化，njet重启后会恢复（njet4.0以后版本支持） 2.依赖模块 load_module modules/njt_http_lua_module.so; load_module modules/njt_http_token_sync_module.so; 3.指令说明 提供一个http模块: njt_http_token_sync_module 在http main部分提供 token_sync 指令&#xA;Syntax: token_sync zone={zonename}:{zonesize} sync_time={sync_time} clean_time={clean_time}; Default: - Context: http 参数 取值 必填 说明 zone {name}:{size}比如token:4M Y 配置共享内存的名称和大小，用于存储token信息 sync_time 时间单位， 比如2s， 默认2s N token信息同步时间间隔 clean_time 时间单位， 比如5s， 默认5s N token过期清理时间间隔 4.配置样例 njet.conf:&#xA;load_module modules/njt_http_lua_module.so; load_module modules/njt_http_token_sync_module.so; http { dyn_kv_conf conf/iot-work.conf; include mime.types; access_log off; vhost_traffic_status_zone; access_log_write_zone on; access_log_zone log_zone 100m; #access_log_zone_ignore_ip 127.0.0.1; access_log_zone_valid 3; token_sync zone=token:4M sync_time=5s clean_time=10s; lua_package_path &#34;$prefix/lualib/lib/?.lua;$prefix/modules/?.lua;$prefix/apps/?.lua;;&#34;; lua_package_cpath &#34;$prefix/lualib/clib/?.so;;&#34;; server { listen 8089; location / { root html; } location /token_get { content_by_lua_block { local token_lib=require(&#34;njt.token&#34;) local args, err = njt.req.get_uri_args() local key = args[&#34;key&#34;] njt.say(&#34;key:&#34;..key) local rc,msg = token_lib.token_get(key) njt.say(&#34;msg:&#34;..msg) njt.say(&#34;rc:&#34;..rc) if rc == 0 then njt.say(&#34;old value is: &#34;..msg) else njt.say(&#34;there is no such key in kv&#34;) end } } location /token_set { content_by_lua_block { local token_lib = require(&#34;njt.token&#34;) local args, err = njt.req.get_uri_args() -- 获取 key, value 和 ttl 参数 local key = args[&#34;key&#34;] local value = args[&#34;value&#34;] local ttl_str = args[&#34;ttl&#34;] -- ttl 以字符串形式传递 -- 检查必要的参数是否存在 if not key or key == &#34;&#34; then njt.say(&#34;Error: key is required.&#34;) return end if not value or value == &#34;&#34; then njt.say(&#34;Error: value is required.&#34;) return end if not ttl_str or ttl_str == &#34;&#34; then njt.say(&#34;Error: ttl is required.&#34;) return end -- 将 ttl 转换为整数 local ttl = tonumber(ttl_str) if not ttl then njt.say(&#34;Error: ttl must be a number.&#34;) return end local rc = token_lib.token_set(key,value, ttl) -- 假设 token_set 接受的是 njt_str_t -- 根据返回值进行处理 if rc == 0 then njt.say(&#34;Token set successfully for key: &#34; .. key .. &#34;, value: &#34; .. value .. &#34;, ttl: &#34; .. ttl) else njt.say(&#34;Error setting token. Return code: &#34; .. rc) end } } } } 组播集群配置</description>
    </item>
  </channel>
</rss>