服务网格与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管理是微服务架构中不可或缺的重要组成部分。企业在构建微服务架构时,应该充分利用它们的优势,同时也要注意规避它们的缺点,以实现高效、稳定和安全的微服务系统。
超级会员免费看
612

被折叠的 条评论
为什么被折叠?



