其他分享
首页 > 其他分享> > 微服务从代码到k8s部署应有尽有系列(四、用户中心)

微服务从代码到k8s部署应有尽有系列(四、用户中心)

作者:互联网

我们用一个系列来讲解从需求到上线、从代码到k8s部署、从日志到监控等各个方面的微服务完整实践。

整个项目使用了go-zero开发的微服务,基本包含了go-zero以及相关go-zero作者开发的一些中间件,所用到的技术栈基本是go-zero项目组的自研组件,基本是go-zero全家桶了。

实战项目地址:https://github.com/Mikaelemmmm/go-zero-looklook

一、用户中心业务架构图

二、依赖关系

usercenter-api(用户中心api) 依赖 identity-rpc(授权认证rpc)、usercenter-rpc(用户中心rpc)

usercenter-rpc(用户中心rpc)依赖 identity-rpc(授权中心rpc)

我们看项目usercenter/cmd/api/desc/usercenter.api ,所有的用户api对外的http方法都在这里面

这里面有4个业务注册、登陆、获取用户信息、微信小程序授权

三、注册举例

1、注册api服务

我们在写api服务代码的时候是先要在usercenter.api中定义好service中的方法,然后在desc/user中写request、response,这样拆分开的好处是不那么臃肿

a、在usercenter.api中定义注册方法如下

// 用户模块v1版本的接口
@server(
	prefix: usercenter/v1
	group: user
)
service usercenter {
  @doc "注册"
	@handler register
	post /user/register (RegisterReq) returns (RegisterResp)
  
  .....
}

b、在app/usercenter/cmd/api/desc/user/user.api中定义RegisterReq\RegisterResp

type (
	RegisterReq {
		Mobile   string `json:"mobile"`
		Password string `json:"password"`
	}
	RegisterResp {
		AccessToken  string `json:"accessToken"`
		AccessExpire int64  `json:"accessExpire"`
		RefreshAfter int64  `json:"refreshAfter"`
	}
)

c、goctl生成api代码

1)命令行进入app/usercenter/cmd/api/desc目录下。

2)去项目目录下deploy/script/gencode/gen.sh中,复制如下一条命令,在命令行中执行(命令行要切换到app/usercenter/cmd目录)

$ goctl api go -api *.api -dir ../  -style=goZero

d、打开app/usercenter/cmd/api/internal/logic/user/register.go文件

这里就很容易了,直接调用user的rpc服务即可

这里有个小技巧,很多同学感觉rpc服务返回的字段跟api定义差不多,每次都要手动去复制很麻烦,那么go有没有像java一样的BeanCopyUtils.copy 这种工具呢?答案肯定是有的,可以看上面的代码copier.Copy ,这个库是gorm作者的另一款新作,是不是很兴奋。 那我们继续看看调用后端的rpc是什么样子的。

2、注册rpc服务

四、业务获取登陆用户id

当我们在获取用户信息,或者下单等场景下总要获取登陆用户的id,前一篇我们讲到,我们在授权identity服务中校验完token,解析出来的userId会放到header中返回给nginx的authReuest

在文件app/identity/cmd/api/internal/handler/verify/tokenHandler.go

nginx通过authRequest然后访问后端的服务时候,会把header内容传递给后端服务,因为我们在nginx中配置了如下

那这样的话,我们在后端服务就可以拿到这个userId了,比如我们现在访问usercenter/v1/user/detail获取当前登陆用户信息

ok,可以看到我们通过 ctxdata.GetUidFromCtx(l.ctx)就可以拿到,为什么这么神奇呢?我们点开看看这个方法

实际上就是从ctx中拿到的userId,是不是很奇怪,我们明明在nignx就放在了header中,你在go的业务代码中为什么能通过ctx拿到?

1、【小技巧】middleware

当nginx在header中携带了x-user就是userId来访问后端服务的时候,我们后端服务在启动时main函数会加载一个全局中间件,比如usercenter-api中的main

app/usercenter/cmd/api/usercenter.go

这里定义了全局中间件,只要有请求到我们usercenter-ap某个方法之前,都会先进入全局中间件中,中间件具体内容如下

所以是不是一下就明白了,在请求我们usercenter/v1/user/detail时候,会先进入这个中间件,在这个中间件内,我们通过nginx的header中的X-User拿到解析后的userId放到ctx中,那继续进入到usercenter/v1/user/detail时候,我们是不是就可以通过ctx直接取出来在业务中用啦,一切真相大白。

同样其他用户中心服务登陆、获取登陆用户信息、小程序授权登陆都是一个道理,这里就不再啰嗦了,自行看代码即可

【注】小程序授权登陆,记得修改配置文件,这里的配置文件是假的,改成自己的

项目地址

https://github.com/zeromicro/go-zero

欢迎使用 go-zerostar 支持我们!

微信交流群

关注『微服务实践』公众号并点击 交流群 获取社区群二维码。

标签:cmd,usercenter,代码,应有尽有,rpc,api,user,go,k8s
来源: https://www.cnblogs.com/kevinwan/p/15917442.html