本系列其他文章
dbrest 快速入门
dbrest 功能介绍
dbrest 配置说明
dbrestapi调用说明含样例代码
dbrest lua脚本模板
dbrest小试牛刀
dbrest压测结果
conf.xml配置说明
<?xml version="1.0" encoding="UTF-8" ?>
<Config>
<!--http监听端口-->
<ListenPort>9000</ListenPort>
<TLSConfig>
<Enabled>true</Enabled>
<CertPath>your_ssl.pem</CertPath>
<KeyPath>your_ssl.key</KeyPath>
</TLSConfig>
<!--是否以Debug模式运行,Debug模式会输出完整日志。缺省值:false-->
<Debug>true</Debug>
<!--api路径名称,缺省值:/api-->
<ApiPath/>
<!--http读写超时(秒),缺省值:300-->
<ReadWriteTimeout/>
<!--是否支持Gzip,启用时会响应Accept-Encoding: gzip。缺省值: false-->
<EnableGzip/>
<!--是否支持跨域调用-->
<EnableCors/>
<!--限定来源域配置,仅在EnableCors设置为true时,此配置项才生效。多来源域用英文逗号分隔。缺省默认值:*,表示允许所有来源域-->
<AllowedOrigins/>
<!--是否启用IP限速-->
<Limitable/>
<!--每秒钟限制请求数;仅在Limitable设置为true时,此配置项才生效。-->
<LimitRps/>
<!--http请求body大小限制(KB);缺省值:0,表示不限制-->
<MaxRequestBodySize/>
<!--代理深度;经由几层反向代理服务器访问此服务;缺省值:0-->
<ProxiedDepth/>
<!--序列化JSON时是否转义html;缺省值:false-->
<EscapeHtml/>
<!--数据库配置-->
<DBConfig>
<!--supported driver: [mysql, mssql, postgres]-->
<Driver>mysql</Driver>
<Server>127.0.0.1</Server>
<Port>3306</Port>
<User>root</User>
<Password>123456</Password>
<Database>db1</Database>
<!--与数据库建立连接时超时时间(秒),缺省值:15-->
<ConnectTimeout></ConnectTimeout>
<!--最大连接数,缺省值:数据库中设置-->
<MaxOpenConns></MaxOpenConns>
<!--连接存活时间(秒),缺省值:数据库中设置-->
<ConnMaxLifetime></ConnMaxLifetime>
<!--DSN Enabled为true时,使用ConnectionString中定义的连接字符串连接数据库。ConnectionString支持URL格式也支持Driver特有的格式。
请注意,不同的数据库Driver,ConnectionString的URL格式有差异。
mysql中密码含有特殊字符时无需转义,其余需要预先urlEnocde转义
xml中&要转义为&
mysql:ConnectionString="username:password@tcp(host:port)/dbname?charset=utf8&multiStatements=true&timeout=15s"
mssql:ConnectionString="sqlserver://username:password@host:port?database=dbname&encrypt=disable&connection+timeout=15"
pg:ConnectionString="postgres://username:password@host:port/dbname?sslmode=disable&connect_timeout=15"
-->
<DSN Enabled="false" ConnectionString="root:123456@tcp(127.0.0.1:3306)/db1?charset=utf8&multiStatements=true&timeout=15s"/>
<!--时区,默认值UTC,本地时区用Local表示-->
<Location/>
<!--数据库返回的日期格式,默认UTC格式-->
<DBDateTimeFormat/>
<!--时区时差(分)-->
<DBZoneOffsetMinutes/>
</DBConfig>
<!--表名是否强制转为小写,缺省值:false,当配置为true时,配置中涉及到的表名称,
以及客户端请求URL路径中的表名称,会强制转为小写进行路由匹配。-->
<LowerCaseTableNames/>
<!--代理的表集合-->
<Tables>
<Table>
<!--Schema名称,缺省值:空。匹配数据库用户的默认Schema-->
<Schema/>
<!--表名称,LowerCaseTableNames配置值为false时,区分大小写-->
<Name>tab1</Name>
<!--SQL中表名是否需要用引括号括住(``,[],""),表名中含有特殊字符或者postgres表中使用了大写字母时需要设置为true,缺省值:false-->
<NeedQuoted/>
<!--表查询是否需要用户认证,缺省值:false-->
<NeedAuth>true</NeedAuth>
<!--表是否允许Insert,缺省值:false-->
<Insertable>false</Insertable>
<!--表是否允许Update,缺省值:false-->
<Updatable>false</Updatable>
<!--表是否允许Delete,缺省值:false-->
<Deletable>false</Deletable>
<!--表中AccessKey对应的列名,缺省值:空值。注意:配置了列名后,针对http Get查询, 仅当NeedAuth为true时,过滤才生效-->
<UserIDColumn/>
<!--并发写入数,缺省不限制并发数-->
<ParallelCount/>
<!--扩展的lua脚本文件,lua文件模板参考demo.lua文件。缺省值:空值。-->
<LuaFile/>
<!--Lua脚本生成的SQL是否在主事务中执行,缺省值:false-->
<LuaProcessInTrans/>
<!--表查询默认返回记录数量的limit限制,缺省值:0-->
<DefaultLimit/>
</Table>
<Table><Schema/><Name>emp</Name><NeedAuth>true</NeedAuth><Insertable>true</Insertable><Updatable>true</Updatable><Deletable>true</Deletable><ParallelCount/></Table>
</Tables>
<!--IP拦截器配置;细粒度优先级大于粗粒度优先级,允许优先级高于阻塞优先级,默认允许所有-->
<IPBarrierConfig>
<!--是否启用IPBarrier模块,缺省值:false 表示不开启-->
<Enabled>true</Enabled>
<!--缺省是否阻塞(true:阻塞,false:允许); 缺省值false,表示允许所有IP-->
<BlockByDefault/>
<!--split multiple ip or subnet addresses by commas-->
<AllowedIPs/>
<BlockedIPs/>
<!--split multiple country ISO codes by commas-->
<BlockedCountries>AU,CA,US,JP</BlockedCountries>
<AllowedCountries/>
</IPBarrierConfig>
<AuthConfig>
<!--dbrest支持三种鉴权:BasicAuth, MD5Auth, BearerTokenAuth-->
<!--BasicAuth即 http basic authorization,
AccessAccount中配置的AccessKey与AccessSecret
分别对应basic authorization认证需要的username与password
验证方法请自行百度,此处不再详述
-->
<!--MD5Auth鉴权方式:调用方在发送http请求前,在Headers中增加4个键值对,伪代码如下:
//AccessAccount中配置的AccessKey值
var AccessKey ="client2";
//AccessAccount中配置的AccessSecret值
var AccessSecret = "12345";
//当前时间戳(格式yyyyMMddHHmmss,例如:20200928234836)
var clientTime = DateTime.Now().ToString("yyyyMMddHHmmss");
//对上面定义的三个字符串变量连接后进行md5签名
//Utils.MD5表示对字符串进行md5计算的函数
var md5Sign = Utils.MD5(AccessKey+clientTime+AccessSecret);
http.Request.Headers.Add("AccessKey",AccessKey);
http.Request.Headers.Add("ClientTime",clientTime);
http.Request.Headers.Add("Authorization",md5Sign);
http.Request.Headers.Add('Content-Type':'application/json;charset=utf-8')
//向服务器发送请求(CURD)...
-->
<!--BearerTokenAuth鉴权方式, 即jwt(json web token); 分两个步骤,第1步,调用生成jwt的api,生成一个jwt。第2步访问业务API时Headers参数中携带生成的jwt。
1.生成jwt:
1.1) 生成jwt的api的URL格式: http://您的服务器IP:端口/<ApiPath>节点参数值+_gentoken
例如:ApiPath默认值是"api",端口配置为9000, 则本地访问url为: http://127.0.0.1:9000/api_gentoken
例如您修改配置的ApiPath的值为api2,则本地访问url为: http://127.0.0.1:9000/api2_gentoken
1.2), http Method: 支持POST或者GET
1.3),传参方式:
传参方式与MD5Auth鉴权方式完全相同,也是在Headers中增加4个键值对,细节不再重复说明,请参看MD5Auth鉴权方式。
1.4)返回格式:
调用成功返回http状态码200, 返回报文: {"token":"返回的token字符串","maxAge":"token存活时长(秒)","error":""}
调用失败返回http对应的错误状态码, 返回报文: {"error":"错误描述"}
说明:超过存活时长后,jwt将过期,你需要重新生成一个jwt.
2.访问业务API:
Headers中增加参数"Authorization",设置其值为"Bearer " + 第1步成功返回的报文中的token值。
例如:第一步成功返回报文为:{"token":"aaabbbccc","maxAge":86400}
则Authorization参数设置的伪代码如下:
http.Request.Headers.Add("Authorization","Bearer aaabbbccc");
//向服务器发送请求(CURD)...
-->
<!--AuthType: BasicAuth, MD5Auth, BearerTokenAuth; BasicAuth is default vlue-->
<AuthType></AuthType>
<!--客户端请求时间戳,与服务器时间误差范围允许的值范围,最小值3秒。AuthType值是MD5Auth时,此配置生效-->
<!--minimum 3 seconds-->
<AuthTimeout>10</AuthTimeout>
<!--BearerTokenConfig is only useful when AuthType is BearerTokenAuth-->
<!--SigningKey: jwt签名密钥,缺省值为"yourSecret"; MaxAge: jwt存活时间(秒),缺省值为86400-->
<BearerTokenConfig SigningKey="yourSecret" MaxAge="86400"/>
<!--调用方安全账户配置-->
<AccessAccounts>
<!---AccessKey:用户名;AccessSecret:用户密钥-->
<AccessAccount AccessKey="client1" AccessSecret="abcde">
<!--调用方允许访问的表名称,多表名之间用英文逗号","分割
LowerCaseTableNames配置值为false时,表名区分大小写,
建议表名称与Tables配置节的表名称保持一致.
如果配置了Schema,请在此处用Schema名称.表名称,例如dbo.students
-->
<AllowedTables>tab1,tab2</AllowedTables>
<!--调用方允许访问的ApiFuncs的匹配模式;判断ApiFunc的Patterns是否匹配AllowedPatterns定义的正则pattern list,pattern之间以英文逗号','分隔-->
<AllowedPatterns></AllowedPatterns>
<!--是否启用验证调用方IP白名单-->
<FilterByIP>false</FilterByIP>
<!--调用方IP地址白名单,多IP用英文逗号","分割。-->
<!--split multiple ip addresses by commas-->
<ClientIP>127.0.0.1</ClientIP>
<PubField01></PubField01>
<PubField02></PubField02>
<PubField03></PubField03>
<PubField04></PubField04>
<PubField05></PubField05>
<PriField01></PriField01>
<PriField02></PriField02>
<PriField03></PriField03>
<PriField04></PriField04>
<PriField05></PriField05>
</AccessAccount>
<AccessAccount AccessKey="client2" AccessSecret="12345">
<AllowedTables>*</AllowedTables>
<AllowedPatterns>*</AllowedPatterns>
<FilterByIP>true</FilterByIP>
<!--split multiple ip addresses by commas-->
<ClientIP>127.0.0.1, 192.168.243.1</ClientIP>
</AccessAccount>
</AccessAccounts>
</AuthConfig>
<!--定时任务配置,商用版支持-->
<Jobs>
<!--Cron表达式与linux cron表达式相同-->
<Job Cron="*/1 * * * *" LuaFile="demo.lua" Func="job1"/>
<Job Cron="*/2 * * * *" LuaFile="demo.lua" Func="job2"/>
</Jobs>
<!--文件服务器配置-->
<FileServerConfigs>
<FileServerConfig>
<!--是否开启文件服务,缺省值:false 表示不开启-->
<Enabled>false</Enabled>
<!--服务器物理路径, 不允许空值-->
<ResourcesRoot>c:/usbssd/</ResourcesRoot>
<!--http请求根路径, 不允许空值-->
<RequestURIRoot>/api_resources/</RequestURIRoot>
<!--上传附件的key值, 缺省值"file"-->
<!--g.print(g.requests("POST","http://127.0.0.1:9000/api_upload0",'','{"Content-Type":"multipart/form-data"}','{"@file":"c:/test.pdf"}'))-->
<UploadFileKey>file</UploadFileKey>
<!--上传附件存放到ResourcesRoot属性指定的目录下的子目录名称。缺省值为空,表示存放到ResourcesRoot属性指定的目录下-->
<UploadSubDir>tmp</UploadSubDir>
<!--文件服务是否需要鉴权, 缺省值"false"-->
<NeedAuth>true</NeedAuth>
<!--上传附件的大小限制(KB), 缺省值1024(即1MB),最大别超过100MB-->
<MaxUploadSize/>
</FileServerConfig>
</FileServerConfigs>
<ApiFuncs>
<!--Pattern属性表示相对路径; Method表示HttpMethod,缺省值:"GET"; Synchronized表示是否需要线程同步, 缺省值"false"; NeedAuth表示是否需要鉴权, 缺省值"false"; Precompiled表示是否预编译,缺省值"false";-->
<ApiFunc Pattern="/apid/func1" Method="POST" NeedAuth="false" LuaFile="apifunc.lua" Func="func1" Precompiled="true"/>
<ApiFunc Pattern="/apid/func2" Method="GET" NeedAuth="false" LuaFile="apifunc.lua" Func="func2" Precompiled="true"/>
</ApiFuncs>
<!--反向代理配置-->
<RPConfig >
<!--是否开启服务,缺省值:false 表示不开启-->
<Enabled>true</Enabled>
<!--http请求根路径, 不允许空值, 缺省值为<ApiPath>节点的值+"_rp/"后缀。例如"/api_rp/"-->
<RequestURIRoot></RequestURIRoot>
<Locations>
<!--Pattern属性表示代理子路径; HostName表示实际被代理的主机路径; NeedAuth表示是否需要代理服务器代鉴权, 缺省值"false"; -->
<Location Pattern="/path1" HostName="https://www.infoswap.cn:443/" NeedAuth="true"/>
<Location Pattern="/path2" HostName="http://100.100.100.100:9000/"/>
</Locations>
</RPConfig>
<!--本地缓存大小(单位MB),缺省值512KB-->
<LocalCacheSize/>
<!--redis配置,Enable属性为"true"时,配置生效。DataBase属性表示DB的索引,Timeout属性表示连接以及读写操作的超时时间(秒)-->
<RedisConfig Enabled="true" Host="127.0.0.1:6379" Password="" DataBase="0" Timeout="300"/>
<!--mongodb配置,Enable为"true"时,配置生效。Uri属性表示DB的URI,Timeout属性表示连接以及读写操作的超时时间(秒)-->
<MgoConfig Enabled="true" Uri="mongodb://localhost:27017/?maxPoolSize=3" Timeout="10"/>
<License>pls paste your license here</License>
</Config>