24、服务网格与API管理:原理、应用与权衡

服务网格与API管理:原理、应用与权衡

1. 服务网格基础概念

服务网格主要用于简化微服务间的通信复杂性和服务治理需求。在服务网格中,每个微服务都与一个边车代理(sidecar)共同运行,边车由中央控制平面控制,通过预定义配置实现各种功能。

2. Istio的关键特性与应用
2.1 服务入口与网关
  • ServiceEntry :常用于启用对Istio服务网格外部服务的请求。
  • Gateway :为HTTP/TCP流量配置负载均衡器,通常位于网格边缘,用于启用应用程序的入站流量。
2.2 请求路由

以Istio的BookInfo示例为例,该示例包含四个独立的微服务,每个服务有多个版本。若要将所有流量路由到Ratings服务的v1版本,可通过应用虚拟服务和路由规则实现。以下是Ratings和Reviews服务的规则示例:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
  ...
spec:
  hosts:
  - ratings
  http:
  - route:
    - destination:
        host: ratings
        subset: v1
---
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v1

还可以基于请求内容进行路由,例如根据HTTP头进行路由:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
  ...
spec:
  hosts:
  - reviews
  http:
  - match:
    - headers:
        end-user:
          exact: jason
    route:
    - destination:
        host: reviews
        subset: v2
  - route:
    - destination:
        host: reviews
        subset: v1
2.3 弹性设计
  • 超时设置 :在通过Istio边车代理调用另一个服务时,可以使用超时机制。例如,为Reviews服务设置0.5秒的超时:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: reviews
spec:
  hosts:
  - reviews
  http:
  - route:
    - destination:
        host: reviews
        subset: v2
    timeout: 0.5s
  • 断路器配置 :可以通过DestinationRule为特定服务应用断路器配置。例如,为Httpbin服务配置断路器:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
  name: httpbin
spec:
  host: httpbin
  trafficPolicy:
    connectionPool:
      tcp:
        maxConnections: 1
      http:
        http1MaxPendingRequests: 1
        maxRequestsPerConnection: 1
    outlierDetection:
      consecutiveErrors: 1
      interval: 1s
      baseEjectionTime: 3m
      maxEjectionPercent: 100
2.4 故障注入

可以在路由规则中指定注入一个或多个故障,如延迟或中止。以下示例为所有发往Ratings服务v1的请求注入HTTP 400响应:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: ratings
spec:
  hosts:
  - ratings
  http:
  - fault:
      abort:
        percent: 10
        httpStatus: 400
    route:
    - destination:
        host: ratings
        subset: v1
2.5 策略执行

以速率限制为例,若要根据客户端IP地址对Product Page服务进行速率限制,可以使用Istio的内存配额(memquota)适配器:

apiVersion: config.istio.io/v1alpha2
kind: memquota
metadata:
  name: handler
  namespace: istio-system
spec:
  quotas:
  - name: requestcount.quota.istio-system
    maxAmount: 500
    validDuration: 1s
  - dimensions:
      destination: reviews
    maxAmount: 1
    validDuration: 5s
  - dimensions:
      destination: productpage
    maxAmount: 2
    validDuration: 5s

还需要配置quota模板、rule、QuotaSpec和QuotaSpecBinding:

apiVersion: config.istio.io/v1alpha2
kind: quota
metadata:
  name: requestcount
  namespace: istio-system
spec:
  dimensions:
    source: request.headers["x-forwarded-for"] | "unknown"
    destination: destination.labels["app"] | destination.service.host | "unknown"
    destinationVersion: destination.labels["version"] | "unknown"
---
apiVersion: config.istio.io/v1alpha2
kind: rule
metadata:
  name: quota
  namespace: istio-system
spec:
  actions:
  - handler: handler.memquota
    instances:
    - requestcount.quota
---
apiVersion: config.istio.io/v1alpha2
kind: QuotaSpec
metadata:
  name: request-count
  namespace: istio-system
spec:
  rules:
  - quotas:
    - charge: "1"
      quota: requestcount:
---
kind: QuotaSpecBinding
metadata:
  name: request-count
  namespace: istio-system
