用go-zero 写一个数据中台系统
最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc 这些很高大尚,还没有在项目中,真正的玩过,我看了一下官方提供的工具真的很好用,只需要定义好,舒适文件jia结构 都生成了,只需要关心业务,
加上最近 有个投票的活动,加上最近这几年中台也比较火,所以决定玩一下,
先聊聊中台架构思路吧,look 先看架构图
中台的概念大概就是把一个一个的app 统一起来,反正我是这样理解的
先聊用户服务吧,现在一个公司有很多的公众号,小程序,微信的,支付宝的,还有xxx xxx ,很多的平台,每次开发的时候,我们总是需要做用户登陆的服务,不停的复制代码,然后我们就在思考能不能有一套独立的用户服务,
只需要告诉我你需要传个你要登陆的平台(比如微信),微信登陆,需要的是客户端返回给服务端一个code ,然后服务端拿着这个code去微信获取用户信息,反正大家都明白,
我们决定,将所有的信息 弄到 配置公共服务中去,里面在存,微信,支付宝,以及其它平台的 appid ,appkey,还有支付的appid,appkey,
这样就写一套
--------------------------------------------------------------------------------------------
go-zerio: https://github.com/tal-tech/go-zero
最后说说实现吧,整个就一个repo
网关,我们用的是: go-zero的Api服务
其它它的是服务,我们就是用的go-zero的rpc服务
看下目录结构
整个项目完成,我一个人操刀, 写了1个来星期,我就实现了上面的中台系统;
最后说说遇到的坑吧:
grpc 本人第一次用,然后就遇到了,有些字符为空时,字段值不显示的问题:
通过grpc官方库中的jsonpb
来实现,官方在它的设定中有一个结构体用来实现protoc buffer
转换为JSON结构,并可以根据字段来配置转换的要求
跨域问题:
go-zero的设置了,感觉没有效果,大佬说通过nginx 设置,后面发现还是不行,最近 ,强行弄到了一个域名下,后面有时间再解决
go-zero的sqlx 问题,这个真的费了很长的时间,
time.Time 这个数据结构,数据库中用的是 timestamp 这个 比如我的字段 是delete_at 默认数库设置的是null ,结果插入的时候,
就报了Incorrect datetime value: '0000-00-00' for column 'deleted_at' at row 1"}这个错,
查询的时候报deleted_at\": unsupported Scan, storing driver.Value type \u003cnil\u003e into type *time.Time"
后面果断去掉了这个字段
字段上面加上 .omitempty 这个标签,好像也有用,`db:".omitempty"`
其次就是这个 Conversion from collation utf8_general_ci into utf8mb4_unicode_ci,这个导致的大概原因是,现在都喜欢用emj表情了,mysql数据识别不了
最后发现是数据连接问题:
mysql这边照样按照原始的方式,将配置文件修改编码格式
重新创建数据库,并且设置数据库编码为utf8mb4 ,排序规则为utf8mb4_unicode_ci
(这样的话,所有的表还有string字段都是这个编码格式,如果不想所有的都是,可以单独设置,这个不是重点.因为在navicat上都好设置,手动点一下就行了)
重点来了:golang中使用的是 github.com/go-sql-driver/mysql驱动,
将连接mysql的dsn:(因为我这使用的是gorm,所以dsn可能跟原生的格式不太一样,不过没关系,只需要关注charset和collation就行了)
root:password@/name?parseTime=True&loc=Local&charset=utf8
修改为:
root:password@/name?parseTime=True&loc=Local&charset=utf8mb4&collation=utf8mb4_unicode_ci
---------------------------------
mark