项目组件用beego开发,最近在完成一项需求时遇到一个坑,需求的内容大概是这样的,在一次请求内需要先对用户请求进行响应,然后异步goroute中去处理用户请求中的额外业务(向另一个服务(storage-manager)发送请求,不断查询资源的状态变化,待状态合适时需要删除资源),由于访问另一个服务需要证书认证,证书是在过滤器中加进去的,放在input.data中,如果需要在另一个goroute中使用证书首先就得拿到input.data;然而,正好项目中封装好了一个方法获取访问sm服务的通用方法,传入的一个参数就是input对象, 方法实现大体如下:
func sendRequestToStorageManager(intput *context.BeegoInput,url string) error {
tsp := input.GetData("X-Cluster-IP")
client := http.Client{
TranSport:tsp,
}
resp, err := client.GET(url)
if err != nil {
return err
}
if resp.Code != http.StatusOk {
return fmt.Errorf("not expect response result!")
}
}
// 调用处代码样例
func (ctl MyController)Create(){
.....
go func(){
for {
err := sendRequestToStorageManager(ctl.Ctx.Input)
if err == nil {
return
}
}
}()
.....
}
于是我就按部就班的在g