spec:
  quotaSpecs:
  - name: request-count
    namespace: istio-system
  services:
  - name: productpage
    namespace: default
2.6 可观测性

在使用Istio时,使服务具备可观测性相对容易。例如,要为微服务应用启用分布式跟踪,需安装相应的插件(如Zipkin或Jaeger)。边车代理能够自动将跟踪跨度发送到这些工具,但应用程序需要传播适当的HTTP头,以便正确关联跟踪信息。

2.7 安全性

Istio提供了多种安全功能,包括服务间的相互TLS(mTLS)认证、服务的白名单和黑名单、访问控制和基于角色的访问控制(RBAC)。

3. Linkerd服务网格

Linkerd是一个开源的网络代理,设计用于作为服务网格部署,负责处理跨服务通信的复杂部分,如延迟感知负载均衡、连接池、TLS、检测和请求级路由。它基于Netty和Finagle构建。

3.1 快速开始

可以在本地机器上运行Linkerd,并使用以下YAML配置文件启动服务网格。假设微服务在HTTP端口9999上运行,以下配置将在HTTP端口4140上启动Linkerd:

#linkerd.yaml
routers:
- protocol: http
  dtab: |
    /svc => /#/io.l5d.fs
  servers:
  - ip: 0.0.0.0
    port: 4140
3.2 服务发现

Linkerd默认使用基于文件的服务发现机制。它会在disco/目录中查找与目标具体名称对应的文件,这些文件应包含以主机端口形式分隔的地址列表。例如:

