基于etcd的服务发现与注册

服务发现:从Consul到Etcd注册中心实战 Consul是一个综合性的服务发现、配置和管理平台。它提供了丰富的功能,包括健康检查、服务注册与发现、键值存储等。Consul通过HTTP API和DNS接口,使得服务能够轻松地进行注册和发现。Etcd是一个分布式键值存储系统,它提供了一种简单而可靠的方式来存储和共享数据。在Etcd中,服务的注册和发现可以通过创建和查询键值对来实现。Consul和Etcd都是优秀的服务发现注册中心,各自具有独特的优势和适用场景。在选择时,开发者应根据具体的业务需求、技术栈和团队熟悉度来决定。 阅读详情

1. 微服务架构上篇

4. 基于etcd的服务发现与注册

1. LB方案介绍

构建高可用、高性能的通信服务,通常采用服务注册与发现、负载均衡和容错处理等机制实现。根据负载均衡实现所在的位置不同,通常可分为以下三种解决方案:

1.1 集中式LB(Proxy代理模式)

在服务消费者和服务提供者之间有一个独立的LB,通常是专门的硬件设备如 F5,或者基于软件如 LVS,HAproxy等实现。LB上有所有服务的地址映射表,通常由运维配置注册,当服务消费方调用某个目标服务时,它向LB发起请求,由LB以某种策略,比如轮询(Round-Robin)做负载均衡后将请求转发到目标服务。LB一般具备健康检查能力,能自动摘除不健康的服务实例。

该方案主要问题:

  1. 单点问题,所有服务调用流量都经过LB,当服务数量和调用量大的时候,LB容易成为瓶颈,且一旦LB发生故障影响整个系统;

  2. 服务消费方、提供方之间增加了一级,有一定性能开销。

1.2 进程内LB(客户端负均衡)

针对第一个方案的不足,此方案将LB的功能集成到服务消费方进程里,也被称为软负载或者客户端负载方案。服务提供方启动时,首先将服务地址注册到服务注册表,同时定期报心跳到服务注册表以表明服务的存活状态,相当于健康检查,服务消费方要访问某个服务时,它通过内置的LB组件向服务注册表查询,同时缓存并定期刷新目标服务地址列表,然后以某种负载均衡策略选择一个目标服务地址,最后向目标服务发起请求。LB和服务发现能力被分散到每一个服务消费者的进程内部,同时服务消费方和服务提供方之间是直接调用,没有额外开销,性能比较好。

该方案主要问题:

  1. 开发成本,该方案将服务调用方集成到客户端的进程里头,如果有多种不同的语言栈,就要配合开发多种不同的客户端,有一定的研发和维护成本;

  2. 另外生产环境中,后续如果要对客户库进行升级,势必要求服务调用方修改代码并重新发布,升级较复杂。

1.3 独立LB进程(外部负载均衡服务(Sidecar))

该方案是针对第二种方案的不足而提出的一种折中方案,原理和第二种方案基本类似。 不同之处是将LB和服务发现功能从进程内移出来,变成主机上的一个独立进程。主机上的一个或者多个服务要访问目标服务时,他们都通过同一主机上的独立LB进程做服务发现和负载均衡。该方案也是一种分布式方案没有单点问题,一个LB进程挂了只影响该主机上的服务调用方,服务调用方和LB之间是进程内调用性能好,同时该方案还简化了服务调用方,不需要为不同语言开发客户库,LB的升级不需要服务调用方改代码。

该方案主要问题:部署较复杂,环节多,出错调试排查问题不方便。

2. grpc服务发现与负载均衡实现

gRPC开源组件官方并未直接提供服务注册与发现的功能实现,但其设计文档已提供实现的思路,并在不同语言的gRPC代码API中已提供了命名解析和负载均衡接口供扩展。

其基本实现原理:

  1. 服务启动后gRPC客户端向命名服务器发出名称解析请求,名称将解析为一个或多个IP地址,每个IP地址标示它是服务器地址还是负载均衡器地址,以及标示要使用那个客户端负载均衡策略或服务配置。

  2. 客户端实例化负载均衡策略,如果解析返回的地址是负载均衡器地址,则客户端将使用grpclb策略,否则客户端使用服务配置请求的负载均衡策略。

  3. 负载均衡策略为每个服务器地址创建一个子通道(channel)。

  4. 当有rpc请求时,负载均衡策略决定那个子通道即grpc服务器将接收请求,当可用服务器为空时客户端的请求将被阻塞。

