服务发现及其云服务【玩转华为云】
【摘要】 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 处于模式中,当客户端想要请求此服务时,可以将其用作主机域。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 小结
参考服务发现实践
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)