didi / sharingan

Sharingan(写轮眼)是一个基于golang的流量录制回放工具,适合项目重构、回归测试等。
Apache License 2.0
2.28k stars 336 forks source link

goroutine中的redis回放无法捕捉到发起的请求 #3

Closed mengqingchao2012 closed 3 years ago

mengqingchao2012 commented 4 years ago

测试代码 `package main

import ( "github.com/didi/sharingan" "database/sql" "github.com/garyburd/redigo/redis" "github.com/gin-contrib/cors" "github.com/gin-gonic/gin" _ "github.com/go-sql-driver/mysql" "log" "time" ) var ( SqlDB *sql.DB // mysql连接 RedisConn redis.Conn // redis连接 err error )

func init() { SqlDB, err = sql.Open("mysql", "root:my-secret-pw@tcp(192.168.174.134:3306)/meng") if err != nil { log.Println("初始化mysql连接失败.", err) } else { SqlDB.SetConnMaxLifetime(100 * time.Second) //最大连接周期,超过时间的连接就close SqlDB.SetMaxOpenConns(100) //设置最大连接数 SqlDB.SetMaxIdleConns(16) //设置闲置连接数 log.Println("初始化mysql连接成功", SqlDB.Stats()) }

RedisConn, err = redis.Dial("tcp", "192.168.174.134:6379")
if err != nil {
    log.Println("Connect to redis error", err)
} else {
    log.Println("初始化redis连接成功")
}

} func SetTaskRouter() *gin.Engine { router := gin.Default() api := router.Group("/api") { api.POST("/book",ShanT) } return router }

func main(){ r := SetTaskRouter() r.Use(cors.Default()) r.Run(":8090") }

var msg chan string

func init() { msg = make(chan string) }

type Book struct { BookName string db:"name" json:"name" BookAuthor string db:"author" json:"author" }

func ShanT(c *gin.Context) { book := Book{} c.ShouldBindJSON(&book) if book.BookName == "" || book.BookAuthor == "" { c.JSON(500,"需要用户信息") } // 写mysql InsertMysql(book) // 查询mysql mbook,err := GetMysqlBookByAuthor(book.BookAuthor) if err != nil { log.Println("从mysql查询失败,停止查询") } else { log.Println("mysql中查询到的book",mbook) // 读写redis go Redis(mbook,sharingan.GetCurrentGoRoutineID()) // 从channel中读取数据 m := <- msg c.JSON(200,m) }

}

func InsertMysql(book Book) { result,err := SqlDB.Exec("insert INTO book(name,author) values (?,?)",book.BookName,book.BookAuthor) if err != nil { log.Println("插入myql失败",err) } else { num,_ := result.RowsAffected() log.Println("插入mysql成功,影响行数",num) } }

func GetMysqlBookByAuthor(author string) (Book,error){ book := new(Book) row := SqlDB.QueryRow("select from book where author=?",author) //row.scan中的字段必须是按照数据库存入字段的顺序,否则报错 if err :=row.Scan(&book.BookName,&book.BookAuthor); err != nil{ log.Println("从mysql查询失败",err) return book,err } else { return *book,nil } }

func Redis(book Book,delegatedID int64) { sharingan.SetDelegatedFromGoRoutineID(delegatedID) defer sharingan.SetDelegatedFromGoRoutineID(0) _, err = RedisConn.Do("SET", book.BookName,book.BookAuthor) if err != nil { log.Println("redis set failed:", err) } author, err := redis.String(RedisConn.Do("GET", book.BookName)) if err != nil { log.Println("redis get failed:", err) } else { log.Println("Get mykey: %v \n", author) } msg <- author

} 可以连接mysql,但是redis连接异常 [GIN-debug] Listening and serving HTTP on :8090 2020/05/22 19:48:44 插入mysql成功,影响行数 1 2020/05/22 19:48:44 mysql中查询到的book {b b} 2020/05/22 19:48:44 redis set failed: EOF 2020/05/22 19:48:44 redis get failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection [GIN] 2020/05/22 - 19:48:44 | 200 | 0s | 127.0.0.1 | POST "/api/book" 2020/05/22 19:48:39 插入mysql成功,影响行数 1 2020/05/22 19:48:39 mysql中查询到的book {a a} 2020/05/22 19:48:39 redis set failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection 2020/05/22 19:48:39 redis get failed: write tcp 127.0.0.1:45722->127.0.0.1:3515: use of closed network connection ` 回放页面显示miss

yj20060714 commented 3 years ago

建议tcpdump抓包定位一下,看看与mockserver(127.0.0.1:3515)链接失败的原因,是否跟长短链接,超时有关系