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

    你可能感兴趣的文章
    notepad++最详情汇总
    查看>>
    notepad如何自动对齐_notepad++怎么自动排版
    查看>>
    Notification 使用详解(很全
    查看>>
    NotImplementedError: Cannot copy out of meta tensor; no data! Please use torch.nn.Module.to_empty()
    查看>>
    Now trying to drop the old temporary tablespace, the session hangs.
    查看>>
    nowcoder—Beauty of Trees
    查看>>
    np.arange()和np.linspace()绘制logistic回归图像时得到不同的结果?
    查看>>
    np.power的使用
    查看>>
    NPM 2FA双重认证的设置方法
    查看>>
    npm build报错Cannot find module ‘webpack/lib/rules/BasicEffectRulePlugin‘解决方法
    查看>>
    npm build报错Cannot find module ‘webpack‘解决方法
    查看>>
    npm ERR! ERESOLVE could not resolve报错
    查看>>
    npm ERR! fatal: unable to connect to github.com:
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near '...on":"0.10.3","direc to'
    查看>>
    npm ERR! Unexpected end of JSON input while parsing near ‘...“:“^1.2.0“,“vue-html-‘ npm ERR! A comp
    查看>>
    npm error Missing script: “server“npm errornpm error Did you mean this?npm error npm run serve
    查看>>
    npm error MSB3428: 未能加载 Visual C++ 组件“VCBuild.exe”。要解决此问题,1) 安装
    查看>>
    npm install CERT_HAS_EXPIRED解决方法
    查看>>
    npm install digital envelope routines::unsupported解决方法
    查看>>
    npm install 卡着不动的解决方法
    查看>>