head disco/*
==> disco/thrift-buffered <==
127.0.0.1 9997
==> disco/thrift-framed <==
127.0.0.1 9998
==> disco/web <==
127.0.0.1 9999

当发送请求时,Linkerd通过HTTP头中的Host字段发现目标服务。例如:

$ curl -H "Host: web" http://localhost:4140/
3.3 弹性调用

可以使用Linkerd的failureAccrual配置实现对后端微服务的弹性调用:

- protocol: http
  label: io.l5d.consecutiveFailures
  dtab: /svc => /#/io.l5d.fs/service2;
  client:
    failureAccrual:
      kind: io.l5d.consecutiveFailures
      failures: 5
      backoff:
        kind: constant
        ms: 10000
  servers:
  - port: 4142
    ip: 0.0.0.0
  service:
    responseClassifier:
      kind: io.l5d.http.nonRetryable5XX
4. 是否使用服务网格
4.1 优点
  • 开发者可更专注于业务功能,多数通用功能在微服务代码外部实现且可复用。
  • 服务天生具备可观测性,无需服务开发者额外努力。
  • 对多语言服务友好,选择微服务实现语言时更自由。
  • 是一个集中管理的去中心化系统,多数功能可通过控制平面集中管理并推送到边车运行时。
4.2 缺点
  • 增加了微服务实现中的运行时实例数量,提高了复杂性。
  • 每个服务调用都要经过额外的一跳(通过服务网格边车代理)。
  • 只能解决部分微服务通信问题,对于复杂路由、转换/类型映射等问题仍需微服务业务逻辑解决。
  • 服务网格技术相对较新,大规模生产部署还不够成熟。
5. API与API管理
5.1 基本概念

任何想要向消费者(内部或外部)暴露的业务能力都可视为API,以可创建、管理、安全、分析和扩展的方式暴露这些业务能力的过程称为API管理。

5.2 API管理的主要组件
组件 描述
API Publisher 负责API的设计、开发、发布、部署、版本控制、治理、监控可用性和性能测量等。
API Developer Portal/Store 开发者可在此发现API、阅读文档、评级和评论API、订阅API、获取访问令牌并调用API。
API Gateway 处理API调用,进行QoS验证(如安全令牌验证、限流等)。
API Analytics/Observability 用于分析API的使用情况和性能。
API Monetization 实现API的货币化。
API Quality of service 提供安全、限流、缓存等服务质量保障。
5.3 API管理中的角色
  • API Creator/API Developer :技术人员,理解API的技术方面,使用API Publisher将API提供到API商店,但不能管理API生命周期。
  • API Publisher :管理企业或业务单元的一组API,控制API生命周期、订阅和货币化方面,关注API使用模式并可访问所有API统计信息。
  • Subscriber/Application Developer :使用API商店发现和使用API。
  • Admin :负责托管和管理API管理解决方案,包括创建用户角色、分配角色、管理数据库和启用安全等。
5.4 API管理的执行流程

API管理的典型执行流程从API Publisher开始,创建的API被推送到开发者门户(API Store)和API网关。消费者从API Store发现API并调用,调用请求直接到达API网关,网关进行QoS验证。

6. API发布者/API生命周期管理器

API提供者或创建者负责API的整个生命周期管理,包括设计、开发、发布、部署、版本控制、治理、监控可用性和性能测量等。API Publisher/Lifecycle Manager组件允许开发者开发、记录、扩展和版本化API,并提供API生命周期管理相关任务,如发布API、货币化、分析统计数据和推广。

综上所述,服务网格和API管理在微服务架构中都扮演着重要角色。服务网格简化了微服务间的通信和治理,而API管理则帮助企业更好地暴露和管理业务能力。但在使用时,需要充分考虑它们的优缺点,结合实际情况进行选择和应用。

服务网格与API管理:原理、应用与权衡

7. API开发者门户/API商店

API开发者门户,也被称为API商店,是开发者与API交互的重要平台。它为开发者提供了一个集中的场所,用于发现、了解和使用各种API。以下是其主要功能和作用:
- API发现 :开发者可以在门户中搜索和浏览不同的API,了解它们的功能、用途和适用场景。这有助于开发者快速找到满足自己需求的API。
- 文档阅读 :每个API都配有详细的文档,包括接口定义、参数说明、返回值格式等。开发者可以通过阅读文档,了解如何正确调用API。
- 评级和评论 :开发者可以对使用过的API进行评级和评论,分享自己的使用经验和反馈。这不仅有助于其他开发者选择合适的API,也能促使API提供者不断改进API的质量。
- 订阅API :开发者可以在门户中订阅感兴趣的API,并获取访问令牌。订阅过程通常比较简单,只需填写一些基本信息即可。
- 获取访问令牌 :访问令牌是调用API的凭证,开发者需要使用访问令牌来验证自己的身份。API开发者门户会为订阅者提供生成和管理访问令牌的功能。

8. API网关

API网关是API管理中的核心组件之一,它充当了API调用的入口点,负责处理所有的API请求。以下是API网关的主要功能:
- QoS验证 :API网关会对每个API调用进行QoS验证,包括安全令牌验证、限流、缓存等。例如,它会验证请求中的安全令牌是否有效,以确保只有授权的用户才能调用API;同时,它还可以根据预设的规则对请求进行限流,防止API被过度调用。
- 请求路由 :API网关会根据请求的URL和其他信息,将请求路由到相应的后端服务。它可以实现负载均衡,将请求均匀地分配到多个后端服务实例上,以提高系统的可用性和性能。
- 协议转换 :API网关可以将不同的协议进行转换,使得不同的客户端可以使用不同的协议来调用API。例如,它可以将HTTP请求转换为gRPC请求,以满足不同客户端的需求。
- 数据转换 :在请求和响应的过程中,API网关可以对数据进行转换。例如,它可以将JSON数据转换为XML数据,或者对数据进行加密、解密等操作。

9. API分析与可观测性

API分析与可观测性组件用于收集和分析API的使用数据,帮助企业了解API的性能和使用情况。以下是其主要功能:
- 数据收集 :该组件会收集API的各种使用数据,包括请求次数、响应时间、错误率等。这些数据可以帮助企业了解API的使用频率、性能瓶颈和潜在问题。
- 数据分析 :通过对收集到的数据进行分析,企业可以发现API的使用模式和趋势。例如,它可以分析出哪些API最受欢迎,哪些时间段API的使用量最大等。
- 性能监控 :API分析与可观测性组件可以实时监控API的性能,及时发现性能问题并发出警报。例如,当API的响应时间超过预设的阈值时,系统会自动发出警报,提醒管理员进行处理。
- 可视化展示 :为了方便管理员查看和分析数据,该组件通常会提供可视化的界面,将数据以图表、报表等形式展示出来。这样,管理员可以直观地了解API的使用情况和性能指标。

10. API货币化

API货币化是指通过API获取经济收益的过程。企业可以根据自己的业务需求和市场情况,选择不同的货币化模式。以下是一些常见的API货币化模式:
- 按使用量计费 :根据API的使用次数、数据量等指标进行计费。例如,企业可以按照每调用一次API收取一定的费用,或者按照每月使用的数据量收取费用。
- 订阅模式 :用户需要支付一定的订阅费用,才能在一定的时间内使用API。订阅模式通常分为不同的级别,每个级别提供不同的功能和服务。
- 免费增值模式 :企业提供免费的基本API服务,同时也提供一些高级功能和服务,用户需要支付额外的费用才能使用这些高级功能。
- 合作伙伴模式 :企业与合作伙伴合作,共同推广和销售API。合作伙伴可以通过销售API获得一定的佣金。

11. API服务质量

API服务质量是指API在可用性、性能、安全性等方面的表现。为了确保API的服务质量,企业需要采取一系列的措施。以下是一些常见的API服务质量保障措施:
- 安全保障 :API需要具备完善的安全机制,包括身份验证、授权、加密等。例如,使用OAuth 2.0协议进行身份验证,使用SSL/TLS协议对数据进行加密传输。
- 限流 :为了防止API被过度调用,企业需要对API的使用进行限流。限流可以根据请求的IP地址、用户ID等因素进行设置,确保每个用户或客户端的使用量在合理的范围内。
- 缓存 :缓存可以提高API的响应速度,减少后端服务的压力。企业可以对一些常用的数据进行缓存,当有相同的请求时,直接从缓存中获取数据,而不需要再次调用后端服务。
- 高可用性 :为了确保API的高可用性,企业需要采用冗余设计和负载均衡技术。例如,将API部署在多个服务器上,通过负载均衡器将请求均匀地分配到各个服务器上,当某个服务器出现故障时,其他服务器可以继续提供服务。

12. 总结

服务网格和API管理在现代微服务架构中都具有重要的价值。服务网格通过边车代理和中央控制平面,简化了微服务之间的通信和治理,提供了请求路由、弹性设计、故障注入、策略执行、可观测性和安全性等一系列功能。Istio和Linkerd是两种常见的服务网格实现,它们各有特点和优势。

API管理则帮助企业更好地暴露和管理业务能力,通过API Publisher、API Developer Portal/Store、API Gateway、API Analytics/Observability、API Monetization和API Quality of service等组件,实现了API的全生命周期管理。同时,API管理还涉及到多个角色,包括API Creator、API Publisher、Subscriber和Admin,每个角色都有其特定的职责和权限。

然而,在使用服务网格和API管理时,也需要充分考虑它们的优缺点。服务网格虽然提供了很多便利,但也增加了系统的复杂性和额外的开销;API管理虽然有助于企业更好地管理API,但也需要投入一定的人力和物力进行维护和管理。因此,企业需要根据自己的实际情况,权衡利弊,选择合适的技术和方案。

以下是服务网格和API管理的关键信息对比表格:
| 类别 | 优点 | 缺点 | 主要功能 |
| ---- | ---- | ---- | ---- |
| 服务网格 | 开发者专注业务、可观测性好、多语言友好、集中管理 | 复杂性高、增加额外调用、解决问题有限、技术不成熟 | 请求路由、弹性设计、故障注入、策略执行、可观测性、安全性 |
| API管理 | 暴露和管理业务能力、全生命周期管理 | 需要投入维护成本 | API设计、开发、发布、部署、版本控制、治理、监控、货币化、服务质量保障 |

mermaid流程图展示API管理的执行流程:

graph LR
    A[API Publisher] --> B[API Developer Portal/Store]
    A --> C[API Gateway]
    D[Consumer] --> B
    D --> C
    C --> E[Backend Service]

综上所述,服务网格和API管理是微服务架构中不可或缺的重要组成部分。企业在构建微服务架构时,应该充分利用它们的优势,同时也要注意规避它们的缺点,以实现高效、稳定和安全的微服务系统。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值