服务发现及其云服务【玩转华为云】

举报
码乐 发表于 2025/03/07 09:11:09 2025/03/07
42 0 0
【摘要】 1 简介服务发现模式,服务发现(Service Discovery),用于发现具有多个副本的服务实例的目的地,用于处理大规模请求和提供高可用性。在任何分布式架构中,我们都需要找到机器所在位置的物理地址。这个概念从分布式计算开始就已经存在,正式名称为服务发现。它对微服务、基于云的应用程序至关重要。 2 服务发现在 AWS App Mesh 中实施我们将利用 AWS Cloud Map 来实施...

1 简介

服务发现模式,服务发现(Service Discovery),用于发现具有多个副本的服务实例的目的地,用于处理大规模请求和提供高可用性。在任何分布式架构中,我们都需要找到机器所在位置的物理地址。

这个概念从分布式计算开始就已经存在,正式名称为服务发现。它对微服务、基于云的应用程序至关重要。

本文参阅华为云 服务发现方法 部分(查看本文最后参考链接),或者了解AWS有关 Envoy 代理与服务发现类型相关的行为的更多详细信息。

比如华为云的服务发现的go-zero工具支持多种服务发现的方式,ip直连、etcd、k8s服务发现、consul等方式。

2 服务发现在 AWS App Mesh 中实施

我们将利用 AWS Cloud Map 来实施此模式。要有效地为一组实例终端节点配置异常值检测,服务发现方法应使用 AWS Cloud Map。

否则,如果使用 DNS,Envoy 代理将只选择一个 IP 地址路由到上游服务,从而使从一组主机中弹出运行状况不佳的主机的异常值检测行为无效。

先决条件是已经为要注册和发现的服务声明了 Kubernetes Deployment 和 Service。
因此,我们可以拥有服务的集群本地 FQDN,该 FQDN 处于模式中,当客户端想要请求此服务时,可以将其用作主机域。servicename.service-name.namespace.svc.cluster.local

之后,为每组实例创建一个 VirtualNode,如下所示:

声明 App Mesh VirtualNode,与声明的 Kubernetes 部署相同metadata.namepodSelector为 VirtualNode 预期的入站流量配置侦听器,为侦听器指定端口和协议。

目前,App Mesh 仅支持配置一个侦听器,请参阅 侦听器 API 参考 以确认此限制。
指定侦听器的运行状况检查策略在定义中声明它们的 Service Discovery 属性VirtualNode

此外,最好有一个命名规范来描述业务产品类型、云映射命名空间和服务名称之间的映射。下表是一个示例,

  产品类型    		Cloud Map 命名空间  					云地图服务
  汽车司机    		car-driver.${env}.uber.aws.local    	${微服务名称}
  汽车乘客    		car-passenger.${env}.uber.aws.local 	${微服务名称}
  食品店 			 foodstore.${env}.uber.aws.local   		${微服务名称}

例如,为了隔离 API 和 Web 请求,我们需要部署一个服务,比如说,作为两组单独的实例,一组用于为预测更高吞吐量的 API 流量提供服务,另一个用于为吞吐量较低但查询较大的 Web 流量提供服务,该场景的 Service Discovery 将涉及以下类型的资源:sw-foo-service

  VirtualNode对于 Default Traffic Channel

  apiVersion: appmesh.k8s.aws/v1beta2
  kind: VirtualNode
  metadata:
    name: sw-foo-service
    namespace: sw-foo-service
  spec:
    podSelector:
      matchLabels:
        app: sw-foo-service
        traffic-channel: default
    listeners:
      - portMapping:
          port: 8080
          protocol: http
        healthCheck:
          port: 8080
          protocol: http
          path: '/status'
          healthyThreshold: 2
          unhealthyThreshold: 3
          timeoutMillis: 2000
          intervalMillis: 5000
    serviceDiscovery:
      awsCloudMap:
        namespaceName: foo.prod.softwheel.aws.local
        serviceName: sw-foo-service
        attributes:
        - key: traffic-channel
          value: default

  VirtualNode对于 Web 流量通道
  apiVersion: appmesh.k8s.aws/v1beta2
  kind: VirtualNode
  metadata:
    name: sw-foo-service-web
    namespace: sw-foo-service
  spec:
    podSelector:
    matchLabels:
      app: sw-foo-service
      traffic-channel: web
    listeners:
    - portMapping:
        port: 8080
        protocol: http
      healthCheck:
        port: 8080
        protocol: http
        path: '/status'
        healthyThreshold: 2
        unhealthyThreshold: 3
        timeoutMillis: 2000
        intervalMillis: 5000
    serviceDiscovery:
      awsCloudMap:
        namespaceName: foo.prod.softwheel.aws.local
        serviceName: sw-foo-service
        attributes:
        - key: traffic-channel
          value: web
  Deployment对于 Default Traffic Channel
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: sw-foo-service
    namespace: sw-foo-service
  spec:
    replicas: 2
    selector:
      matchLabels:
        app: sw-foo-service
        traffic-channel: default
    template:
      metadata:
        labels:
         app: sw-foo-service
         traffic-channel: default
      spec:
        containers:
         - name: sw-foo-service
           image: sw-foo-service-ecr:BUILD-29
           ports:
             - containerPort: 8080
           env:
             - name: "SERVER_PORT"
               value: "8080"
             - name: "COLOR"
               value: "blue"
  Deployment对于 Web 流量通道
  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: sw-foo-service-web
    namespace: sw-foo-service
  spec:
    replicas: 6
    selector:
      matchLabels:
        app: sw-foo-service
        traffic-channel: web
    template:
      metadata:
        labels:
         app: sw-foo-service
         traffic-channel: web
      spec:
        containers:
         - name: sw-foo-service
           image: sw-foo-service-ecr:BUILD-29
           ports:
             - containerPort: 8080
           env:
             - name: "SERVER_PORT"
               value: "8080"
             - name: "COLOR"
               value: "blue"

3 小结

参考服务发现实践

https://support.developer.huaweicloud.com/doc/development/Development-Language-guide/zh-cn_topic_0000001394130874-0000001394130874

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。