代码拉取完成,页面将自动刷新
package protocol
import (
"context"
"fmt"
"net/http"
"time"
"gitee.com/penghengben/devcloud-mini/mcenter/conf"
"gitee.com/penghengben/devcloud-mini/mcenter/logger"
"gitee.com/penghengben/devcloud-mini/mcenter/swagger"
"github.com/emicklei/go-restful/v3"
"github.com/infraboard/mcube/ioc"
"github.com/infraboard/mcube/ioc/apidoc"
"go.opentelemetry.io/contrib/instrumentation/github.com/emicklei/go-restful/otelrestful"
)
// 如果http 服务器使用哪个路由, 当做参数传递进来
func NewHttp() *Http {
r := restful.DefaultContainer
// 设置默认ContentType
restful.DefaultResponseContentType(restful.MIME_JSON)
restful.DefaultRequestContentType(restful.MIME_JSON)
// CORS中间件
cors := restful.CrossOriginResourceSharing{
AllowedHeaders: []string{""},
AllowedDomains: []string{"*"},
AllowedMethods: []string{"HEAD", "OPTIONS", "GET", "POST", "PATCH", "DELETE"},
CookiesAllowed: false,
Container: r,
}
// 使用Filter加载 GoRestful中间件(等同于Gin use)
r.Filter(cors.Filter)
// 添加 goRestfule trace中间件
filter := otelrestful.OTelFilter("mcenter")
restful.DefaultContainer.Filter(filter)
return &Http{
r: r,
apiDocPath: "/apidocs.json",
server: &http.Server{
// 服务器监听地址
Addr: conf.C().Http.Address(),
// 配置http server使用的路由
Handler: r,
// client ---> server
ReadTimeout: 5 * time.Second,
// server ---> client
WriteTimeout: 5 * time.Second,
},
}
}
// 定义http server的一些属性
type Http struct {
server *http.Server
r *restful.Container
apiDocPath string
}
// /mcenter/api/v1
// /mpaas/api/v1
// nginx ---> ui ---> gateway ---> host://<service_prefix>/api/v1
func (h *Http) PathPrefix() string {
return fmt.Sprintf("/%s/api", conf.C().App.Name)
}
// 启动
func (h *Http) Start() error {
// 装载子路由
ioc.LoadGoRestfulApi(h.PathPrefix(), h.r)
logger.L().Debug().Msgf("loaded apis: %s", ioc.ListApiObjectNames())
logger.L().Debug().Msgf("http sever: %s", conf.C().Http.Address())
// API Doc
h.r.Add(apidoc.APIDocs(h.apiDocPath, swagger.Docs))
logger.L().Debug().Msgf("Swagger API Doc访问地址: http://%s%s", conf.C().Http.Address(), h.apiDocPath)
// HealthCheck
// hc := health.NewDefaultHealthChecker()
// h.r.Add(hc.WebService())
// logger.L().Debug().Msgf("健康检查地址: http://%s%s", conf.C().Http.Address(), hc.HealthCheckPath)
// http
return h.server.ListenAndServe()
// https
// h.server.ServeTLS()
}
// 停止
func (h *Http) Stop(ctx context.Context) {
// 服务的优雅关闭, 先关闭监听,新的请求就进不来, 等待老的请求 处理完成
// 自己介绍来自操作系统的信号量 来决定 你的服务是否需要关闭
// nginx reload, os reload sign, config.reload()
// os termnial sign, 过了terminal的超时时间会直接kill
h.server.Shutdown(ctx)
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。