HTTP

1 Example

项目地址HTTP - 图1 (opens new window)

ego版本:ego@v0.5.3

2 HTTP配置

  1. type Config struct {
  2. Addr string // 连接地址
  3. Debug bool // 是否开启调试,默认不开启,开启后并加上export EGO_DEBUG=true,可以看到每次请求,配置名、地址、耗时、请求数据、响应数据
  4. RawDebug bool // 是否开启原生调试,默认不开启
  5. ReadTimeout time.Duration // 读超时,默认2s
  6. SlowLogThreshold time.Duration // 慢日志记录的阈值,默认500ms
  7. IdleConnTimeout time.Duration // 设置空闲连接时间,默认90 * time.Second
  8. MaxIdleConns int // 设置最大空闲连接数
  9. MaxIdleConnsPerHost int // 设置长连接个数
  10. EnableTraceInterceptor bool // 是否开启链路追踪,默认开启
  11. EnableKeepAlives bool // 是否开启长连接,默认打开
  12. EnableAccessInterceptor bool // 是否开启记录请求数据,默认不开启
  13. EnableAccessInterceptorRes bool // 是否开启记录响应参数,默认不开启
  14. }

3 用户配置

  1. [http.test]
  2. addr = "http://127.0.0.1:9007" # 开启后并加上export EGO_DEBUG=true,可以看到每次http请求,配置名、地址、耗时、请求数据、响应数据
  3. debug = true

4 优雅的Debug

通过开启debug配置和命令行的export EGO_DEBUG=true,我们就可以在测试环境里看到请求里的配置名、地址、耗时、请求数据、响应数据 image 当然你也可以开启http原生的调试,将rawDebug设置为true

5 用户代码

配置创建一个 http 的配置项,其中内容按照上文HTTP的配置进行填写。以上这个示例里这个配置key是http.test

代码中创建一个 HTTP 客户端, ehttp.Load("key").Build(),代码中的 key 和配置中的 key 要保持一致。创建完 HTTP 客户端后, 将他添加到你所需要的Client里即可。

  1. package main
  2. import (
  3. "fmt"
  4. "github.com/gotomicro/ego"
  5. "github.com/gotomicro/ego/client/ehttp"
  6. "github.com/gotomicro/ego/core/elog"
  7. )
  8. func main() {
  9. if err := ego.New().Invoker(
  10. invokerHTTP,
  11. callHTTP,
  12. ).Run(); err != nil {
  13. elog.Error("startup", elog.FieldErr(err))
  14. }
  15. }
  16. var httpComp *ehttp.Component
  17. func invokerHTTP() error {
  18. httpComp = ehttp.Load("http.test").Build()
  19. return nil
  20. }
  21. func callHTTP() error {
  22. info, err := httpComp.R().Get("/hello")
  23. if err != nil {
  24. return err
  25. }
  26. fmt.Println(info)
  27. return nil
  28. }

6 使用HTTP的链路

6.1 用户配置

  1. [server.http]
  2. port = 9007
  3. [trace.jaeger] # 启用链路的核心配置
  4. ServiceName = "server"

6.2 用户代码

  1. // export EGO_DEBUG=true && go run main.go --config=config.toml
  2. func callHTTP() error {
  3. // 拉去上下文
  4. span, ctx := etrace.StartSpanFromContext(context.Background(), "callHTTP()")
  5. defer span.Finish()
  6. req := httpComp.R()
  7. // Inject traceId Into Header
  8. c1 := etrace.HeaderInjector(ctx, req.Header)
  9. info, err := req.SetContext(c1).Get("/hello")
  10. if err != nil {
  11. return err
  12. }
  13. fmt.Println(info)
  14. return nil
  15. }

6.3 在JaegerUI中查看链路信息

trace-in-JaegerUI