前面读的是 2.19.2 版本的代码,最新更新了 2.24.1,发现在实例化 Discoverer 时改进了设计。这个改变是在 2.21 做出的。

2.19.2 中的实现方式

  1. 在 discovery.Manager 结构体中包含了一个 *provider 的 slice
type Manager struct {...// providers keeps track of SD providers.providers []*provider...
}
  1. provider 接口提包含了一个 Discoverer 接口类型的字段
// provider holds a Discoverer instance, its configuration and its subscribers.
type provider struct {name   stringd      Discoverersubs   []stringconfig interface{}
}
  1. 实例化 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}
  1. 遍历配置文件配置的每种服务发现的类型,调用这种类型的实例化方法(如 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 中的实现方式

  1. Manager 包装 provider 包装 Discoverer 没有变化
  2. *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)}
  1. 在 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
)
  1. 每一个具体的 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代码的改进学习依赖倒置相关推荐

  1. fastslam matlab,fastslam 快速定位和构图的源码,一个简单的例子,3D建模,可以用作学习智能机器人自主移动 matlab 272万源代码下载- www.pudn.com...

    文件名称: fastslam下载  收藏√  [ 5  4  3  2  1 ] 开发工具: matlab 文件大小: 31 KB 上传时间: 2015-03-19 下载次数: 22 详细说明:快速定 ...

  2. Prometheus源码系列:指标缓存(scrapeCache)

    Prometheus通过scrapeManager抓取的指标(metrics)可通过本地TSDB时序数据库存储,简单高效,但无法持久化数据.所以,可根据需求,选择本地存储或远端存储.本文不涉及存储的具 ...

  3. 【Android SDM660源码分析】- 02 - UEFI XBL QcomChargerApp充电流程代码分析

    [Android SDM660源码分析]- 02 - UEFI XBL QcomChargerApp充电流程代码分析 一.加载 UEFI 默认应用程序 1.1 LaunchDefaultBDSApps ...

  4. 30款后台源码。是我见过最全的后台代码。。

    30款后台源码.是我见过最全的后台代码.. 如图:(由于太多只发出几个图片..请见谅) 这个是126邮箱样子的后台! 163样子的后台 等等还有好多...图片就不发出来了.... 下载地址1:http ...

  5. 图书馆管理系统代码源码(php+css+js+mysql) 完整的代码源码

    图书馆管理系统代码源码(php+css+js+mysql) 完整的代码源码,系统使用B/S架构. 优化过的界面,拥有管理员和普通用户,普通用户可注册登录,管理员可登录,功能齐全. 管理员可管理普通用户 ...

  6. C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现。

    C# OPC UA 服务器端源码 该源码未使用任何第三方支持库,纯代码实现. :37199665996469190FaxNetApi

  7. 会议室预定系统代码源码(php+css+js+mysql) 完整的代码源码

    会议室预定系统代码源码(php+css+js+mysql) 完整的代码源码,系统使用B/S架构. 优化过的界面,由管理员进行预定会议室操作. 推荐使用phpstudy+ navicat搭建和管理项目! ...

  8. 面试官系统精讲Java源码及大厂真题 - 24 举一反三:队列在 Java 其它源码中的应用

    24 举一反三:队列在 Java 其它源码中的应用 世上无难事,只要肯登攀. 引导语 队列除了提供 API 供开发者使用外,自身也和 Java 中其他 API 紧密结合,比如线程池和锁,线程池直接使用 ...

  9. 捕鱼源码 免费提供和分享,仅供unity和Java初学者学习参考,希望能带来帮助

    鉴于有部分人冒用我们的名义,进行招摇撞骗.大家可以直接找我们免费拿这套源码用于学习. 该源码为我们团队17年的测试验证Demo,仅适合入门技术初学者学习. 目前我们公开的源码仅此一套源码. 源码中的美 ...

最新文章

  1. Fiddler (三) Composer创建和发送HTTP Request
  2. 双中心积分计算氟化氢HF的动能和势能
  3. visual studio2019的安装以及使用
  4. C# unicode 编码 和 解码
  5. centos7安装gitlab_Docker常用镜像安装:MySql Redis GitLab maven私服等
  6. 《精通Spring MVC 4》——1.3 start.Spring.io简介
  7. 数据结构上机实践第二周项目1
  8. Callable接口与runable和Thread类
  9. Linux下模拟多线程的并发并发shell脚本
  10. Apple MDM 开发
  11. nps内网穿透工具学习
  12. 计算机教室如何防火,校园防火及火灾逃生自救安全常识
  13. Routeros花生壳域名解析脚本
  14. 联想V450笔记本 加装固态硬盘
  15. 分治算法 求第k小元素 O(n) O(nlog2^n)
  16. 百度网站优化和360网站优化的排名算法异同之处
  17. 如何解决用户出差,脱域的问题
  18. greenplum数据导入到mysql,greenplum数据库常用操作
  19. WARN o.m.s.m.ClassPathMapperScanner - [warn,44] - No MyBatis mapper was found in ‘[com.ruoyi.**.map
  20. android照片共享,在安卓手机上可以实现多人共享照片吗?

热门文章

  1. java构造函数有几种_java构造函数的三种类型总结
  2. 算对于传统软件工程的影响
  3. 2023大型企业全面预算管理趋势
  4. 开抖音小店有什么优点?
  5. js练习题:构建函数创建一个电脑对象
  6. 用FireFox+FVD看TS格式流媒体视频
  7. C++STL详解(五)list的介绍及其使用
  8. go语言就业指南-岳东卫-专题视频课程
  9. MySQL给表增加字段的时候出现Table is full的报错处理
  10. C++ 使用 openGL 实现吃豆人游戏