1 Star 0 Fork 0

蒙蒙的男孩/polaris-go

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
http.go 3.48 KB
一键复制 编辑 原始数据 按行查看 历史
蒙蒙的男孩 提交于 2023-10-26 20:52 +08:00 . 添加调用方的实例ip属性
/**
* 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{})
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/meng_mengs_boys/polaris-go.git
git@gitee.com:meng_mengs_boys/polaris-go.git
meng_mengs_boys
polaris-go
polaris-go
v1.5.4

搜索帮助