服务治理中的服务注册模式

举报
码乐 发表于 2025/03/14 10:02:37 2025/03/14
【摘要】 1 简介服务注册的权重模式动态路由 - 根据来自传入请求的数据(例如标头),将流量路由到特定服务的不同实例集。P-6 模式将严重依赖这种能力静态路由 - 将所有外部服务调用放在单个 URL 或 URL 前缀后面,并将这些调用映射到实际服务准入控制 - 在一个集中位置检查呼叫者关于所有服务的横切关注点(例如身份验证、授权、防抓取或访问限制)的准入。指标收集和日志记录 – 收集所有传入请求的指...

1 简介

服务注册的权重模式

动态路由 - 根据来自传入请求的数据(例如标头),将流量路由到特定服务的不同实例集。P-6 模式将严重依赖这种能力
静态路由 - 将所有外部服务调用放在单个 URL 或 URL 前缀后面,并将这些调用映射到实际服务
准入控制 - 在一个集中位置检查呼叫者关于所有服务的横切关注点(例如身份验证、授权、防抓取或访问限制)的准入。
指标收集和日志记录 – 收集所有传入请求的指标数据,并确保每个用户请求和响应都包含一些关键信息,以便在所有下游服务中进行日志关联。

比如AWS中我们需要同时利用 VirtualService、VirtualRouter 和 VirtualNode 来实现这种模式,

即为多组实例创建,以便为不同的流量提供服务VirtualNodes

创建一个 用于声明如何根据路由规则拆分流量,有多少流量将路由到哪个 VirtualNodeVirtualRouter

创建一个用于筛选来自客户端的路由规则,方法是将其命名为 K8s 服务名称VirtualService

与此模式的实施相关的最重要的 App Mesh API 是RoutSpec 系列,它支持多个协议路由并确定其路由规则的优先级,例如 、 、 和 。目前,我们的实现将严重依赖grpcRoutehttp2RoutehttpRoutetcpRoutehttpRoute.HttpRoute 使用match 对象s 指定匹配某些请求的条件,使用action 对象来确定要对匹配执行的作。

因此,让我们通过一些示例来介绍各种 Traffic Splitting 来演示如何实现它们。

2 配置资源清单

涉及的资源类型及其清单如下

  Service#FQDN:sw-foo-service.sw-foo-service.svc.cluster.local
  apiVersion: v1
  kind: Service
  metadata:
    name: sw-foo-service
    namespace: sw-foo-service
  spec:
    ports:
      - protocol: TCP
        port: 8080
  VirtualService
  apiVersion: appmesh.k8s.aws/v1beta2
  kind: VirtualService
  metadata:
    name: sw-foo-service
    namespace: sw-foo-service
  spec:
    awsName: sw-foo-service.sw-foo-service.svc.cluster.local
    provider:
      virtualRouter:
        virtualRouterRef:
          name: sw-foo-service-router
  VirtualRouter
  apiVersion: appmesh.k8s.aws/v1beta2
  kind: VirtualRouter
  metadata:
    name: sw-foo-service-router
    namespace: sw-foo-service
  spec:
    listeners:
     - portMapping:
        port: 8080
        protocol: http
    routes:
     - name: canary-route
       httpRoute:
         match:
           prefix: / # which means all of the traffic to this service
         action:
           weightedTargets:
             - virtualNodeRef:
                 name: sw-foo-service
               weight: 99
             - virtualNodeRef:
                 name: sw-foo-service-canary
               weight: 1

VirtualNode- Production 1 代表最后一个功能版本

  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:
        ...
    serviceDiscovery:
     awsCloudMap:
       namespaceName: foo.prod.softwheel.aws.local
       serviceName: sw-foo-service
       attributes:
       - key: traffic-channel
         value: web

VirtualNode- 用于下一个版本的 Canary 1

  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
        sw-canary-release: true
    listeners:
    - portMapping:
        port: 8080
        protocol: http
      healthCheck:
        ...
    serviceDiscovery:
     awsCloudMap:
       namespaceName: foo.prod.softwheel.aws.local
       serviceName: sw-foo-service
       attributes:
       - key: traffic-channel
         value: web

Deployment- Production 1 代表最后一个功能版本

  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"

Deployment- 用于下一个版本的 Canary 1

  apiVersion: apps/v1
  kind: Deployment
  metadata:
    name: sw-foo-service-web-canary
    namespace: sw-foo-service
  spec:
    replicas: 2
    selector:
      matchLabels:
        app: sw-foo-service
        traffic-channel: web
        sw-canary-release: true
    template:
     metadata:
       labels:
         app: sw-foo-service
         traffic-channel: web
         sw-canary-release: true
     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"

微服务都有一个唯一的名称 (URL),用于解析其位置。您的微服务需要在何处运行时可寻址。如果您必须考虑哪台计算机正在运行特定的微服务,事情可能会很快变坏。

与 DNS 将 URL 解析为特定计算机的方式相同,您的微服务需要具有唯一名称,以便可发现其当前位置。微服务需要可寻址的名称,使其独立于运行它们的基础设施。

这种方法意味着您的服务的部署方式和发现服务的方式之间存在交互,因为需要有一个服务注册表。同样,当计算机出现故障时,注册表服务必须能够指示服务现在运行的位置。

服务注册中心模式是服务发现的关键部分。注册表是一个包含服务实例的网络位置的数据库。服务注册表需要具有高可用性和最新性。客户端可以缓存从服务注册表获取的网络位置。

但是,该信息最终会过时,客户端无法再发现服务实例。因此,服务注册表由使用复制协议来保持一致性的服务器集群组成。

在某些微服务部署环境(称为集群,将在后面的部分中介绍)中,服务发现是内置的。例如,Azure Kubernetes 服务 (AKS) 环境可以处理服务实例注册和注销。它还在每个集群主机上运行一个代理,该代理充当服务器端发现路由器的角色。

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

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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