作者:Jack
最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc 这些很高大尚,还没有在项目中,真正的玩过,我看了一下官方提供的工具真的很好用,只需要定义好,舒适文件jia结构 都生成了,只需要关心业务,加上最近 有个投票的活动,加上最近这几年中台也比较火,所以决定玩一下,
开源地址: github.com/jackluo2012…
先聊聊中台架构思路吧:
中台的概念大概就是把一个一个的app 统一起来,反正我是这样理解的。
先聊用户服务吧,现在一个公司有很多的公众号,小程序,微信的,支付宝的,还有xxx xxx ,很多的平台,每次开发的时候,我们总是需要做用户登陆的服务,不停的复制代码,然后我们就在思考能不能有一套独立的用户服务,只需要告诉我你需要传个你要登陆的平台(比如微信),微信登陆,需要的是客户端返回给服务端一个code ,然后服务端拿着这个code去微信获取用户信息,反正大家都明白。
我们决定,将所有的信息 弄到 配置公共服务中去,里面在存,微信,支付宝,以及其它平台的 appid ,appkey,还有支付的appid,appkey,这样就写一套。
最后说说实现吧,整个就一个repo:
- 网关,我们用的是: go-zero的Api服务
- 其它它的是服务,我们就是用的go-zero的rpc服务
看下目录结构
整个项目完成,我一个人操刀, 写了1个来星期,我就实现了上面的中台系统。
datacenter-api服务
先看官方文档 www.yuque.com/tal-tech/go…
我们先把网关搭建起来
1 | shell复制代码➜ blogs mkdir datacenter && cd datacenter |
查看book目录:
1 | go复制代码➜ datacenter tree |
创建api文件
1 | erlang复制代码➜ datacenter goctl api -o datacenter.api |
定义api服务
分别包含了上面的 公共服务,用户服务,投票活动服务
1 | less复制代码info( |
上面基本上写就写的API及文档的思路
生成datacenter api服务
1 | go复制代码➜ datacenter goctl api go -api datacenter.api -dir . |
我们打开 etc/datacenter-api.yaml
把必要的配置信息加上
1 | yaml复制代码Name: datacenter-api |
上面的 UserRpc
, CommonRpc
,还有 VotesRpc
这些我先写上,后面再来慢慢加。
我们先来写 CommonRpc
服务。
CommonRpc服务
新建项目目录
1 | bash复制代码➜ datacenter mkdir -p common/rpc && cd common/rpc |
直接就新建在了,datacenter目录中,因为common 里面,可能以后会不只会提供rpc服务,可能还有api的服务,所以又加了rpc目录
goctl创建模板
1 | ini复制代码➜ rpc goctl rpc template -o=common.proto |
往里面填入内容:
1 | protobuf复制代码➜ rpc cat common.proto |
gotcl生成rpc服务
1 | bash复制代码➜ rpc goctl rpc proto -src common.proto -dir . |
1 | go复制代码➜ rpc tree |
基本上,就把所有的目录规范和结构的东西都生成了,就不用纠结项目目录了,怎么放了,怎么组织了。
看一下,配置信息,里面可以写入mysql和其它redis的信息:
1 | yaml复制代码Name: common.rpc |
我们再来加上数据库服务:
1 | go复制代码➜ rpc cd .. |
这样基本的一个 rpc
就写完了,然后我们将rpc 和model 还有api串连起来,这个官方的文档已经很详细了,这里就只是贴一下代码:
1 | go复制代码➜ common cat rpc/internal/config/config.go |
再在svc中修改:
1 | go复制代码➜ common cat rpc/internal/svc/servicecontext.go |
上面的代码已经将 rpc
和 model
数据库关联起来了,我们现在再将 rpc
和 api
关联起来:
1 | go复制代码➜ datacenter cat internal/config/config.go |
加入 svc
服务中:
1 | go复制代码➜ datacenter cat internal/svc/servicecontext.go |
这样基本上,我们就可以在 logic
的文件目录中调用了:
1 | go复制代码cat internal/logic/common/appinfologic.go |
这样,基本就连接起来了,其它基本上就不用改了,UserRPC
, VotesRPC
类似,这里就不在写了。
使用心得
go-zero
的确香,因为它有一个 goctl
的工具,他可以自动的把代码结构全部的生成好,我们就不再去纠结,目录结构 ,怎么组织,没有个好几年的架构能力是不好实现的,有什么规范那些,并发,熔断,完全不用,考滤其它的,专心的实现业务就好,像微服务,还要有服务发现,一系列的东西,都不用关心,因为 go-zero
内部已经实现了。
我写代码也写了有10多年了,之前一直用的 php,比较出名的就 laravel,thinkphp,基本上就是模块化的,像微服那些实现直来真的有成本,但是你用上go-zero,你就像调api接口一样简单的开发,其它什么服务发现,那些根本就不用关注了,只需要关注业务。
一个好的语言,框架,他们的底层思维,永远都是效率高,不加班的思想,我相信go-zero会提高你和你团队或是公司的效率。go-zero的作者说,他们有个团队专门整理go-zero框架,目的也应该很明显,那就是提高,他们自己的开发效率,流程化,标准化,是提高工作效率的准则,像我们平时遇到了问题,或是遇到了bug,我第一个想到的不是怎么去解决我的bug,而是在想我的流程是不是有问题,我的哪个流程会导致bug,最后我相信 go-zero
能成为 微服务开发 的首选框架。
最后说说遇到的坑吧:
grpc
grpc
本人第一次用,然后就遇到了,有些字符为空时,字段值不显示的问题:
通过 grpc
官方库中的 jsonpb
来实现,官方在它的设定中有一个结构体用来实现 protoc buffer
转换为JSON结构,并可以根据字段来配置转换的要求。
- 跨域问题
go-zero
中设置了,感觉没有效果,大佬说通过nginx 设置,后面发现还是不行,最近强行弄到了一个域名下,后面有时间再解决。
sqlx
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
go-zero 项目地址
欢迎点赞👍
本文转载自: 掘金