博客
关于我
[翻译]微服务设计模式 - 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/

    你可能感兴趣的文章
    Ploly Dash,更新一个Dash应用程序JJJA上的实时人物
    查看>>
    Ploly烛台的定制颜色
    查看>>
    Ploly:如何在Excel中嵌入完全交互的Ploly图形?
    查看>>
    plotloss记录
    查看>>
    Plotly (Python) 子图:填充构面和共享图例
    查看>>
    Plotly 中的行悬停文本
    查看>>
    Plotly 停用 x 轴排序
    查看>>
    Plotly 域变量解释(多图)
    查看>>
    Plotly 绘制表面 3D 未显示
    查看>>
    Plotly-Dash 存在未知问题并创建“加载依赖项时出错“;通过使用 Python-pandas.date_range
    查看>>
    Plotly-Dash:如何过滤具有多个数据框列的仪表板?
    查看>>
    Plotly:如何为 x 轴上的时间序列设置主要刻度线/网格线的值?
    查看>>
    Plotly:如何从 x 轴删除空日期?
    查看>>
    Plotly:如何从单条迹线制作堆积条形图?
    查看>>
    Plotly:如何以 Root 样式绘制直方图,仅显示直方图的轮廓?
    查看>>
    Plotly:如何使用 Plotly Express 组合散点图和线图?
    查看>>
    Plotly:如何使用 plotly.graph_objects 和 plotly.express 定义图形中的颜色?
    查看>>
    Plotly:如何使用 Python 对绘图对象条形图进行颜色编码?
    查看>>
    Plotly:如何使用 updatemenus 更新一个特定的跟踪?
    查看>>
    Plotly:如何使用长格式或宽格式的 pandas 数据框制作线图?
    查看>>