Web Experiences

Web Experiences

尽量不要使用或者开发不明意义的API接口

比如addorupdate这种

add就是操作add

update就是update,通过put方法,让CRUD更加有效会让很多时候减少必要的错误

如果不确定是update还是create,就应该获取id,根据id是否存在或者保存好,然后决定创建还是销毁

C-S架构的程序,S怎么能知道C掉线

无网关的情况

  1. 在较简单的网络中,可以通过服务器端轮询所有的C的/health/status获得实时结果

优点:代码简单,适合非nat且有外网ip的网络

缺点:考虑网络不对称的情况下,存在无法双向通信的问题,不适合大量使用

有网关的情况

Aplus. 依然用轮询,这个适合让每一个网关程序帮忙轮询,并统一上报

网关程序也会转发服务器的一些状态信息,搜集服务器的云信息等额外信息,充当管家的角色

优点:实现全网双向通信,适合多云多区多产品 缺点:需要维护一份网关和服务器的对应关系表,这份表要么放网关,要么放服务端,存在一定管理成本

B. 通过一定的ttl时间(比如2min),判断超时的列表,对这些列表进行update

优点:实现会比较简单

缺点:手动维护缓存表,引入三方组件

C. 通过agent连consul,网关去consul获取状态来实现

优点: 架构直接冗余出去了, 多云多区可以通过dc等区分,数据共享

缺点: 依赖第三方组件,集群可能有点大,需要支持动态增加,增删适合需要考虑consul部分,开放端口较多

D. 流量抓取,定时探测

一个rpc负责统计状态 rpc.ReceiveStatus 负责把所有服务器统计到内存中,

一个rpc负责上传状态 rpc.UpdateStatus 负责把所有的服务器异常的捞出来并上传

优点:代码比较简单,实现也比较简单,无状态 缺点:指令下发的时候,去这里找维护表,或者依赖S端存入这个对应关系,否则无对应关系

npm build报错

Error: error:0308010C:digital envelope routines::unsupported at new Hash (node:internal/crypto/hash:67:19) at Object.createHash (node:crypto:130:10) at module.exports (/home/liuliancao/Downloads/dingtalk/node_modules/webpack/lib/util/createHash.js:135:53) at NormalModule._initBuildHash (/home/liuliancao/Downloads/dingtalk/node_modules/webpack/lib/NormalModule.js:417:16) at handleParseError (/home/liuliancao/Downloads/dingtalk/node_modules/webpack/lib/NormalModule.js:471:10) at /home/liuliancao/Downloads/dingtalk/node_modules/webpack/lib/NormalModule.js:503:5 at /home/liuliancao/Downloads/dingtalk/node_modules/webpack/lib/NormalModule.js:358:12 at /home/liuliancao/Downloads/dingtalk/node_modules/loader-runner/lib/LoaderRunner.js:373:3 at iterateNormalLoaders (/home/liuliancao/Downloads/dingtalk/node_modules/loader-runner/lib/LoaderRunner.js:214:10) at iterateNormalLoaders (/home/liuliancao/Downloads/dingtalk/node_modules/loader-runner/lib/LoaderRunner.js:221:10) at /home/liuliancao/Downloads/dingtalk/node_modules/loader-runner/lib/LoaderRunner.js:236:3 at context.callback (/home/liuliancao/Downloads/dingtalk/node_modules/loader-runner/lib/LoaderRunner.js:111:13) at /home/liuliancao/Downloads/dingtalk/node_modules/babel-loader/lib/index.js:59:71 { opensslErrorStack: [ 'error:03000086:digital envelope routines::initialization error' ], library: 'digital envelope routines', reason: 'unsupported', code: 'ERR_OSSL_EVP_UNSUPPORTED'

解决办法: export NODE_OPTIONS=–openssl-legacy-provider

KISS

keep it simple 代码应该足够简单,每个模块只应该完成指定的功能,剩下的交给业务层解决

YAGNI

You ain't Gonna Need It.

没用到的时候就不需要设计这部分,提醒我们不要过度设计。但是同时也要保留 对应的扩展性。

DRY

参考链接 Don't Repeat Yourself. 不要写重复的代码。

可以通过代码解耦,模块化,底层代码下沉,通过类封装,应用一些设计模式等 方法来避免。

开始打印日志

开始写testcase

开始写黑盒测试用例

开始画各种图

开始思考面向对象,程序如何更好地扩展

开始思考如何更好地协同开发

开始捕获各种异常,开始自定义异常

开始定义返回码和对应的注释,link等

开始按部就班写注释

开始用文档生成工具