博客
关于我
[翻译]微服务设计模式 - 4. 服务发现 - 客户端服务发现
阅读量:468 次
发布时间:2019-03-06

本文共 1683 字,大约阅读时间需要 5 分钟。

在微服务架构中,服务之间的互相调用是核心需求。传统分布式系统中,服务地址和端口是固定的,因此可以直接通过 HTTP/REST 或其他 RPC 机制进行调用。然而,在云原生微服务体系中,服务实例数量和提供服务的位置都是动态变化的,这使得客户端需要一种机制来发现可用的服务实例。

问题提出

某个服务的客户端或 API 网关,如何在动态变化的服务实例中找到服务的位置?

考虑因素

  • 服务实例的动态性:每个实例在特定位置(主机和端口)提供一个远程 API,例如 HTTP/REST 或 Thrift。
  • 实例数量的变化:服务实例数量可能会动态变化,例如 AWS EC2 的自动扩容组根据负载自动调整实例数量。
  • IP 地址的动态分配:虚拟机和容器通常会分配动态 IP 地址。
  • 解决方案

    在请求一个服务时,客户端可以查询一个公共的服务登记处(Service Registry,或者称为注册中心),以查找可用的服务实例及其位置。例如,Spring Cloud 的服务发现组件可以实现这一点。

    示例

    在 Spring Boot 和 Spring Cloud 框架中,服务发现主要基于客户端服务发现。RegistrationServiceProxy 是一个组件,用于注册用户。当应用部署时,user_registration_url 实际上指向 http://REGISTRATION-SERVICE/user,其中 REGISTRATION-SERVICE 是客户端用来发现服务实例的服务名称。服务发现通过 Netflix OSS 组件实现,包括 Eureka 作为注册中心,以及通过 Ribbon 进行 HTTP 请求调用。

    客户端服务发现可以通过以下注解进行配置:

    @Configuration@EnableEurekaClient@Profile("enableEureka")class EurekaClientConfiguration {    @Bean    @LoadBalanced    def restTemplate(scalaObjectMapper: ScalaObjectMapper): RestTemplate = {        val restTemplate = new RestTemplate()        restTemplate.getMessageConverters foreach {            case mc: MappingJackson2HttpMessageConverter =>                mc.setObjectMapper(scalaObjectMapper)            case _ =>        }        restTemplate    }}

    @EnableEurekaClient 注解启用了 Eureka 客户端,而 @LoadBalanced 注解配置了 RestTemplate,使其使用 Eureka 客户端进行服务发现。RestTemplate 会通过 http://REGISTRATION-SERVICE/user 解析服务名称,并通过 Eureka 查找可用服务实例的网络位置进行请求。

    分析

    优点

    • 减少了中间组件和网络跳转:与服务端服务发现相比,客户端服务发现的网络路径更短。

    缺点

    • 耦合性:客户端需要与特定的注册中心耦合,不同注册中心可能有不同的注册逻辑。
    • 多语言支持:需要实现不同语言的客户端服务发现逻辑。

    相关设计模式

  • 服务登记处(Service Registry):注册中心记录服务实例的元数据,如服务名称、实例 ID、地址和端口。
  • 微服务基础框架:提供了服务发现的核心功能,例如 Spring Cloud 的服务发现组件。
  • 服务端服务发现:这是客户端服务发现的替代品,通常在服务端实现,通过注册中心进行服务实例的动态发现。
  • 通过以上机制,客户端可以在动态变化的服务实例中找到可用的服务位置,确保微服务架构的高效运行。

    转载地址:http://qcgbz.baihongyu.com/

    你可能感兴趣的文章
    SharePoint 2013 图文开发系列之定义站点模板
    查看>>
    PCB生产流程详解-ChatGPT4o作答
    查看>>
    PCB设计十条黄金法则
    查看>>
    SpringSecurity框架介绍
    查看>>
    PCI Express学习篇:Power Management(二)
    查看>>
    pcie握手机制_【博文连载】PCIe扫盲——Ack/Nak 机制详解(一)
    查看>>
    pcm转wav的方法及代码示例
    查看>>
    PC史上最悲剧的16次失败
    查看>>
    PC端恶意代码分析Lab1.1-5.1,从零基础到精通,收藏这篇就够了!
    查看>>
    PC端稳定性测试探索
    查看>>
    PC端编辑 但能在PC端模拟移动端预览的富文本编辑器
    查看>>
    PDB文件:每个开发人员都必须知道的
    查看>>
    springMVC学习(二)
    查看>>
    Pdfkit页眉和页脚
    查看>>
    PDF中的Pandoc语法突出显示不起作用
    查看>>
    pdf从结构新建书签_在PDF文件中怎样创建书签
    查看>>
    pdf做成翻页电子书_第一弹:常见BOOX电子书阅读器问题解答,这些技能你都会吗?...
    查看>>
    PDF工具箱-分割提取合并
    查看>>
    pdf打印骑缝章
    查看>>
    PDF文字识/编辑?这个工具真的很强大!
    查看>>