根据grpc官方提供的设计思路,基于进程内LB方案(即第2个案),结合分布式一致的组件(如Zookeeper、Etcd),可找到grpc服务发现和负载均衡的可行解决方案。

3. 核心代码实战

接下来以Go语言为例,简单介绍下基于Etcd3的关键代码实现。

3.1 服务注册实现: register.go

注册的核心逻辑就是将服务的启动IP和Port以name的形式注册到基于etcd的target中,这样当客户端去发现服务的时候以name的形式去请求target(etcd)获取IP和Port,这样就会将请求直接打到以这个IP和port的服务器上。

const schema = "etcdv3_resolver"

func Register(target, service, host, port string, interval time.Duration, ttl int) error {
// 以IP和Port作为etcd的value
 serviceValue := net.JoinHostPort(host, port)
// 以schema+name(服务名称)+value作为etcd的key
 serviceKey := fmt.Sprintf("/%s/%s/%s", schema, service, serviceValue)

 // 获取endpoints(即etcd的nodehost:port列表)用于实例化etcd对象
 var err error
 cli, err := clientv3.New(clientv3.Config{
  Endpoints: strings.Split(target, ","),
 })
// 获取租约
 resp, err := cli.Grant(context.TODO(), int64(ttl))
 if err != nil {
  return err
 }
  
// 将key和value存储到etcd中
 if _, err := cli.Put(context.TODO(), serviceKey, serviceValue, clientv3.WithLease(resp.ID)); err != nil {
  return err
 }

// 根据租约ID保持与etcd的存活探针
 if _, err := cli.KeepAlive(context.TODO(), resp.ID); err != nil {
  return err
 }
}

3.2 服务发现实现: watcher.go

服务发现核心逻辑就是根据客户端上传的name去etcd查询后端服务,查询到就把服务注册的时候的那个value返回给grpc客户端,客户端直接发起rpc调用,不用夸网络。

func (r *Resolver) watch(prefix string) {
// 根据name和schema拼接的前缀去匹配key,那么一定是一个列表,因为我们注册的key是schema+name+host:port 所以schema+name可以匹配多个key/value
 resp, err := r.cli.Get(context.Background(), prefix, clientv3.WithPrefix())
 if err == nil {
  for i := range resp.Kvs {
   addrDict[string(resp.Kvs[i].Value)] = resolver.Address{Addr: string(resp.Kvs[i].Value)}
  }
 }

//通知到grpc客户端地址列表
 update := func() {
  addrList := make([]resolver.Address, 0, len(addrDict))
  for _, v := range addrDict {
   addrList = append(addrList, v)
  }
  r.cc.UpdateState(resolver.State{Addresses: addrList})
 }
}

update()

//监听etcd注册上来的服务变化(新增,修改或者删除)

rch := r.cli.Watch(context.Background(), prefix, clientv3.WithPrefix(), clientv3.WithPrevKV())
 for n := range rch {
  for _, ev := range n.Events {
   switch ev.Type {
   case mvccpb.PUT: //新增或者修改服务
    addrDict[string(ev.Kv.Key)] = resolver.Address{Addr: string(ev.Kv.Value)}
   case mvccpb.DELETE: //删除服务
    delete(addrDict, string(ev.PrevKv.Key))
   }
  }
  update()
 }

3.3 server进行注册: main.go

var (
 serv = flag.String("service", "hello_service", "service name")
 host = flag.String("host", "localhost", "listening host")
 port = flag.String("port", "50001", "listening port")
 reg  = flag.String("reg", "http://localhost:2379", "register etcd address")
)

func main() {
 flag.Parse()

 lis, err := net.Listen("tcp", net.JoinHostPort(*host, *port))
 if err != nil {
  panic(err)
 }

//调用注册 将服务注册到etcd中 并且添加续约时间
 err = grpclb.Register(*reg, *serv, *host, *port, time.Second*10, 15)
 if err != nil {
  panic(err)
 }
}

3.4 client发现server: main.go

var (
 svc = flag.String("service", "hello_service", "service name")
 reg = flag.String("reg", "http://localhost:2379", "register etcd address")
)

