在PasteSpider的文件中,我们可以看到一个appsettings.json文件,这个文件就是PasteSpider系统的配置文件,大致内容如下:
{
"App": {
"CorsOrigins": "http://localhost:5000"
},
"ConnectionStrings": {
"MainConnectionString": "User id=postgres;Password=123456;Host=192.168.1.168;Port=8765;Database=spiderdb;Pooling=true;MaxPoolSize=10;MinPoolSize=0;Connection Lifetime=0;",
"SqliteConnectionString": "Data Source=data/spider.db" //sqlite的链接字符串,注意使用-v进行映射,否则下次更新后数据就丢失了 容器内文件夹为/app/data/spider.db 示例 -v /spider/sqlite/:/app/data/ 记得宿主要先创建文件夹/spider/sqlite
},
"KeeperConfig": {
"GroupName": "default", //集群模式中的群组划分 同一个群组名称的服务器会划分给同名的spider管理
"UseRedis": true, //是否采用redis缓存机制,还是使用内存缓存机制,集群部署模式必须使用redis作为缓存
"SqlDataType": "pgsql", //sqlite pgsql(推荐) 我们将在后续版本中支持mysql(mariadb)/mssql等
"RecoveryHour": 3, //每日凌晨几点进行资源回收
"RecoveryDay": 90, //资源回收跨度(天)
"SingleModel": true, //是否是单例模式(单个PasteSpider,也是可以连接多台服务器的),否则为集群模式(多个PasteSpider组合)
"SlaveToken": "123qwe456asd789cvb", //集群密钥,防止spider接入到其他的集群中
"WorkDir": "/spider/", //绑定的执行目录,如果不需要构建可以不需要设定在docker/podman run 中使用 -v /xxx/:/spider/指定,映射到宿主服务器上 请保持两边一致,否则在直连的时候会有问题
"WaitNginxLoadTime": 10, //等待nginx生效时间
"WaitRunTime": 20, //等待启动最大时间,超过这个时间则判定启动失败!
"LoginAccount": "admin@spider.com", //默认的账号
"LoginPassWord": "123456",//如果不为123456则可以使用这个登陆 默认账号的密码
"Version": "template-version", //系统版本号line_version
"TestImage": "pastetestimage", //创建仓库的时候创建的测试镜像的镜像名称
"UserToken": "1qazxsw23edcvfr4", //token的加密字符串,建议必须更改!!!
"SyncSoftToken": "time_token" //CS客户端文件同步软件使用密钥time_temptoken
},
"RedisConfig": {
"MainConnection": "192.168.1.168:8379,password=123456", //redis连接字符串
"Prefix": "spider:", //redis的key的前缀,防止和其他项目撞库
"ClientName": "spider" //redis连接名称,在redis客户端后台可以查看
},
"IpRateLimiting": {
//false,则全局将应用限制,并且仅应用具有作为端点的规则*。例如,如果您设置每秒5次调用的限制,则对任何端点的任何HTTP调用都将计入该限制
//true, 则限制将应用于每个端点,如{HTTP_Verb}{PATH}。例如,如果您为*:/api/values客户端设置每秒5个呼叫的限制,
"EnableEndpointRateLimiting": false,
//false,拒绝的API调用不会添加到调用次数计数器上;如 客户端每秒发出3个请求并且您设置了每秒一个调用的限制,则每分钟或每天计数器等其他限制将仅记录第一个调用,即成功的API调用。如果您希望被拒绝的API调用计入其他时间的显示(分钟,小时等) //,则必须设置StackBlockedRequests为true。
"StackBlockedRequests": false,
//Kestrel 服务器背后是一个反向代理,如果你的代理服务器使用不同的页眉然后提取客户端IP X-Real-IP使用此选项来设置
"RealIpHeader": "X-Real-IP",
//取白名单的客户端ID。如果此标头中存在客户端ID并且与ClientWhitelist中指定的值匹配,则不应用速率限制。
"ClientIdHeader": "X-ClientId",
//限制状态码
"HttpStatusCode": 429,
"QuotaExceededResponse": {
"Content": "{{ \"message\": \"Too many requests,Please try again in {2} second(s).\", \"code\": 429,\"data \":\"\"}}",
"ContentType": "application/json"
},
////IP白名单:支持Ip v4和v6
//"IpWhitelist": [ "127.0.0.1", "::1/10", "192.168.0.0/24" ],
////端点白名单
"EndpointWhitelist": [ "post:/api/spider/upload/drop","post:/api/spider/upload/delete"],
////客户端白名单
//"ClientWhitelist": [ "dev-id-1", "dev-id-2" ],
//通用规则
"GeneralRules": [
{
//端点路径
"Endpoint": "*",
//时间段,格式:{数字}{单位};可使用单位:s, m, h, d
"Period": "5s",
//限制
"Limit": 30
}
]
},
"Serilog": {
"LevelSwitches": {
"$errorSwitch": "Error",
"$infoSwitch": "Information",
"$warnSwitch": "Warning"
},
"MinimumLevel": {
"Default": "Information",
"Override": {
"Microsoft": "Information",
"System": "Information"
}
},
"WriteTo": [
{
"Name": "Console",
"Args": {
"restrictedToMinimumLevel": "Warning"
}
},
{
"Name": "File",
"Args": {
"path": "logs/log.txt",
"levelSwitch": "$infoSwitch", //也可以使用 restrictedToMinimumLevel:Information
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
},
{
"Name": "File",
"Args": {
"path": "logs/warning.txt",
"levelSwitch": "$warnSwitch",
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
},
{
"Name": "File",
"Args": {
"path": "logs/error.txt",
"levelSwitch": "$errorSwitch",
"rollingInterval": "Day", // "创建文件的类别,可以是分钟,小时,天,月,年": null,
"retainedFileCountLimit": 60, // "--设置日志文件个数最大值,默认31,意思就是只保留最近的31个日志文件", "等于null时永远保留文件": null,
"fileSizeLimitBytes": 3145728, //设置单个文件大小为3M 默认1G
"rollOnFileSizeLimit": true //超过文件大小后创建新的
}
}
],
"Enrich": [ "FromLogContext", "WithMachineName", "WithThreadId" ]
}
}
如上图所示,如果你拆开下载获得的PasteSpider镜像包,在/app/文件夹下可以找到大概如上的内容,我们可以不修改他,在使用podman或者docker启动的时候去修改他,比如我们要修改redis的连接字符串,则:
podman run -it -e RedisConfig:Mainconnection="192.168.0.139:6379,password=111111,defaultdatabase=9" --name myspider -d localhost/imgspider:1059
同理你也可以动态的修改数据库的连接字符串等!
在使用PasteSpider部署你的项目的时候,可以动态的设置这些配置,使用PasteSpider里面的key-val配置,设定为环境变量,结合PasteSpider占位符可以实现很多有意义的需求!
以下是一个使用单例模式,Sqlite数据库,内存缓存的配置启动参考:
docker run -it -v "/spider/:/spider/" -v /spider/data/:/app/data/ -p 8012:80 -e KeeperConfig:SqlDataType="sqlite" -e KeeperConfig:UseRedis=false --name myspider -d imgspider:2000
本章问题:
1.如果在一个宿主机上部署3个订单服务,由于路径映射都是一样的,比如/shop/log/:/app/logs/,按照上面的appsettings.json可以知道他们将公用一个log.txt文件,或者logyyyyMMdd.txt文件,这样应该是有IO问题的,如何解决?
2.如果有一个服务,比如Nodejs,部署了3个nodejs容器,另外一个服务比如main,需要给他们发送信息,也就是需要轮询,如何让nodejs每次部署,都能很好的告知main,使得main能够快速的,正确的给所有Nodejs发送消息?