路由
创建项目成功后,进入internal/server/http目录下,打开http.go文件,其中有默认生成的blademaster模板。其中:
func New(s api.DemoServer) (engine *bm.Engine, err error) {
var (
cfg bm.ServerConfig
ct paladin.TOML
)
if err = paladin.Get("http.toml").Unmarshal(&ct); err != nil {
return
}
if err = ct.Get("Server").UnmarshalTOML(&cfg); err != nil {
return
}
svc = s
engine = bm.DefaultServer(&cfg) // 创建引擎
api.RegisterDemoBMServer(engine, s)
initRouter(engine) // 注册路由
err = engine.Start()
return
}
initRouter(engine)
func initRouter(e *bm.Engine) {
e.Ping(ping)
g := e.Group("/kratos-demo")
{
g.GET("/start", howToStart)
// 路径参数有两个特殊符号":"和"*"
// ":" 跟在"/"后面为参数的key,匹配两个/中间的值 或 一个/到结尾(其中不再包含/)的值
// "*" 跟在"/"后面为参数的key,匹配从 /*开始到结尾的所有值,所有*必须写在最后且无法多个
// NOTE:这是不被允许的,会和 /start 冲突
// g.GET("/:xxx")
// NOTE: 可以拿到一个key为name的参数。注意只能匹配到/param1/felix,无法匹配/param1/felix/hao(该路径会404)
g.POST("/start", howToStart)
g.GET("param/:name", pathParam)
// NOTE: 可以拿到多个key参数。注意只能匹配到/param2/felix/hao/love,无法匹配/param2/felix或/param2/felix/hao
g.GET("/param2/:name/:value/:felid", pathParam)
// NOTE: 可以拿到一个key为name的参数 和 一个key为action的路径。
// NOTE: 如/params3/felix/hello,action的值为"/hello"
// NOTE: 如/params3/felix/hello/hi,action的值为"/hello/hi"
// NOTE: 如/params3/felix/hello/hi/,action的值为"/hello/hi/"
g.GET("/param3/:name/*action", pathParam)
}
}
Ping
engine自带Ping方法,用于设置/ping路由的handler,该路由统一提供于负载均衡服务做健康检测。服务是否健康,可自定义ping handler进行逻辑判断,如检测DB是否正常等。
func ping(ctx *bm.Context) {
if _, err := svc.Ping(ctx, nil); err != nil {
log.Error("ping error(%v)", err)
ctx.AbortWithStatus(http.StatusServiceUnavailable)
}
}
默认路由
默认路由有:
- /metrics 用于prometheus信息采集
- /metadata 可以查看所有注册的路由信息
查看加载的所有路由信息:
curl 'http://127.0.0.1:8000/metadata'
输出:
{
"code":0,"message":"0","ttl":1,"data":{
"/debug/pprof/":{
"method":"GET"},"/debug/pprof/allocs":{
"method":"GET"},"/debug/pprof/block":{
"method":"GET"}