func main() {
 flag.Parse()
  
 // 实例化name命名解析器
 r := grpclb.NewResolver(*reg, *svc)
 resolver.Register(r)

 ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)

// 通过r.Scheme()+"://authority/"+*svc发现服务的IP+Port
// 设置负载均衡策略:轮循 roundrobin
 conn, err := grpc.DialContext(ctx, r.Scheme()+"://authority/"+*svc, grpc.WithInsecure(), grpc.WithBalancerName(roundrobin.Name), grpc.WithBlock())
 cancel()
 if err != nil {
  panic(err)
 }

 ticker := time.NewTicker(1000 * time.Millisecond)
 for t := range ticker.C {
  client := pb.NewGreeterClient(conn)
  resp, err := client.SayHello(context.Background(), &pb.HelloRequest{Name: "world " + strconv.Itoa(t.Second())})
  if err == nil {
   logrus.Infof("%v: Reply is %s\n", t, resp.Message)
  }
 }
}

3.5 运行

1. 以docker方式启动etcd

➜  ~ docker run -d\
  -p 2379:2379 \
  -p 2380:2380 \
  --volume=${DATA_DIR}:/etcd-data \
  --name etcd ${REGISTRY}:latest \
  /usr/local/bin/etcd \
  --data-dir=/etcd-data --name node1 \
  --initial-advertise-peer-urls http://127.0.0.1:2380 --listen-peer-urls http://0.0.0.0:2380 \
  --advertise-client-urls http://127.0.0.1:2379 --listen-client-urls http://0.0.0.0:2379 \
  --initial-cluster node1=http://127.0.0.1:2380

2. 启动测试程序

分别启动服务端

终端1: go run -mod vendor cmd/svr/svr.go -port 50001

终端2: go run -mod vendor cmd/svr/svr.go -port 50002

终端3: go run -mod vendor cmd/svr/svr.go -port 50003

启动客户端

go run -mod vendor cmd/cli/cli.go

3. 结果

客户端响应:

可以看出来成功请求三次都是不同的服务,说明服务发现和负载均衡生效了。

服务端响应:

可以看出来三个server都响应了客户端请求,尚且只有一次,再次证明轮循负载均衡策略和服务注册生效了。

4. 小结

这片文章是上篇系列重点,服务注册和发现以及负载均衡策略是微服务架构中不可或缺的一环,只有彻底弄懂和掌握了此技术,才能在基于云原生微服务架构中得心应手,所以学好grpc+etcd+golang的技术栈走遍天下大厂都不怕!

微信公众号:堆栈future

希望大家关注哈,原创不容易,求点赞,求关注,求分享

扫码_搜索联合传播样式-标准色版.png

云原生架构下的高可用服务发现:基于etcd构建强大的服务注册中心 etcd是一个分布式的键值存储系统,专为共享配置和服务发现设计。它通过一致性协议(如Raft)确保在分布式环境中的数据一致性。强一致性:etcd通过实现Raft协议,保证了强一致性,适用于需要一致性保障的应用场景。高可用性:etcd通过数据复制和自动故障恢复保证了高可用性。简单易用:etcd提供了简单的RESTful API,方便开发者进行操作。etcd最常见的应用之一就是作为服务注册中心,帮助不同微服务之间进行相互发现和通信。在云原生架构中,服务发现是确保微服务高效、稳定运行的重要组成部分。 阅读详情

相关推荐

go-zero微服务实战——etcd服务注册与发现

浅谈etcd服务注册与发现etcd官网etcd中文文档apt安装etcd,启动命令十分简单etcd。etcd分为v2版本和v3版本,命令有所不一样etcd是一个k-v存储的格式和redis类似,使用set存储数据,使用get获取数据。

个人学习笔记库,一篇一篇记录成长的足迹 2797

浅谈etcd服务注册与发现

微服务是当今互联网领域的广泛概念,也是一种架构演进的结果,微服务的存在让架构设计更加的解耦合,让人员的分工更加明确,当然他的落地实现也并不止步与某一两种方式,在云原生领域的Kubernetes+etcd,互联网领域常用的Spring Cloud全家桶以及Dubbo等都是微服务的具体实现,而etcd也仅仅是微服务中服务注册中心组件角色的一个代表而已。

做兴趣使然的Hero 2196

