路由

进入internal/server/http目录下,打开http.go文件,其中有默认生成的blademaster模板。其中:

  1. engine = bm.DefaultServer(hc.Server)
  2. initRouter(engine)
  3. if err := engine.Start(); err != nil {
  4. panic(err)
  5. }

是bm默认创建的engine及启动代码,我们看initRouter初始化路由方法,默认实现了:

  1. func initRouter(e *bm.Engine) {
  2. e.Ping(ping) // engine自带的"/ping"接口,用于负载均衡检测服务健康状态
  3. g := e.Group("/kratos-demo") // e.Group 创建一组 "/kratos-demo" 起始的路由组
  4. {
  5. g.GET("/start", howToStart) // g.GET 创建一个 "kratos-demo/start" 的路由,使用GET方式请求,默认处理Handler为howToStart方法
  6. g.POST("start", howToStart) // g.POST 创建一个 "kratos-demo/start" 的路由,使用POST方式请求,默认处理Handler为howToStart方法
  7. }
  8. }

bm的handler方法,结构如下:

  1. func howToStart(c *bm.Context) // handler方法默认传入bm的Context对象

Ping

engine自带Ping方法,用于设置/ping路由的handler,该路由统一提供于负载均衡服务做健康检测。服务是否健康,可自定义ping handler进行逻辑判断,如检测DB是否正常等。

  1. func ping(c *bm.Context) {
  2. if some DB check not ok {
  3. c.AbortWithStatus(503)
  4. }
  5. }

默认路由

默认路由有:

  • /metrics 用于prometheus信息采集
  • /metadata 可以查看所有注册的路由信息

查看加载的所有路由信息:

  1. curl 'http://127.0.0.1:8000/metadata'

输出:

  1. {
  2. "code": 0,
  3. "message": "0",
  4. "ttl": 1,
  5. "data": {
  6. "/kratos-demo/start": {
  7. "method": "GET"
  8. },
  9. "/metadata": {
  10. "method": "GET"
  11. },
  12. "/metrics": {
  13. "method": "GET"
  14. },
  15. "/ping": {
  16. "method": "GET"
  17. }
  18. }
  19. }

路径参数

使用方式如下:

  1. func initRouter(e *bm.Engine) {
  2. e.Ping(ping)
  3. g := e.Group("/kratos-demo")
  4. {
  5. g.GET("/start", howToStart)
  6. // 路径参数有两个特殊符号":"和"*"
  7. // ":" 跟在"/"后面为参数的key,匹配两个/中间的值 或 一个/到结尾(其中不再包含/)的值
  8. // "*" 跟在"/"后面为参数的key,匹配从 /*开始到结尾的所有值,所有*必须写在最后且无法多个
  9. // NOTE:这是不被允许的,会和 /start 冲突
  10. // g.GET("/:xxx")
  11. // NOTE: 可以拿到一个key为name的参数。注意只能匹配到/param1/felix,无法匹配/param1/felix/hao(该路径会404)
  12. g.GET("/param1/:name", pathParam)
  13. // NOTE: 可以拿到多个key参数。注意只能匹配到/param2/felix/hao/love,无法匹配/param2/felix或/param2/felix/hao
  14. g.GET("/param2/:name/:value/:felid", pathParam)
  15. // NOTE: 可以拿到一个key为name的参数 和 一个key为action的路径。
  16. // NOTE: 如/params3/felix/hello,action的值为"/hello"
  17. // NOTE: 如/params3/felix/hello/hi,action的值为"/hello/hi"
  18. // NOTE: 如/params3/felix/hello/hi/,action的值为"/hello/hi/"
  19. g.GET("/param3/:name/*action", pathParam)
  20. }
  21. }
  22. func pathParam(c *bm.Context) {
  23. name, _ := c.Params.Get("name")
  24. value, _ := c.Params.Get("value")
  25. felid, _ := c.Params.Get("felid")
  26. action, _ := c.Params.Get("action")
  27. path := c.RoutePath // NOTE: 获取注册的路由原始地址,如: /kratos-demo/param1/:name
  28. c.JSONMap(map[string]interface{}{
  29. "name": name,
  30. "value": value,
  31. "felid": felid,
  32. "action": action,
  33. "path": path,
  34. }, nil)
  35. }

性能分析

启动时默认监听了2333端口用于pprof信息采集,如:

  1. go tool pprof http://127.0.0.1:8000/debug/pprof/profile

改变端口可以使用flag,如:-http.perf=tcp://0.0.0.0:12333

扩展阅读

bm模块说明
bm中间件
bm基于pb生成