服务治理中的服务注册模式
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) 环境可以处理服务实例注册和注销。它还在每个集群主机上运行一个代理,该代理充当服务器端发现路由器的角色。
- 点赞
- 收藏
- 关注作者
评论(0)