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

    你可能感兴趣的文章
    Numpy.ndarray对象不可调用
    查看>>
    Numpy如何使用np.umprod重写range函数中i的python
    查看>>
    numpy数组索引-ChatGPT4o作答
    查看>>
    numpy转PIL 报错TypeError: Cannot handle this data type
    查看>>
    NUUO网络视频录像机 css_parser.php 任意文件读取漏洞复现
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2授权码模式详细流程(一)——站在OAuth2设计者的角度来理解code
    查看>>
    OAuth2:项目演示-模拟微信授权登录京东
    查看>>