在docker部署中,需要注意docker日志的处理。可以使用定时脚本处理,也可以使用docker本身的日志配置实现。
本文使用docker本身的日志配置实现。建议使用这种方式。
more >>使用docker部署SpringBoot项目
对服务器环境没有依赖,只需要jdk部署的项目,可以使用openjdk:8-jdk-alpine基础镜像部署。
不止需要jdk,还需要服务器环境的项目,需要使用ubuntu:20.04等基础镜像部署。
注意:
国密环境的FISCO BCOS,现在需要解析合约的输入input参数,解析为类似WeBase或浏览器的展示数据。
本文引入web3sdk,修改TransactionDecoder支持国密算法,实现input解析。
解析input,需要对应合约的ABI,如果解析方法是一个,但是有多个合约,建议合并所有合约的ABI为一个实现。合并ABI的时候不用考虑重复情况,TransactionDecoder在build的时候会追加所有合约方法到Map,重复的会自动覆盖。
如果不合并ABI的话,就需要建立映射,建立input与ABI的对应关系,解析时使用对应的ABI解析。
more >>在API级别限流中,可以使用Redis的频率计数工具实现。
短信验证码的每天发送次数,短信验证码登录的错误次数,等,都需要用到Redis的频率计数工具。
本文提供Redis频率限制函数级方法。
more >>数据库MySQL的update本身具有原子性,在修改时,需要持有这行记录的排它锁,没有拿到锁的提交需要阻塞等待。
这样,通过MySQL的update语句,增加where条件,就可以实现有序扣费。
如果使用查询,扣减,再更新值到数据库,是不能实现线程安全的。必须把查询及扣费的计算放到update语句。
像UPDATE table SET x = x - 1 WHERE id = 10 AND x > 0
语句,如果费用不足,会返回0,业务上如果update失败,说明费用不足了。
另外,还需要注意MySQL的事务。增加了事务,update不一定还满足线程安全。可以设置事务隔离级别为SERIALIZABLE
满足线程安全,但是并发性能会有所降低。
在高并发的场景中,使用Redis计数请求频率。
如果使用get、++、set方法,在并发请求中,是线程不安全的,还需要增加锁实现线程安全。
但是使用incr本身就是线程安全的(单个Redis实例)。
同样,incr或decr或incrby或decrby,还可以使用在扣费逻辑中。先缓存用户余额到redis,redis挡在最前面处理扣费,扣费成功之后,再发送MQ到数据库更新,保证Redis和数据库的数据一致性。数据库更新需要增加重试机制,一定保证扣费更新执行成功。
Incrbyfloat可以支持浮点数。
在支付场景中,有官方侧订单超时时间、业务侧订单超时时间。
假设这两个时间都是15min,当用户在14min59s999ms支付成功的时候,官方侧会给支付成功的回调。但这时候业务侧的订单超时已经执行完成,订单状态已经修改为超时,这时候支付成功的回调会因为订单状态不是待支付而被return。这就导致了购买掉单。
本文描述了 增加成功回调保护时间(延长超时时间) 的方案。
more >>CompletableFuture异步获取多个查询值。
本文是这样使用的,在CompletableFuture外定义一个变量,用于接收CompletableFuture异步之后的返回值,CompletableFuture的返回类型设置为Void。结尾通过 allOf 和 join 阻塞等待所有的异步执行。执行结束,外部定义的变量已拿到异步返回值。
more >>CompletableFuture在异步处理时,可能会发生异常,这时候就需要正确去处理异常。
本文主要讲whenComplete
、exceptionally
、handle
方法去处理异常,关键代码展示用法。
我主要使用exceptionally方法。
more >>tag:
缺失模块。
1、请确保node版本大于6.2
2、在博客根目录(注意不是yilia根目录)执行以下命令:
npm i hexo-generator-json-content --save
3、在根目录_config.yml里添加配置:
jsonContent: meta: false pages: false posts: title: true date: true path: true text: false raw: false content: false slug: false updated: false comments: false link: false permalink: false excerpt: false categories: false tags: true