Levon's Blog

微信: L6241425

decimal 对于浮点数的计算提供了极大的便利性,让我们在使用浮点数进行大小计算的时候不用担心精度丢失的问题,decimal库能处理小数点后 2^31 位数字,对于绝大多数的项目精度要求是足够的,简而言之,decimal 可以解决我们绝大多数的浮点数精度计算场景。

由于golang中默认是没有decimal类型的,所以要解决上述的问题,需要使用第三方库包decimal。

github 地址:https://github.com/shopspring/decimal

阅读全文 »

1. gorm

1.1 初始化连接

1
2
3
4
5
6
dsn := fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",  
c.Mysql.User, c.Mysql.Password, c.Mysql.Host, c.Mysql.Port, c.Mysql.Name)
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
logx.Must(err)
}
阅读全文 »

1. 日志

1.1 日志级别

waring

没人看警告,也许将来会出问题,但这听起来像是别人的问题。

我们尽可能的消除警告级别,它要么是一条信息性消息,要么是一个错误。我们参考Go语言设计额哲学,所有警告都是错误,其他语言的warning都可以忽略,除非IDE或者在CICD流程中强制他们为eror,然后逼着程序员们尽可能去消除。

同样的,如果想要最终消除 warning可以记录为error,让代码作者重视起来。

阅读全文 »

1. 分布式缓存

1.1 中间件选型

  • Redis 和 Memcache 最大的区别其实是 redis 单线程(新版本双线程),memcache 多线程,所以 QPS 可能两者差异不大,但是吞吐会有很大的差别,比如大数据 value 返回的时候,redis qps 会抖动下降的的很厉害,因为单线程工作,其他查询进不来(新版本有不少的改善)。
  • 纯 kv 可以走 memcache,比如我们的关系链服务中用了 hashs 存储双向关系,但是我们也会使用 memcache 档一层来避免hgetall 导致的吞吐下降问题。 我们系统中多次使用 memcache + redis 双缓存设计。
阅读全文 »

1. 评论系统

1.1 架构设计

image-20240629135637098
  • bff层:评论业务的服务编排,策略逻辑。
  • service层:只关注评论场景自己的逻辑。因为读写是稳定的,策略是多变的。
  • admin 层:划分出管理平台,共享存储数据。接口安全性更高,独立出来。不会依赖原始数据库,冗余出es里。
  • dependen层:依赖账号,过滤服务等。

架构设计等同于数据设计,梳理清楚数据的走向和逻辑。尽量避免环形依赖、数据双向请求等。

阅读全文 »

1. 工程项目

1.1 项目结构

可以参考:https://github.com/golang-standards/project-layout/blob/master/README_zh.md

  1. /cmd
    本项目的主干,cmd应用目录负责程序的:启动、关闭、配置初始化等。

    每个应用程序的目录名应该与你想要的可执行文件的名称相匹配(例如,/cmd/myapp)。

    不要在这个目录中放置太多代码。如果你认为代码可以导入并在其他项目中使用,那么它应该位于 /pkg 目录中。如果代码不是可重用的,或者你不希望其他人重用它,请将该代码放到 /internal 目录中。

阅读全文 »

1. error

Go的处理异常逻辑是不引入exception,支持多参数返回,所以你很容易的在函数签名中带上实现了error interface的对象,交由调用者来判定。

如果一个函数返回了(value,eror),你不能对这个value做任何假设,必须先判定error。唯一可以忽略error的是,如果你连value也不关心。

阅读全文 »

1. gRPC

1.1 特性

  • 多语言:语言中立,支持多种语言。
  • 轻量级、高性能:序列化支持 PB(Protocol Buffer)和 JSON,PB 是一种语言无关的高性能序列化框架。
  • 可插拔:扩展插件。
  • IDL(约束):基于文件定义服务,通过 proto3 工具生成指定语言的数据结构、服务端接口以及客户端 Stub。
  • 基于标准的 HTTP2 设计,支持双向流、消息头压缩、单 TCP 的多路复用、服务端推送等特性,这些特性使得 gRPC 在移动端设备上更加省电和节省网络流量。
  • 流:Streaming API。
  • 阻塞式和非阻塞式:支持异步和同步处理在客户端和服务端间交互的消息序列。
  • 元数据交换:常见的横切关注点,如认证或跟踪,依赖数据交换。
  • 标准化状态码:客户端通常以有限的方式响应 API 调用返回的错误。
阅读全文 »
0%