packagemainimport("context""fmt""net/http""time""github.com/danielgtaylor/huma/v2""github.com/danielgtaylor/huma/v2/adapters/humachi""github.com/danielgtaylor/huma/v2/humacli""github.com/go-chi/chi/v5")// Options for the CLI.typeOptionsstruct{Portint`help:"Port to listen on" short:"p" default:"8888"`}// GreetingInput represents the greeting operation request.typeGreetingInputstruct{Namestring`path:"name" maxLength:"30" example:"world" doc:"Name to greet"`}// GreetingOutput represents the greeting operation response.typeGreetingOutputstruct{Bodystruct{Messagestring`json:"message" example:"Hello, world!" doc:"Greeting message"`}}funcmain(){// Create a CLI app which takes a port option.cli:=humacli.New(func(hookshumacli.Hooks,options*Options){// Create a new router & APIrouter:=chi.NewMux()api:=humachi.New(router,huma.DefaultConfig("My API","1.0.0"))// Register GET /greeting/{name}huma.Register(api,huma.Operation{OperationID:"get-greeting",Summary:"Get a greeting",Method:http.MethodGet,Path:"/greeting/{name}",},func(ctxcontext.Context,input*GreetingInput)(*GreetingOutput,error){resp:=&GreetingOutput{}resp.Body.Message=fmt.Sprintf("Hello, %s!",input.Name)returnresp,nil})// Create the HTTP server.server:=http.Server{Addr:fmt.Sprintf(":%d",options.Port),Handler:router,}// Tell the CLI how to start your router.hooks.OnStart(func(){server.ListenAndServe()})// Tell the CLI how to stop your server.hooks.OnStop(func(){// Give the server 5 seconds to gracefully shut down, then give up.ctx,cancel:=context.WithTimeout(context.Background(),5*time.Second)defercancel()server.Shutdown(ctx)})})// Run the CLI. When passed no commands, it starts the server.cli.Run()}
就绪检查
如果使用 Kubernetes 等带有就绪检查的功能,并且就绪路由注册在与您的 Huma API 相同的路由器上,那么上述代码将导致就绪检查开始失败,Kubernetes 将不再将新请求路由到正在关闭的 pod,同时现有连接在耗尽。