05服务发现:引入etcd服务注册中心

etcd是一种强一致性的分布式键值存储组件,使用Raft算法,由于CAP理论,没有一种服务注册中心能够完全兼顾C、A、P,只能偏向于CP或AP,etcd作为偏向CP的分布式服务注册中心,利用Go语言编写,它提供了一种可靠的方式来存储需要由分布式系统或机器集群访问的数据。它在网络分区期间优雅地处理领导者选举,并且可以容忍机器故障,即使在领导者节点中也是如此。

做兴趣使然的Hero 1391

ETCD 十六 服务注册与发现

微服务架构中的服务注册与发现 在微服务架构中,多个微服务间的通信需要依赖服务注册与发现组件获取指定服务实例的地址信息,才能正确地发起 RPC 调用,保证分布式系统的高可用、高并发。服务注册与发现主要包含两部分:服务注册的功能与服务发现的功能。服务注册是指服务实例启动时将自身信息注册到服务注册与发现中心,并在运行时通过心跳等方式向其汇报自身服务状态;服务发现是指服务实例向服务注册与发现中心获取其他服务实例信息,用于远程调用。 下面我们来看服务注册与发现中心的职责和服务实例进行服务注册的基本流程,...

weixin_42017400的博客 3604

云原生服务发现:etcd 实现高可用服务注册中心

在云原生架构中,服务发现是微服务系统的核心基础设施。本文聚焦etcd作为服务注册中心的技术实现,详细阐述其如何解决分布式环境下服务实例的动态注册、健康监测、地址发现等关键问题。内容覆盖理论原理、算法实现、工程实践及典型应用场景,帮助读者构建从技术原理到落地实践的完整知识体系。背景部分定义核心概念与术语核心原理解析etcd架构与关键技术算法层深入Raft共识算法与Watch机制实战环节提供完整代码实现与部署方案应用场景覆盖主流云原生架构集成资源推荐助力技术深入与生态扩展。

AI云原生与云计算技术学院 815

从‘静态拍照’到‘动态录像’:用Malmquist指数讲好你的效率变化故事(附Stata/R代码)

本文深入探讨了如何利用Malmquist指数构建动态效率分析框架,从静态数据到动态叙事的转变。通过分解技术效率变化(EC)和技术进步(TC),结合Stata/R代码实现四种动态可视化方法,帮助研究者更直观地展示效率变化的动态特征。文章还提供了诊断性叙事结构和比较叙事技巧,助力决策者理解效率提升的来源与趋势。

weixin_32678995的博客 603

etcd 微服务注册与发现

随着CoreOS和Kubernetes等项目在开源社区日益火热,它们项目中都用到的etcd组件作为一个高可用、强一致性的服务发现存储仓库,渐渐为开发人员所关注。在云计算时代,如何让服务快速透明地接入到计算集群中,如何让共享配置信息快速被集群中的所有机器发现,更为重要的是,如何构建这样一套高可用、安全、易于部署以及响应快速的服务集群,已经成为了迫切需要解决的问题。etcd为解决这类问题带来了福音,本章

zsspj12的专栏 1万+

A Super-Resolution Imaging Method for Forward-Looking Scanning Radar Based on Improved TV论文阅读

具体而言,作者提出了一种改进的总变差(Improved Total Variation, ITV)方法,通过引入。论文旨在解决前视扫描雷达(Forward-Looking Scanning Radar)超分辨率成像中传统。(Batch Processing),以增强图像边缘特征的保留能力,并提升计算效率。论文的核心创新点在于对传统TV正则化的邻域梯度计算进行扩展,提出。ITV剖面(图3d)在噪声下仍保持矩形边缘,仅存。​(公式10):实现稀疏约束。),抑制远端单元贡献。(幅度远低于目标)。

yangqoor的博客 1239

【ETCD】【实操篇(十)】基于 ETCD 实现一个简单的服务注册及发现功能

通过基于 ETCD 实现的服务注册中心,服务能够方便地注册到 ETCD 中,利用 ETCD 的租约机制实现自动注销与过期。同时,借助 ETCD 提供的监听机制,其他服务可以实时发现注册信息,动态连接到服务。这种方式简单而高效,适用于分布式系统中的服务注册与发现。在实际应用中,可以通过增强健康检查、增加负载均衡、支持多租户等方式对该服务注册中心进行扩展,使其满足更多的实际需求。

