作者:Jack
最近发现golang社区里出了一个新星的微服务框架,来自好未来,光看这个名字,就很有奔头,之前,也只是玩过go-micro,其实真正的还没有在项目中运用过,只是觉得 微服务,grpc 这些很高大尚,还没有在项目中,真正的玩过,我看了一下官方提供的工具真的很好用,只需要定义好,舒适文件jia结构 都生成了,只需要关心业务,加上最近 有个投票的活动,加上最近这几年中台也比较火,所以决定玩一下,
先聊聊中台架构思路吧:
中台的概念大概就是把一个一个的app 统一起来,反正我是这样理解的。
先聊用户服务吧,现在一个公司有很多的公众号,小程序,微信的,支付宝的,还有xxx xxx ,很多的平台,每次开发的时候,我们总是需要做用户登陆的服务,不停的复制代码,然后我们就在思考能不能有一套独立的用户服务,只需要告诉我你需要传个你要登陆的平台(比如微信),微信登陆,需要的是客户端返回给服务端一个code ,然后服务端拿着这个code去微信获取用户信息,反正大家都明白。
我们决定,将所有的信息 弄到 配置公共服务中去,里面在存,微信,支付宝,以及其它平台的 appid ,appkey,还有支付的appid,appkey,这样就写一套。
最后说说实现吧,整个就一个repo:
网关,我们用的是: go-zero的Api服务
其它它的是服务,我们就是用的go-zero的rpc服务
看下目录结构
整个项目完成,我一个人操刀, 写了1个来星期,我就实现了上面的中台系统。
datacenter-api服务
先看官方文档 https://www.yuque.com/tal-tech/go-zero/yaoehb
我们先把网关搭建起来
➜ blogs mkdir datacenter && cd datacenter
➜ datacenter go mod init datacenter
go: creating new go.mod: module datacenter
➜ datacenter
查看book目录:
➜ datacenter tree
.
└── go.mod
0 directories, 1 file
创建api文件
➜ datacenter goctl api -o datacenter.api
Done.
➜ datacenter tree
.
├── datacenter.api
└── go.mod
定义api服务
分别包含了上面的 公共服务,用户服务,投票活动服务
info(
title: "中台系统"
desc: "中台系统"
author: "jackluo"
email: "net.webjoy@gmail.com"
)
// 获取 应用信息
type Beid struct {
Beid int64 `json:"beid"`
}
type Token struct{
Token string `json:"token"`
}
type WxTicket struct{
Ticket string `json:"ticket"`
}
type Application struct {
Sname string `json:"Sname"` //名称
Logo string `json:"logo"` // login
Isclose int64 `json:"isclose"` //是否关闭
Fullwebsite string `json:"fullwebsite"` // 全站名称
}
type SnsReq struct{
Beid
Ptyid int64 `json:"ptyid"` //对应平台
BackUrl string `json:"back_url"` //登陆返回的地址
}
type SnsResp struct{
Beid
Ptyid int64 `json:"ptyid"` //对应平台
Appid string `json:"appid"` //sns 平台的id
Title string `json:"title"` //名称
LoginUrl string `json:"login_url"` //微信登陆的地址
}
type WxShareResp struct {
Appid string `json:"appid"`
Timestamp int64 `json:"timestamp"`
Noncestr string `json:"noncestr"`
Signature string `json:"signature"`
}
@server(
group: common
)
service datacenter-api {
@doc(
summary: "获取站点的信息"
)
@handler votesVerification
get /MP_verify_NT04cqknJe0em3mT.txt (SnsReq) returns (SnsResp)
@handler appInfo
get /common/appinfo (Beid) returns (Application)
@doc(
summary: "获取站点的社交属性信息"
)
@handler snsInfo
post /common/snsinfo (SnsReq) returns (SnsResp)
// 获取分享的
@handler wxTicket
post /common/wx/ticket (SnsReq) returns (WxShareResp)
}
// 上传需要登陆
@server(
jwt: Auth
group: common
)
service datacenter-api {
@doc(
summary: "七牛上传凭证"
)
@handler qiuniuToken
post /common/qiuniu/token (Beid) returns (Token)
}
// 注册请求
type RegisterReq struct {
// TODO: add members here and delete this comment
Mobile string `json:"mobile"` // 基本一个手机号码就完事
Password string `json:"password"`
Smscode string `json:"smscode"` // 短信码
}
// 登陆请求
type LoginReq struct{
Mobile string `json:"mobile"`
Type int64 `json:"type"` // 1.密码登陆,2.短信登陆
Password string `json:"password"`
}
// 微信登陆
type WxLoginReq struct {
Beid int64 `json:"beid"` // 应用id
Code string `json:"code"` // 微信登陆密钥
Ptyid int64 `json:"ptyid"` // 对应平台
}
//返回用户信息
type UserReply struct {
Auid int64 `json:"