beego-Context模块简介

本文介绍了在使用beego框架时遇到的一个并发问题,涉及到beego的Context模块和Goroutine。在一次请求中,由于在Goroutine中使用了Context的input数据,导致证书认证失败。通过分析beego的源码,发现Context采用了资源池设计,每次请求可能会复用先前的Context对象,从而引发并发安全问题。解决方案是避免在多个Goroutine间共享Context的input数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

         项目组件用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值