Golang/Python最佳實踐
統一好返回格式
- 使用gRPC
- 如果使用RESTful風格,那麼返回結果無論成功還是失敗,都應該遵循如下格式:
{ "code": 200, // 業務程式碼code,可以用於詳細錯誤判斷 "msg": "succeed", // 給開發人員看的錯誤提示 "data": {} // 無論成功或者失敗,有無資料,此處都應當返回一個dict/map而不應該是nil/None }
為什麼要這麼做呢?因為使用動態語言開發時不會有太大差別,使用靜態語言時,資料型別不一將會導致不好定義返回結果。
資料庫
- PG比MySQL好用,資料型別支援更加豐富,坑也更少,唯一的缺點是流行程度不如MySQL
- 使用Redis作快取,Redis的資料結構更加豐富,而且資料結構可以用作其他用途
Python
- gunicorn + gevent非同步比asyncio/tornado等更加方便
- Flask 總體來說是一個好用的web框架
- ORM使用SQLAlchemy ,migration使用alembic
- 引數校驗使用marshmallow
- 非同步任務使用 gevent + python-rq,celery併發一高就容易遇到莫名假死的問題
- 善用decorator,例如引數校驗時,可以寫如下程式碼:
@hello_bp.route("/") @binding_schemma(HelloworldSchema) def hello(data): return "hello world"
binding_schemma
的實現如下:
def binding_schemma(schema): def wrapper(func): def inner(*args, **kwargs): # 獲取引數 arguments = request.get_json() or request.form or request.args if arguments is None: return failed(msg="請檢查引數") # 校驗 try: data = schema().load(arguments) except ValidationError as err: return failed(msg=err.messages) # 執行函式 return func(data.data, *args, **kwargs) return inner return wrapper
Golang
- Echo比GIN體驗上好用一些
- ORM還是pg好用一些,此外更喜歡 sqlx + SQLAlchemy + alembic