前面读的是 2.19.2 版本的代码,最新更新了 2.24.1,发现在实例化 Discoverer 时改进了设计。这个改变是在 2.21 做出的。
2.19.2 中的实现方式
- 在 discovery.Manager 结构体中包含了一个 *provider 的 slice
type Manager struct {...// providers keeps track of SD providers.providers []*provider...
}
- provider 接口提包含了一个 Discoverer 接口类型的字段
// provider holds a Discoverer instance, its configuration and its subscribers.
type provider struct {name stringd Discoverersubs []stringconfig interface{}
}
- 实例化 Discoverer 是在 *Manager 的 registerProviders() 方法中实现的,每个 job 有一套 Provider
方法签名为
func (m *Manager) registerProviders(cfg sd_config.ServiceDiscoveryConfig, setName string) int
参数 cfg 是解析配置文件参数得到的各种 SD 类型
// ServiceDiscoveryConfig configures lists of different service discovery mechanisms.
type ServiceDiscoveryConfig struct {// List of labeled target groups for this job.StaticConfigs []*targetgroup.Group `yaml:"static_configs,omitempty"`// List of DNS service discovery configurations.DNSSDConfigs []*dns.SDConfig `yaml:"dns_sd_configs,omitempty"`// List of file service discovery configurations.FileSDConfigs []*file.SDConfig `yaml:"file_sd_configs,omitempty"`// List of Consul service discovery configurations.ConsulSDConfigs []*consul.SDConfig `yaml:"consul_sd_configs,omitempty"`// List of DigitalOcean service discovery configurations.DigitalOceanSDConfigs []*digitalocean.SDConfig `yaml:"digitalocean_sd_configs,omitempty"`// List of Docker Swarm service discovery configurations.DockerSwarmSDConfigs []*dockerswarm.SDConfig `yaml:"dockerswarm_sd_configs,omitempty"`// List of Serverset service discovery configurations.ServersetSDConfigs []*zookeeper.ServersetSDConfig `yaml:"serverset_sd_configs,omitempty"`// NerveSDConfigs is a list of Nerve service discovery configurations.NerveSDConfigs []*zookeeper.NerveSDConfig `yaml:"nerve_sd_configs,omitempty"`// MarathonSDConfigs is a list of Marathon service discovery configurations.MarathonSDConfigs []*marathon.SDConfig `yaml:"marathon_sd_configs,omitempty"`// List of Kubernetes service discovery configurations.KubernetesSDConfigs []*kubernetes.SDConfig `yaml:"kubernetes_sd_configs,omitempty"`// List of GCE service discovery configurations.GCESDConfigs []*gce.SDConfig `yaml:"gce_sd_configs,omitempty"`// List of EC2 service discovery configurations.EC2SDConfigs []*ec2.SDConfig `yaml:"ec2_sd_configs,omitempty"`// List of OpenStack service discovery configurations.OpenstackSDConfigs []*openstack.SDConfig `yaml:"openstack_sd_configs,omitempty"`// List of Azure service discovery configurations.AzureSDConfigs []*azure.SDConfig `yaml:"azure_sd_configs,omitempty"`// List of Triton service discovery configurations.TritonSDConfigs []*triton.SDConfig `yaml:"triton_sd_configs,omitempty"`
}
方法内部首先声名一个添加 Discoverer 的闭包函数 add(),闭包函数的参数有一个实例化 Discoverer 的方法
add := func(cfg interface{}, newDiscoverer func() (Discoverer, error)) {t := reflect.TypeOf(cfg).String()// 已有的 provider 如果有多个 job 配置了它就把 job_name 追加到 这个provider 的 subs 中。// 否则就新建 providerfor _, p := range m.providers {if reflect.DeepEqual(cfg, p.config) {p.subs = append(p.subs, setName)level.Info(m.logger).Log("msg", "append subscribers", "sub", p.subs)added = truereturn}}d, err := newDiscoverer()if err != nil {level.Error(m.logger).Log("msg", "Cannot create service discovery", "err", err, "type", t)failedCount++return}provider := provider{name: fmt.Sprintf("%s/%d", t, len(m.providers)),d: d,config: cfg,subs: []string{setName},}m.providers = append(m.providers, &provider)added = true}
- 遍历配置文件配置的每种服务发现的类型,调用这种类型的实例化方法(如 dns.NewDiscovery())来初始化这种SD。
for _, c := range cfg.DNSSDConfigs {add(c, func() (Discoverer, error) {return dns.NewDiscovery(*c, log.With(m.logger, "discovery", "dns")), nil})}for _, c := range cfg.FileSDConfigs {add(c, func() (Discoverer, error) {return file.NewDiscovery(c, log.With(m.logger, "discovery", "file")), nil})}for _, c := range cfg.ConsulSDConfigs {add(c, func() (Discoverer, error) {return consul.NewDiscovery(c, log.With(m.logger, "discovery", "consul"))})}...
这种模式要在 manager.go 文件中导入每一种具体的服务发现器,也就是要在抽象层依赖各个实现。
2.24.1 中的实现方式
- Manager 包装 provider 包装 Discoverer 没有变化
- *Manager.registerProviders() 方法的参数变为了 Config 切片,Config 是接口类型,其中要求实现类要有 NewDiscoverer(DiscovererOptions) (Discoverer, error) 方法。
// Configs is a slice of Config values that uses custom YAML marshaling and unmarshaling
// to represent itself as a mapping of the Config values grouped by their types.
type Configs []Config// A Config provides the configuration and constructor for a Discoverer.
type Config interface {// Name returns the name of the discovery mechanism.Name() string// NewDiscoverer returns a Discoverer for the Config// with the given DiscovererOptions.NewDiscoverer(DiscovererOptions) (Discoverer, error)
}
*Manager.registerProviders() 里面的 add 闭包函数的初始化 Discoverer 方法是调用接口要求的 NewDiscoverer() 方法
d, err := cfg.NewDiscoverer(DiscovererOptions{Logger: log.With(m.logger, "discovery", typ),})
遍历也简化了
for _, cfg := range cfgs {add(cfg)}
- 在 main() 里依赖了 /discovery/install,这个新增的 install 包中导入具体的 SD 作为依赖
package installimport (_ "github.com/prometheus/prometheus/discovery/azure" // register azure_ "github.com/prometheus/prometheus/discovery/consul" // register consul_ "github.com/prometheus/prometheus/discovery/digitalocean" // register digitalocean_ "github.com/prometheus/prometheus/discovery/dns" // register dns_ "github.com/prometheus/prometheus/discovery/dockerswarm" // register dockerswarm_ "github.com/prometheus/prometheus/discovery/ec2" // register ec2_ "github.com/prometheus/prometheus/discovery/eureka" // register eureka_ "github.com/prometheus/prometheus/discovery/file" // register file_ "github.com/prometheus/prometheus/discovery/gce" // register gce_ "github.com/prometheus/prometheus/discovery/hetzner" // register hetzner_ "github.com/prometheus/prometheus/discovery/kubernetes" // register kubernetes_ "github.com/prometheus/prometheus/discovery/marathon" // register marathon_ "github.com/prometheus/prometheus/discovery/openstack" // register openstack_ "github.com/prometheus/prometheus/discovery/triton" // register triton_ "github.com/prometheus/prometheus/discovery/zookeeper" // register zookeeper
)
- 每一个具体的 SD 依赖 /discovery/dicovery,实现接口的 NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) 方法
// NewDiscoverer returns a Discoverer for the Config.
func (c *SDConfig) NewDiscoverer(opts discovery.DiscovererOptions) (discovery.Discoverer, error) {return NewDiscovery(c, opts.Logger), nil
}
返回的是调用本 SD 自己的 NewDiscovery() 函数得到的具体的SD实例
// NewDiscovery returns a new file discovery for the given paths.
func NewDiscovery(conf *SDConfig, logger log.Logger) *Discovery {if logger == nil {logger = log.NewNopLogger()}disc := &Discovery{paths: conf.Files,interval: time.Duration(conf.RefreshInterval),timestamps: make(map[string]float64),logger: logger,}fileSDTimeStamp.addDiscoverer(disc)return disc
}
模式学习
这样就实现了由抽象依赖实现翻转为实现依赖抽象。
install 是一个中介包,main 依赖它,它的内部导入各个具体的 SD 实现包,这样集中了多个具体实现的导入位置便于修改,也使 main 的导入部分变得简洁。
之前的依赖顺序
#mermaid-svg-xcc1xWU9QtLwBNcH .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .label text{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .node rect,#mermaid-svg-xcc1xWU9QtLwBNcH .node circle,#mermaid-svg-xcc1xWU9QtLwBNcH .node ellipse,#mermaid-svg-xcc1xWU9QtLwBNcH .node polygon,#mermaid-svg-xcc1xWU9QtLwBNcH .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-xcc1xWU9QtLwBNcH .node .label{text-align:center;fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .node.clickable{cursor:pointer}#mermaid-svg-xcc1xWU9QtLwBNcH .arrowheadPath{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-xcc1xWU9QtLwBNcH .flowchart-link{stroke:#333;fill:none}#mermaid-svg-xcc1xWU9QtLwBNcH .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-xcc1xWU9QtLwBNcH .edgeLabel rect{opacity:0.9}#mermaid-svg-xcc1xWU9QtLwBNcH .edgeLabel span{color:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-xcc1xWU9QtLwBNcH .cluster text{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-xcc1xWU9QtLwBNcH .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-xcc1xWU9QtLwBNcH text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-xcc1xWU9QtLwBNcH .actor-line{stroke:grey}#mermaid-svg-xcc1xWU9QtLwBNcH .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-xcc1xWU9QtLwBNcH #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .sequenceNumber{fill:#fff}#mermaid-svg-xcc1xWU9QtLwBNcH #sequencenumber{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH #crosshead path{fill:#333;stroke:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .messageText{fill:#333;stroke:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-xcc1xWU9QtLwBNcH .labelText,#mermaid-svg-xcc1xWU9QtLwBNcH .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-xcc1xWU9QtLwBNcH .loopText,#mermaid-svg-xcc1xWU9QtLwBNcH .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-xcc1xWU9QtLwBNcH .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-xcc1xWU9QtLwBNcH .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-xcc1xWU9QtLwBNcH .noteText,#mermaid-svg-xcc1xWU9QtLwBNcH .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-xcc1xWU9QtLwBNcH .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-xcc1xWU9QtLwBNcH .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-xcc1xWU9QtLwBNcH .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-xcc1xWU9QtLwBNcH .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .section{stroke:none;opacity:0.2}#mermaid-svg-xcc1xWU9QtLwBNcH .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-xcc1xWU9QtLwBNcH .section2{fill:#fff400}#mermaid-svg-xcc1xWU9QtLwBNcH .section1,#mermaid-svg-xcc1xWU9QtLwBNcH .section3{fill:#fff;opacity:0.2}#mermaid-svg-xcc1xWU9QtLwBNcH .sectionTitle0{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .sectionTitle1{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .sectionTitle2{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .sectionTitle3{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-xcc1xWU9QtLwBNcH .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .grid path{stroke-width:0}#mermaid-svg-xcc1xWU9QtLwBNcH .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-xcc1xWU9QtLwBNcH .task{stroke-width:2}#mermaid-svg-xcc1xWU9QtLwBNcH .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .taskText:not([font-size]){font-size:11px}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-xcc1xWU9QtLwBNcH .task.clickable{cursor:pointer}#mermaid-svg-xcc1xWU9QtLwBNcH .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-xcc1xWU9QtLwBNcH .taskText0,#mermaid-svg-xcc1xWU9QtLwBNcH .taskText1,#mermaid-svg-xcc1xWU9QtLwBNcH .taskText2,#mermaid-svg-xcc1xWU9QtLwBNcH .taskText3{fill:#fff}#mermaid-svg-xcc1xWU9QtLwBNcH .task0,#mermaid-svg-xcc1xWU9QtLwBNcH .task1,#mermaid-svg-xcc1xWU9QtLwBNcH .task2,#mermaid-svg-xcc1xWU9QtLwBNcH .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutside0,#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutside2{fill:#000}#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutside1,#mermaid-svg-xcc1xWU9QtLwBNcH .taskTextOutside3{fill:#000}#mermaid-svg-xcc1xWU9QtLwBNcH .active0,#mermaid-svg-xcc1xWU9QtLwBNcH .active1,#mermaid-svg-xcc1xWU9QtLwBNcH .active2,#mermaid-svg-xcc1xWU9QtLwBNcH .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-xcc1xWU9QtLwBNcH .activeText0,#mermaid-svg-xcc1xWU9QtLwBNcH .activeText1,#mermaid-svg-xcc1xWU9QtLwBNcH .activeText2,#mermaid-svg-xcc1xWU9QtLwBNcH .activeText3{fill:#000 !important}#mermaid-svg-xcc1xWU9QtLwBNcH .done0,#mermaid-svg-xcc1xWU9QtLwBNcH .done1,#mermaid-svg-xcc1xWU9QtLwBNcH .done2,#mermaid-svg-xcc1xWU9QtLwBNcH .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-xcc1xWU9QtLwBNcH .doneText0,#mermaid-svg-xcc1xWU9QtLwBNcH .doneText1,#mermaid-svg-xcc1xWU9QtLwBNcH .doneText2,#mermaid-svg-xcc1xWU9QtLwBNcH .doneText3{fill:#000 !important}#mermaid-svg-xcc1xWU9QtLwBNcH .crit0,#mermaid-svg-xcc1xWU9QtLwBNcH .crit1,#mermaid-svg-xcc1xWU9QtLwBNcH .crit2,#mermaid-svg-xcc1xWU9QtLwBNcH .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-xcc1xWU9QtLwBNcH .activeCrit0,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCrit1,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCrit2,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-xcc1xWU9QtLwBNcH .doneCrit0,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCrit1,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCrit2,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-xcc1xWU9QtLwBNcH .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-xcc1xWU9QtLwBNcH .milestoneText{font-style:italic}#mermaid-svg-xcc1xWU9QtLwBNcH .doneCritText0,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCritText1,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCritText2,#mermaid-svg-xcc1xWU9QtLwBNcH .doneCritText3{fill:#000 !important}#mermaid-svg-xcc1xWU9QtLwBNcH .activeCritText0,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCritText1,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCritText2,#mermaid-svg-xcc1xWU9QtLwBNcH .activeCritText3{fill:#000 !important}#mermaid-svg-xcc1xWU9QtLwBNcH .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-xcc1xWU9QtLwBNcH g.classGroup text .title{font-weight:bolder}#mermaid-svg-xcc1xWU9QtLwBNcH g.clickable{cursor:pointer}#mermaid-svg-xcc1xWU9QtLwBNcH g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-xcc1xWU9QtLwBNcH g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-xcc1xWU9QtLwBNcH .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-xcc1xWU9QtLwBNcH .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-xcc1xWU9QtLwBNcH .dashed-line{stroke-dasharray:3}#mermaid-svg-xcc1xWU9QtLwBNcH #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH .commit-id,#mermaid-svg-xcc1xWU9QtLwBNcH .commit-msg,#mermaid-svg-xcc1xWU9QtLwBNcH .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-xcc1xWU9QtLwBNcH g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-xcc1xWU9QtLwBNcH g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-xcc1xWU9QtLwBNcH g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-xcc1xWU9QtLwBNcH .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-xcc1xWU9QtLwBNcH .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-xcc1xWU9QtLwBNcH .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-xcc1xWU9QtLwBNcH .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-xcc1xWU9QtLwBNcH .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-xcc1xWU9QtLwBNcH .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-xcc1xWU9QtLwBNcH .edgeLabel text{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-xcc1xWU9QtLwBNcH .node circle.state-start{fill:black;stroke:black}#mermaid-svg-xcc1xWU9QtLwBNcH .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-xcc1xWU9QtLwBNcH #statediagram-barbEnd{fill:#9370db}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-state .divider{stroke:#9370db}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-xcc1xWU9QtLwBNcH .note-edge{stroke-dasharray:5}#mermaid-svg-xcc1xWU9QtLwBNcH .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-xcc1xWU9QtLwBNcH .error-icon{fill:#522}#mermaid-svg-xcc1xWU9QtLwBNcH .error-text{fill:#522;stroke:#522}#mermaid-svg-xcc1xWU9QtLwBNcH .edge-thickness-normal{stroke-width:2px}#mermaid-svg-xcc1xWU9QtLwBNcH .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-xcc1xWU9QtLwBNcH .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-xcc1xWU9QtLwBNcH .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-xcc1xWU9QtLwBNcH .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-xcc1xWU9QtLwBNcH .marker{fill:#333}#mermaid-svg-xcc1xWU9QtLwBNcH .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-xcc1xWU9QtLwBNcH {color: rgba(0, 0, 0, 0.75);font: ;}
main
discovery
consul
file
ec2
kubernetes
如果添加一个 SD,需要添加 discovery/config/config.go 和 discovery/manager.go 中的依赖,并且要添加 *Manager.registerProviders() 的代码
现在的依赖顺序
#mermaid-svg-bYPvnATnn8JbkKVI .label{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);fill:#333;color:#333}#mermaid-svg-bYPvnATnn8JbkKVI .label text{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .node rect,#mermaid-svg-bYPvnATnn8JbkKVI .node circle,#mermaid-svg-bYPvnATnn8JbkKVI .node ellipse,#mermaid-svg-bYPvnATnn8JbkKVI .node polygon,#mermaid-svg-bYPvnATnn8JbkKVI .node path{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-bYPvnATnn8JbkKVI .node .label{text-align:center;fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .node.clickable{cursor:pointer}#mermaid-svg-bYPvnATnn8JbkKVI .arrowheadPath{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .edgePath .path{stroke:#333;stroke-width:1.5px}#mermaid-svg-bYPvnATnn8JbkKVI .flowchart-link{stroke:#333;fill:none}#mermaid-svg-bYPvnATnn8JbkKVI .edgeLabel{background-color:#e8e8e8;text-align:center}#mermaid-svg-bYPvnATnn8JbkKVI .edgeLabel rect{opacity:0.9}#mermaid-svg-bYPvnATnn8JbkKVI .edgeLabel span{color:#333}#mermaid-svg-bYPvnATnn8JbkKVI .cluster rect{fill:#ffffde;stroke:#aa3;stroke-width:1px}#mermaid-svg-bYPvnATnn8JbkKVI .cluster text{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:12px;background:#ffffde;border:1px solid #aa3;border-radius:2px;pointer-events:none;z-index:100}#mermaid-svg-bYPvnATnn8JbkKVI .actor{stroke:#ccf;fill:#ECECFF}#mermaid-svg-bYPvnATnn8JbkKVI text.actor>tspan{fill:#000;stroke:none}#mermaid-svg-bYPvnATnn8JbkKVI .actor-line{stroke:grey}#mermaid-svg-bYPvnATnn8JbkKVI .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333}#mermaid-svg-bYPvnATnn8JbkKVI .messageLine1{stroke-width:1.5;stroke-dasharray:2, 2;stroke:#333}#mermaid-svg-bYPvnATnn8JbkKVI #arrowhead path{fill:#333;stroke:#333}#mermaid-svg-bYPvnATnn8JbkKVI .sequenceNumber{fill:#fff}#mermaid-svg-bYPvnATnn8JbkKVI #sequencenumber{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI #crosshead path{fill:#333;stroke:#333}#mermaid-svg-bYPvnATnn8JbkKVI .messageText{fill:#333;stroke:#333}#mermaid-svg-bYPvnATnn8JbkKVI .labelBox{stroke:#ccf;fill:#ECECFF}#mermaid-svg-bYPvnATnn8JbkKVI .labelText,#mermaid-svg-bYPvnATnn8JbkKVI .labelText>tspan{fill:#000;stroke:none}#mermaid-svg-bYPvnATnn8JbkKVI .loopText,#mermaid-svg-bYPvnATnn8JbkKVI .loopText>tspan{fill:#000;stroke:none}#mermaid-svg-bYPvnATnn8JbkKVI .loopLine{stroke-width:2px;stroke-dasharray:2, 2;stroke:#ccf;fill:#ccf}#mermaid-svg-bYPvnATnn8JbkKVI .note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-bYPvnATnn8JbkKVI .noteText,#mermaid-svg-bYPvnATnn8JbkKVI .noteText>tspan{fill:#000;stroke:none}#mermaid-svg-bYPvnATnn8JbkKVI .activation0{fill:#f4f4f4;stroke:#666}#mermaid-svg-bYPvnATnn8JbkKVI .activation1{fill:#f4f4f4;stroke:#666}#mermaid-svg-bYPvnATnn8JbkKVI .activation2{fill:#f4f4f4;stroke:#666}#mermaid-svg-bYPvnATnn8JbkKVI .mermaid-main-font{font-family:"trebuchet ms", verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .section{stroke:none;opacity:0.2}#mermaid-svg-bYPvnATnn8JbkKVI .section0{fill:rgba(102,102,255,0.49)}#mermaid-svg-bYPvnATnn8JbkKVI .section2{fill:#fff400}#mermaid-svg-bYPvnATnn8JbkKVI .section1,#mermaid-svg-bYPvnATnn8JbkKVI .section3{fill:#fff;opacity:0.2}#mermaid-svg-bYPvnATnn8JbkKVI .sectionTitle0{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .sectionTitle1{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .sectionTitle2{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .sectionTitle3{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .sectionTitle{text-anchor:start;font-size:11px;text-height:14px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .grid .tick{stroke:#d3d3d3;opacity:0.8;shape-rendering:crispEdges}#mermaid-svg-bYPvnATnn8JbkKVI .grid .tick text{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .grid path{stroke-width:0}#mermaid-svg-bYPvnATnn8JbkKVI .today{fill:none;stroke:red;stroke-width:2px}#mermaid-svg-bYPvnATnn8JbkKVI .task{stroke-width:2}#mermaid-svg-bYPvnATnn8JbkKVI .taskText{text-anchor:middle;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .taskText:not([font-size]){font-size:11px}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutsideRight{fill:#000;text-anchor:start;font-size:11px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutsideLeft{fill:#000;text-anchor:end;font-size:11px}#mermaid-svg-bYPvnATnn8JbkKVI .task.clickable{cursor:pointer}#mermaid-svg-bYPvnATnn8JbkKVI .taskText.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutsideLeft.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutsideRight.clickable{cursor:pointer;fill:#003163 !important;font-weight:bold}#mermaid-svg-bYPvnATnn8JbkKVI .taskText0,#mermaid-svg-bYPvnATnn8JbkKVI .taskText1,#mermaid-svg-bYPvnATnn8JbkKVI .taskText2,#mermaid-svg-bYPvnATnn8JbkKVI .taskText3{fill:#fff}#mermaid-svg-bYPvnATnn8JbkKVI .task0,#mermaid-svg-bYPvnATnn8JbkKVI .task1,#mermaid-svg-bYPvnATnn8JbkKVI .task2,#mermaid-svg-bYPvnATnn8JbkKVI .task3{fill:#8a90dd;stroke:#534fbc}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutside0,#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutside2{fill:#000}#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutside1,#mermaid-svg-bYPvnATnn8JbkKVI .taskTextOutside3{fill:#000}#mermaid-svg-bYPvnATnn8JbkKVI .active0,#mermaid-svg-bYPvnATnn8JbkKVI .active1,#mermaid-svg-bYPvnATnn8JbkKVI .active2,#mermaid-svg-bYPvnATnn8JbkKVI .active3{fill:#bfc7ff;stroke:#534fbc}#mermaid-svg-bYPvnATnn8JbkKVI .activeText0,#mermaid-svg-bYPvnATnn8JbkKVI .activeText1,#mermaid-svg-bYPvnATnn8JbkKVI .activeText2,#mermaid-svg-bYPvnATnn8JbkKVI .activeText3{fill:#000 !important}#mermaid-svg-bYPvnATnn8JbkKVI .done0,#mermaid-svg-bYPvnATnn8JbkKVI .done1,#mermaid-svg-bYPvnATnn8JbkKVI .done2,#mermaid-svg-bYPvnATnn8JbkKVI .done3{stroke:grey;fill:#d3d3d3;stroke-width:2}#mermaid-svg-bYPvnATnn8JbkKVI .doneText0,#mermaid-svg-bYPvnATnn8JbkKVI .doneText1,#mermaid-svg-bYPvnATnn8JbkKVI .doneText2,#mermaid-svg-bYPvnATnn8JbkKVI .doneText3{fill:#000 !important}#mermaid-svg-bYPvnATnn8JbkKVI .crit0,#mermaid-svg-bYPvnATnn8JbkKVI .crit1,#mermaid-svg-bYPvnATnn8JbkKVI .crit2,#mermaid-svg-bYPvnATnn8JbkKVI .crit3{stroke:#f88;fill:red;stroke-width:2}#mermaid-svg-bYPvnATnn8JbkKVI .activeCrit0,#mermaid-svg-bYPvnATnn8JbkKVI .activeCrit1,#mermaid-svg-bYPvnATnn8JbkKVI .activeCrit2,#mermaid-svg-bYPvnATnn8JbkKVI .activeCrit3{stroke:#f88;fill:#bfc7ff;stroke-width:2}#mermaid-svg-bYPvnATnn8JbkKVI .doneCrit0,#mermaid-svg-bYPvnATnn8JbkKVI .doneCrit1,#mermaid-svg-bYPvnATnn8JbkKVI .doneCrit2,#mermaid-svg-bYPvnATnn8JbkKVI .doneCrit3{stroke:#f88;fill:#d3d3d3;stroke-width:2;cursor:pointer;shape-rendering:crispEdges}#mermaid-svg-bYPvnATnn8JbkKVI .milestone{transform:rotate(45deg) scale(0.8, 0.8)}#mermaid-svg-bYPvnATnn8JbkKVI .milestoneText{font-style:italic}#mermaid-svg-bYPvnATnn8JbkKVI .doneCritText0,#mermaid-svg-bYPvnATnn8JbkKVI .doneCritText1,#mermaid-svg-bYPvnATnn8JbkKVI .doneCritText2,#mermaid-svg-bYPvnATnn8JbkKVI .doneCritText3{fill:#000 !important}#mermaid-svg-bYPvnATnn8JbkKVI .activeCritText0,#mermaid-svg-bYPvnATnn8JbkKVI .activeCritText1,#mermaid-svg-bYPvnATnn8JbkKVI .activeCritText2,#mermaid-svg-bYPvnATnn8JbkKVI .activeCritText3{fill:#000 !important}#mermaid-svg-bYPvnATnn8JbkKVI .titleText{text-anchor:middle;font-size:18px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI g.classGroup text{fill:#9370db;stroke:none;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family);font-size:10px}#mermaid-svg-bYPvnATnn8JbkKVI g.classGroup text .title{font-weight:bolder}#mermaid-svg-bYPvnATnn8JbkKVI g.clickable{cursor:pointer}#mermaid-svg-bYPvnATnn8JbkKVI g.classGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-bYPvnATnn8JbkKVI g.classGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI .classLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5}#mermaid-svg-bYPvnATnn8JbkKVI .classLabel .label{fill:#9370db;font-size:10px}#mermaid-svg-bYPvnATnn8JbkKVI .relation{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-bYPvnATnn8JbkKVI .dashed-line{stroke-dasharray:3}#mermaid-svg-bYPvnATnn8JbkKVI #compositionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #compositionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #aggregationStart{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #aggregationEnd{fill:#ECECFF;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #dependencyStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #dependencyEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #extensionStart{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI #extensionEnd{fill:#9370db;stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI .commit-id,#mermaid-svg-bYPvnATnn8JbkKVI .commit-msg,#mermaid-svg-bYPvnATnn8JbkKVI .branch-label{fill:lightgrey;color:lightgrey;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .pieTitleText{text-anchor:middle;font-size:25px;fill:#000;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .slice{font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI g.stateGroup text{fill:#9370db;stroke:none;font-size:10px;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI g.stateGroup text{fill:#9370db;fill:#333;stroke:none;font-size:10px}#mermaid-svg-bYPvnATnn8JbkKVI g.statediagram-cluster .cluster-label text{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI g.stateGroup .state-title{font-weight:bolder;fill:#000}#mermaid-svg-bYPvnATnn8JbkKVI g.stateGroup rect{fill:#ECECFF;stroke:#9370db}#mermaid-svg-bYPvnATnn8JbkKVI g.stateGroup line{stroke:#9370db;stroke-width:1}#mermaid-svg-bYPvnATnn8JbkKVI .transition{stroke:#9370db;stroke-width:1;fill:none}#mermaid-svg-bYPvnATnn8JbkKVI .stateGroup .composit{fill:white;border-bottom:1px}#mermaid-svg-bYPvnATnn8JbkKVI .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px}#mermaid-svg-bYPvnATnn8JbkKVI .state-note{stroke:#aa3;fill:#fff5ad}#mermaid-svg-bYPvnATnn8JbkKVI .state-note text{fill:black;stroke:none;font-size:10px}#mermaid-svg-bYPvnATnn8JbkKVI .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.7}#mermaid-svg-bYPvnATnn8JbkKVI .edgeLabel text{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .stateLabel text{fill:#000;font-size:10px;font-weight:bold;font-family:'trebuchet ms', verdana, arial;font-family:var(--mermaid-font-family)}#mermaid-svg-bYPvnATnn8JbkKVI .node circle.state-start{fill:black;stroke:black}#mermaid-svg-bYPvnATnn8JbkKVI .node circle.state-end{fill:black;stroke:white;stroke-width:1.5}#mermaid-svg-bYPvnATnn8JbkKVI #statediagram-barbEnd{fill:#9370db}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-cluster rect{fill:#ECECFF;stroke:#9370db;stroke-width:1px}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-cluster rect.outer{rx:5px;ry:5px}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-state .divider{stroke:#9370db}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-state .title-state{rx:5px;ry:5px}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-cluster.statediagram-cluster .inner{fill:white}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-cluster.statediagram-cluster-alt .inner{fill:#e0e0e0}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-cluster .inner{rx:0;ry:0}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-state rect.basic{rx:5px;ry:5px}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#efefef}#mermaid-svg-bYPvnATnn8JbkKVI .note-edge{stroke-dasharray:5}#mermaid-svg-bYPvnATnn8JbkKVI .statediagram-note rect{fill:#fff5ad;stroke:#aa3;stroke-width:1px;rx:0;ry:0}:root{--mermaid-font-family: '"trebuchet ms", verdana, arial';--mermaid-font-family: "Comic Sans MS", "Comic Sans", cursive}#mermaid-svg-bYPvnATnn8JbkKVI .error-icon{fill:#522}#mermaid-svg-bYPvnATnn8JbkKVI .error-text{fill:#522;stroke:#522}#mermaid-svg-bYPvnATnn8JbkKVI .edge-thickness-normal{stroke-width:2px}#mermaid-svg-bYPvnATnn8JbkKVI .edge-thickness-thick{stroke-width:3.5px}#mermaid-svg-bYPvnATnn8JbkKVI .edge-pattern-solid{stroke-dasharray:0}#mermaid-svg-bYPvnATnn8JbkKVI .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-bYPvnATnn8JbkKVI .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-bYPvnATnn8JbkKVI .marker{fill:#333}#mermaid-svg-bYPvnATnn8JbkKVI .marker.cross{stroke:#333}:root { --mermaid-font-family: "trebuchet ms", verdana, arial;}#mermaid-svg-bYPvnATnn8JbkKVI {color: rgba(0, 0, 0, 0.75);font: ;}
main
install
consul
file
ec2
kubernetes
discovery
如果添加一个 SD,仅需要添加 discovery/install/install.go,删除了 discovery/config/ 目录
Prometheus源码学习(4) 通过2.24对实例化Discoverer代码的改进学习依赖倒置相关推荐
- fastslam matlab,fastslam 快速定位和构图的源码,一个简单的例子,3D建模,可以用作学习智能机器人自主移动 matlab 272万源代码下载- www.pudn.com...
文件名称: fastslam下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 31 KB 上传时间: 2015-03-19 下载次数: 22 详细说明:快速定 ...
- Prometheus源码系列:指标缓存(scrapeCache)
Prometheus通过scrapeManager抓取的指标(metrics)可通过本地TSDB时序数据库存储,简单高效,但无法持久化数据.所以,可根据需求,选择本地存储或远端存储.本文不涉及存储的具 ...
- 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析
[Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...
- 30款后台源码。是我见过最全的后台代码。。
30款后台源码.是我见过最全的后台代码.. 如图:(由于太多只发出几个图片..请见谅) 这个是126邮箱样子的后台! 163样子的后台 等等还有好多...图片就不发出来了.... 下载地址1:http ...
- 图书馆管理系统代码源码(php+css+js+mysql) 完整的代码源码
图书馆管理系统代码源码(php+css+js+mysql) 完整的代码源码,系统使用B/S架构. 优化过的界面,拥有管理员和普通用户,普通用户可注册登录,管理员可登录,功能齐全. 管理员可管理普通用户 ...
- C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现。
C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现. :37199665996469190FaxNetApi
- 会议室预定系统代码源码(php+css+js+mysql) 完整的代码源码
会议室预定系统代码源码(php+css+js+mysql) 完整的代码源码,系统使用B/S架构. 优化过的界面,由管理员进行预定会议室操作. 推荐使用phpstudy+ navicat搭建和管理项目! ...
- 面试官系统精讲Java源码及大厂真题 - 24 举一反三:队列在 Java 其它源码中的应用
24 举一反三:队列在 Java 其它源码中的应用 世上无难事,只要肯登攀. 引导语 队列除了提供 API 供开发者使用外,自身也和 Java 中其他 API 紧密结合,比如线程池和锁,线程池直接使用 ...
- 捕鱼源码 免费提供和分享,仅供unity和Java初学者学习参考,希望能带来帮助
鉴于有部分人冒用我们的名义,进行招摇撞骗.大家可以直接找我们免费拿这套源码用于学习. 该源码为我们团队17年的测试验证Demo,仅适合入门技术初学者学习. 目前我们公开的源码仅此一套源码. 源码中的美 ...
最新文章
- Fiddler (三) Composer创建和发送HTTP Request
- 双中心积分计算氟化氢HF的动能和势能
- visual studio2019的安装以及使用
- C# unicode 编码 和 解码
- centos7安装gitlab_Docker常用镜像安装:MySql Redis GitLab maven私服等
- 《精通Spring MVC 4》——1.3 start.Spring.io简介
- 数据结构上机实践第二周项目1
- Callable接口与runable和Thread类
- Linux下模拟多线程的并发并发shell脚本
- Apple MDM 开发
- nps内网穿透工具学习
- 计算机教室如何防火,校园防火及火灾逃生自救安全常识
- Routeros花生壳域名解析脚本
- 联想V450笔记本 加装固态硬盘
- 分治算法 求第k小元素 O(n) O(nlog2^n)
- 百度网站优化和360网站优化的排名算法异同之处
- 如何解决用户出差,脱域的问题
- greenplum数据导入到mysql,greenplum数据库常用操作
- WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - No MyBatis mapper was found in ‘[com.ruoyi.**.map
- android照片共享,在安卓手机上可以实现多人共享照片吗?
热门文章
- java构造函数有几种_java构造函数的三种类型总结
- 算对于传统软件工程的影响
- 2023大型企业全面预算管理趋势
- 开抖音小店有什么优点?
- js练习题:构建函数创建一个电脑对象
- 用FireFox+FVD看TS格式流媒体视频
- C++STL详解(五)list的介绍及其使用
- go语言就业指南-岳东卫-专题视频课程
- MySQL给表增加字段的时候出现Table is full的报错处理
- C++ 使用 openGL 实现吃豆人游戏