zhangshenglu1的博客 1972

Kali实战:构建安卓远程监控工具,实现拍照、定位与信息获取

本文详细介绍了如何使用Kali Linux构建安卓远程监控工具,实现拍照、定位与信息获取功能。通过Metasploit框架生成安卓载荷,部署到目标设备并建立连接,执行远程监控操作如获取位置信息、拍照和读取通讯录。文章还提供了进阶技巧与问题排查方法,强调法律与道德考量。

weixin_28716443的博客 239

告别算力焦虑:手把手教你用华为CloudMatrix384超节点部署MoE大模型(附xDeepServe配置)

本文详细解析了如何在华为CloudMatrix384超节点上高效部署MoE大模型,通过xDeepServe框架配置和专家分配优化,实现2300 Tokens/s的推理吞吐。文章涵盖环境准备、性能调优、成本平衡及容灾设计,帮助开发者告别算力焦虑,提升AI推理效率。

weixin_30790841的博客 439

php etcd 服务发现,ETCD 服务注册和发现

ETCD 服务发现在微服务中各个服务都是无状态的,不会在配置中写死上下游的访问地址,所以需要有一个地方去维护各个节点的信息。服务起来的时候会去注册中心拉取其他服务的节点信息,并且把自己的信息推送到注册中心。当有运行的服务下线或者出现问题的时候,把自己从配置中心摘除,或者配置中心来检测服务状态(心跳、健康检查的协议)来摘除服务。package mainimport ("encoding/json""...

weixin_39846553的博客 334

OPNET网络仿真实验

外网

嚴 帅的博客 1万+

java如何通过grpc连接etcd_golang 使用grpc前的准备,基于ETCD服务发现、服务注册

主要使用ETCD来实现服务注册和服务发现为什么使用grpc前要实现服务发现、服务注册?考虑微服务水平拓展较为容易,grpc包本身没有提供服务发现和服务注册,那么在使用过程中,对应的rpc只能通过nginx等服务去进行负载均衡,而当微服务需要水平拓展时,因为没有服务发现,因此要修改nginx配置才能将该节点加入进行使用,因此需要更加智能的动态添加和删除节点,所以grpc也不必使用nginx进行负载均...

weixin_42627541的博客 457

PCIe Link Training 深度解析:从物理检测到高速数据传输

本文深入解析PCIe链路训练(Link Training)的技术细节,揭示了这一复杂协商过程的五个关键阶段:物理检测阶段通过电气特性识别设备连接;轮询阶段建立时钟和符号同步;配置阶段确定链路宽度并处理拓扑异常;恢复阶段完成速率切换和信号均衡;最终进入正常工作状态。文章特别强调了高速率下的均衡技术挑战,以及验证工程师需要关注的多个维度,包括状态机跳转、有序集内容、均衡算法和错误恢复能力。随着PCIe速率不断提升,理解这一底层机制对高速接口设计具有重要价值。

元直的博客 1655

2024 年 9 月青少年软编等考 C 语言三级真题解析

2024 年 9 月青少年软编等考 C 语言三级真题解析。

发布少儿编程考级的真题和优秀竞赛题解析,以及一些讲义。 1739

java如何通过grpc连接etcd_grpc经过 etcd 实现服务发现与注册-源码分析

介绍下面介绍 jupiter-0.2.7 版本中 grpc 经过 etcd 实现服务发现与注册。node服务发现与注册的实现解析服务注册服务注册的流程图:golang etcd的服务注册代码模块在 jupiter/pkg/registry/etcdv3 中。mvc下面让咱们来看看实际的代码app// Registry register/unregister service// registry i...

weixin_39608748的博客 502

基于CrossSim的存储硬件原型机ANN仿真:MNIST手写数字识别实现与分析

本项目基于CrossSim仿真平台,在存储硬件原型机上实现了MNIST手写数字识别的ANN模型。通过搭建CrossSim仿真环境,设计传统ANN基准模型和考虑硬件非理想特性的CrossSim模型,对比分析了不同配置下的识别性能。实验结果表明,在引入硬件噪声和器件变异的情况下,模型准确率仍能达到95%以上,验证了存储内计算架构的可行性。研究为存储硬件与计算单元融合提供了实验依据,展示了CrossSim在神经形态计算系统仿真中的实用价值。

huanghm88的专栏 596

java如何通过grpc连接etcd_grpc通过 etcd 实现服务发现与注册-源码分析

介绍下面介绍 jupiter-0.2.7 版本中 grpc 通过 etcd 实现服务发现与注册。服务发现与注册的实现解析服务注册服务注册的流程图:etcd的服务注册代码模块在 jupiter/pkg/registry/etcdv3 中。下面让我们来看看实际的代码// Registry register/unregister service// registry impl should contro...

weixin_30764401的博客 975

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python 微服务 etcd_etcd+gRPC 服务注册与服务发现微服务网关的实现

去etcd官网下载对应的包,解压进入etcd-v3.4.7-linux-amd64,使用etcd命令启动,需要指定本机ip地址,不指定的话,默认是127.0.0.1,会导致其它局域网电脑访问不通./etcd --advertise-client-urls 'http://10.1.1.248:2379' --listen-peer-urls 'http://10.1.1.248:2380' --l...

weixin_39949776的博客 696

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

python 微服务 etcd_golang微服务实践:服务注册与服务发现 - Etcd的使用

为什么?为什么会有服务注册和服务发现?在它以前我们是怎么做的?举个例子:比如我们做MySQL读写分离,就在本地配置一个文件,然后程序读取这个配置文件里的数据进行数据库读写分离的设置。但是随着业务发展迅速,业务模块越来越多,数据也越来越多,MySQL数据库也越来越多,需要读取MySQL服务的业务模块也越来越多。每次增加MySQL实例,每个业务模块都要手动去写一次本地配置。想一想这里有什么问题?可以改...

weixin_39778214的博客 321

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【c++中间件】etcd存储系统 && 服务注册 && 服务发现 && 二次封装

本文介绍了Etcd的安装配置与使用方法。Etcd是一个用Golang编写的分布式键值存储系统,基于Raft算法实现一致性,适用于服务发现和配置管理。文章详细说明了在Linux系统下安装Etcd的步骤、服务启停命令以及单节点配置方法,包括监听端口、数据目录等参数的设置。同时演示了通过etcdctl进行键值操作的验证过程,并强调了环境变量ETCDCTL_API=3的重要性。最后介绍了将Etcd作为服务注册中心的概念,包括服务注册、发现和健康检查机制,以及C++客户端etcd-cpp-apiv3的依赖安装和使用方

lirendada的博客 1034

python服务发现与注册_在系统中用etcd实现服务注册和发现

系统中实现服务注册与发现所需的基本功能有:服务注册:同一service的所有节点注册到相同目录下,节点启动后将自己的信息注册到所属服务的目录中。健康检查:服务节点定时发送心跳,注册到服务目录中的信息设置一个较短的TTL,运行正常的服务节点每隔一段时间会去更新信息的TTL。服务发现:通过名称能查询到服务提供外部访问的 IP 和端口号。比如网关代理服务时能够及时的发现服务中新增节点、丢弃不可用的服务节...

weixin_39637457的博客 750

etcd服务发现

原理 etcd实现服务发现和注册,使用的是kv存储、租约、watch. 向etcd 注册 该服务(其实就是 存一个值)然后向etcd 发送心跳,当etcd 没有检测到心跳就会 把这个键值对 删了(这整个动作是etcd里的租约模式),网关那边 就只需要 watch 这个 key ,就能够知道 所有服务的所有动态了. 注册的时候可以使用前缀这样在watch的时候可以watch所有的服务器. 服务注册 ...

copymaster 3122

终极CLIP-as-service服务发现指南:Consul/Etcd注册中心深度解析

🚀 CLIP-as-service作为业界领先的多模态AI服务框架,其强大的服务发现功能是确保高可用性和可扩展性的关键。本文将为您全面解析如何利用Consul/Etcd注册中心实现CLIP服务的智能发现与负载均衡。 ## 为什么需要服务发现? 在分布式AI服务部署中,服务发现机制让客户端能够**自动感知服务实例的变化**,无需手动配置服务地址。这对于CLIP-as-service的**弹性伸

gitblog_00673的博客 522
上一篇: golang踩坑 3.接口值是否等于nil
下一篇: 双十一赠送书籍
stackfuture
博客等级 码龄5年 23粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值