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

    你可能感兴趣的文章
    OSPF技术连载15:OSPF 数据包的类型、格式和邻居发现的过程
    查看>>
    OSPF技术连载16:DR和BDR选举机制,一篇文章搞定!
    查看>>
    OSPF技术连载17:优化OSPF网络性能利器——被动接口!
    查看>>
    OSPF技术连载18:OSPF网络类型:非广播、广播、点对多点、点对多点非广播、点对点
    查看>>
    OSPF技术连载19:深入解析OSPF特殊区域
    查看>>
    SQL Server 复制 订阅与发布
    查看>>
    OSPF技术连载20:OSPF 十大LSA类型,太详细了!
    查看>>
    OSPF技术连载21:OSPF虚链路,现代网络逻辑连接的利器!
    查看>>
    OSPF技术连载22:OSPF 路径选择 O > O IA > N1 > E1 > N2 > E2
    查看>>
    OSPF技术连载2:OSPF工作原理、建立邻接关系、路由计算
    查看>>
    OSPF技术连载5:OSPF 基本配置,含思科、华为、Junifer三厂商配置
    查看>>
    OSPF技术连载6:OSPF 多区域,近7000字,非常详细!
    查看>>
    OSPF技术连载7:什么是OSPF带宽?OSPF带宽参考值多少?
    查看>>
    OSPF技术连载8:OSPF认证:明文认证、MD5认证和SHA-HMAC验证
    查看>>
    OSPF故障排除技巧
    查看>>
    spring配置文件中<context:property-placeholder />的使用
    查看>>
    OSPF有哪些优势?解决了RIP的什么问题?
    查看>>
    OSPF的七种类型LSA
    查看>>
    OSPF的安全性考虑:全面解析与最佳实践
    查看>>
    ospf综合实验2 2012/9/8
    查看>>