代码拉取完成,页面将自动刷新
/**
* Tencent is pleased to support the open source community by making polaris-go available.
*
* Copyright (C) 2019 THL A29 Limited, a Tencent company. All rights reserved.
*
* Licensed under the BSD 3-Clause License (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* https://opensource.org/licenses/BSD-3-Clause
*
* Unless required by applicable law or agreed to in writing, software distributed
* under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR
* CONDITIONS OF ANY KIND, either express or implied. See the License for the
* specific language governing permissions and limitations under the License.
*/
package http
import (
"net/http"
"net/url"
"time"
"gitee.com/meng_mengs_boys/polaris-go/pkg/config"
"gitee.com/meng_mengs_boys/polaris-go/pkg/log"
"gitee.com/meng_mengs_boys/polaris-go/pkg/model"
"gitee.com/meng_mengs_boys/polaris-go/pkg/plugin"
"gitee.com/meng_mengs_boys/polaris-go/pkg/plugin/common"
"gitee.com/meng_mengs_boys/polaris-go/pkg/plugin/healthcheck"
"gitee.com/meng_mengs_boys/polaris-go/plugin/healthcheck/utils"
)
// Detector TCP协议的实例健康探测器
type Detector struct {
*plugin.PluginBase
cfg *Config
timeout time.Duration
}
// Type 插件类型
func (g *Detector) Type() common.Type {
return common.TypeHealthCheck
}
// Name 插件名,一个类型下插件名唯一
func (g *Detector) Name() string {
return "http"
}
// Init 初始化插件
func (g *Detector) Init(ctx *plugin.InitContext) (err error) {
g.PluginBase = plugin.NewPluginBase(ctx)
cfgValue := ctx.Config.GetConsumer().GetHealthCheck().GetPluginConfig(g.Name())
if cfgValue != nil {
g.cfg = cfgValue.(*Config)
}
g.timeout = ctx.Config.GetConsumer().GetHealthCheck().GetTimeout()
return nil
}
// Destroy 销毁插件,可用于释放资源
func (g *Detector) Destroy() error {
return nil
}
// DetectInstance 探测服务实例健康
func (g *Detector) DetectInstance(ins model.Instance) (result healthcheck.DetectResult, err error) {
start := time.Now()
// 得到Http address
address := utils.GetAddressByInstance(ins)
success := g.doHttpDetect(address)
result = &healthcheck.DetectResultImp{
Success: success,
DetectTime: start,
DetectInstance: ins,
}
return result, nil
}
// IsEnable .
func (g *Detector) IsEnable(cfg config.Configuration) bool {
return cfg.GetGlobal().GetSystem().GetMode() != model.ModeWithAgent
}
// doHttpDetect 执行一次健康探测逻辑
func (g *Detector) doHttpDetect(address string) bool {
c := &http.Client{
Timeout: g.timeout,
}
request := &http.Request{
Method: http.MethodGet,
URL: &url.URL{
Scheme: "http",
Host: address,
Path: g.cfg.Path,
},
}
header := http.Header{}
if len(g.cfg.Host) > 0 {
header.Add("Host", g.cfg.Host)
}
if len(g.cfg.RequestHeadersToAdd) > 0 {
for _, requestHeader := range g.cfg.RequestHeadersToAdd {
header.Add(requestHeader.Key, requestHeader.Value)
}
}
if len(header) > 0 {
request.Header = header
}
resp, err := c.Do(request)
if err != nil {
log.GetDetectLogger().Errorf("[HealthCheck][http] fail to check %s, err is %v", address, err)
return false
}
defer resp.Body.Close()
code := resp.StatusCode
for _, statusCodeRange := range g.cfg.ExpectedStatuses {
if code >= statusCodeRange.Start && code < statusCodeRange.End {
return true
}
}
return false
}
// init 注册插件信息
func init() {
plugin.RegisterConfigurablePlugin(&Detector{}, &Config{})
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。