如何快速构建服务发现的高可用能力

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 本文是阿里云微服务引擎MSE在服务发现高可用的最佳实践介绍。

本文是阿里云微服务引擎MSE在服务发现高可用的最佳实践介绍。

背景

本文是阿里云微服务引擎MSE在服务发现高可用的最佳实践介绍。演示的应用架构是由后端的微服务应用实例(Spring Cloud)构成。具体的后端调用链路有Spring Cloud Consumer调用Spring Cloud Provider,这些应用中的服务之间通过Nacos注册中心实现服务注册与发现。

动手实践

前提条件

准备工作

开启MSE微服务治理

  1. 开通微服务治理专业版:

  1. 单击开通MSE微服务治理

  2. 微服务治理版本选择专业版,选中服务协议,然后单击立即开通。关于微服务治理的计费详情,请参见价格说明

  1. 安装MSE微服务治理组件:

  1. 容器服务控制台左侧导航栏中,选择市场 > 应用目录

  2. 应用目录页面搜索框中输入ack-mse-pilot,单击搜索图标,然后单击组件。

  3. 详情页面选择开通该组件的集群,然后单击创建。安装完成后,在命名空间mse-pilotmse-pilot-ack-mse-pilot应用,表示安装成功。

  1. 为应用开启微服务治理:

  1. 登录MSE治理中心控制台

  2. 在左侧导航栏选择微服务治理中心 > K8s集群列表

  3. K8s集群列表页面搜索目标集群,单击搜索图标,然后单击目标集群操作列下方的管理

  4. 集群详情页面命名空间列表区域,单击目标命名空间操作列下方的开启微服务治理

  5. 开启微服务治理对话框中单击确认

部署 Demo 应用程序

  1. 容器服务控制台左侧导航栏中,单击集群

  2. 集群列表页面中,单击目标集群名称或者目标集群右侧操作列下的详情

  3. 在集群管理页左侧导航栏中,选择工作负载 > 无状态

  4. 无状态页面选择命名空间,然后单击使用YAML创建资源

  5. 对模板进行相关配置,完成配置后单击创建。本文示例中部署sc-consumer、sc-consumer-empty、sc-provider,使用的是开源的Nacos。

部署示例应用(springcloud)

YAML:

# 开启推空保护的 sc-consumer
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-consumer
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sc-consumer
  template:
    metadata:
      annotations:
        msePilotCreateAppName: sc-consumer
      labels:
        app: sc-consumer
    spec:
      containers:
      - env:
        - name: JAVA_HOME
          value: /usr/lib/jvm/java-1.8-openjdk/jre
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server:8848
        - name: profiler.micro.service.registry.empty.push.reject.enable
          value: "true"
        image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1
        imagePullPolicy: Always
        name: sc-consumer
        ports:
        - containerPort: 18091
        livenessProbe:
          tcpSocket:
            port: 18091
          initialDelaySeconds: 10
          periodSeconds: 30
# 无推空保护的sc-consumer-empty
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-consumer-empty
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sc-consumer-empty
  template:
    metadata:
      annotations:
        msePilotCreateAppName: sc-consumer-empty
      labels:
        app: sc-consumer-empty
    spec:
      containers:
      - env:
        - name: JAVA_HOME
          value: /usr/lib/jvm/java-1.8-openjdk/jre
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server:8848
        image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-consumer-0.1
        imagePullPolicy: Always
        name: sc-consumer-empty
        ports:
        - containerPort: 18091
        livenessProbe:
          tcpSocket:
            port: 18091
          initialDelaySeconds: 10
          periodSeconds: 30
# sc-provider
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: sc-provider
spec:
  replicas: 1
  selector:
    matchLabels:
      app: sc-provider
  strategy:
  template:
    metadata:
      annotations:
        msePilotCreateAppName: sc-provider
      labels:
        app: sc-provider
    spec:
      containers:
      - env:
        - name: JAVA_HOME
          value: /usr/lib/jvm/java-1.8-openjdk/jre
        - name: spring.cloud.nacos.discovery.server-addr
          value: nacos-server:8848
        image: registry.cn-hangzhou.aliyuncs.com/mse-demo-hz/demo:sc-provider-0.3
        imagePullPolicy: Always
        name: sc-provider
        ports:
        - containerPort: 18084
        livenessProbe:
          tcpSocket:
            port: 18084
          initialDelaySeconds: 10
          periodSeconds: 30
# Nacos Server
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nacos-server
spec:
  replicas: 1
  selector:
    matchLabels:
      app: nacos-server
  template:
    metadata:
      labels:
        app: nacos-server
    spec:
      containers:
      - env:
        - name: MODE
          value: standalone
        image: nacos/nacos-server:latest
        imagePullPolicy: Always
        name: nacos-server
      dnsPolicy: ClusterFirst
      restartPolicy: Always

# Nacos Server Service 配置
---
apiVersion: v1
kind: Service
metadata:
  name: nacos-server
spec:
  ports:
  - port: 8848
    protocol: TCP
    targetPort: 8848
  selector:
    app: nacos-server
  type: ClusterIP

我们只需在Consumer增加一个环境变量profiler.micro.service.registry.empty.push.reject.enable=true,开启注册中心的推空保护(无需升级注册中心的客户端版本,无关注册中心的实现,支持MSE 的 nacos、eureka以及自建的nacos、eureka、console)

分别给Consumer应用增加SLB用于公网访问

image.png image.png

以下分别使用{sc-consumer-empty}代表sc-consumer-empty应用的slb的公网地址,{sc-consumer}代表sc-consumer应用的slb的公网地址

应用场景

下面通过上述准备的Demo来分别实践以下场景

架构图_4-8-1 第四章第八节第一张图.jpg
  • 编写测试脚本

vi curl.sh

while :
do
        result=`curl $1 -s`
        if [[ "$result" == *"500"* ]]; then
                echo `date +%F-%T` $result
        else
                echo `date +%F-%T` $result
        fi

        sleep 0.1
done
  • 测试,分别开两个命令行,执行如下脚本,显示如下

% sh curl.sh {sc-consumer-empty}:18091/user/rest

2022-01-19-11:58:12 Hello from [18084]10.116.0.142!

2022-01-19-11:58:12 Hello from [18084]10.116.0.142!

2022-01-19-11:58:12 Hello from [18084]10.116.0.142!

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

% sh curl.sh {sc-consumer}:18091/user/rest

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

2022-01-19-11:58:13 Hello from [18084]10.116.0.142!

2022-01-19-11:58:14 Hello from [18084]10.116.0.142!

2022-01-19-11:58:14 Hello from [18084]10.116.0.142!

2022-01-19-11:58:14 Hello from [18084]10.116.0.142!

并保持脚本一直在调用,观察mse控制台分别看到如下情况

image.png

image.png

  • 将coredns组件缩容至数量 0,模拟 dns 网络解析异常场景

image.png

发现实例与nacos的连接断开且服务列表为空

image.png

  • 模拟dns服务恢复,将其扩容回数量2

image.png

结果验证

在以上过程中保持持续的业务流量,我们发现 sc-consumer-empty 服务出现大量且持续的报错

2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.597+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}

2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.799+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}

2022-01-19-12:02:37 {"timestamp":"2022-01-19T04:02:37.993+0000","status":500,"error":"Internal Server Error","message":"com.netflix.client.ClientException: Load balancer does not have available server for client: mse-service-provider","path":"/user/feign"}

image.png

相比之下,sc-consumer 应用全流程没有任何报错

image.png

  • 只有重启了Provider,sc-consumer-empty 才恢复正常

image.png

相比之下,sc-consumer 应用全流程没有任何报错

image.png

保障云上业务的永远在线,是 MSE 一直在追求的目标,本文通过面向失败设计的服务发现高可用能力的分享,以及MSE的服务治理能力快速构建起服务发现高可用能力的演示,模拟了线上不可预期的服务发现相关异常发生时的影响以及我们如何预防的手段,展示了一个简单的开源微服务应用应该如何构建起服务发现高可用能力。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
8月前
|
消息中间件 Kafka Apache
微服务消息驱动:构建弹性、可扩展的分布式应用
在当今的软件开发世界中,微服务架构已经成为了构建大型应用的流行方式。随着应用规模的不断扩大,微服务架构引入了一些挑战,其中之一是确保各个微服务之间的通信高效、可靠和可扩展。微服务消息驱动架构应运而生,它为解决这些挑战提供了强大的工具和方法。
|
9月前
|
负载均衡 Cloud Native 数据库
构建高可用的云原生微服务架构:实现弹性和可扩展性
随着云计算技术的快速发展,云原生微服务架构成为了现代应用开发领域中的一种重要范式。它通过利用云服务提供的弹性和可扩展性,为企业构建高可用的、面向未来的应用程序。本文将探讨云原生微服务的概念、核心原则以及一些关键技术,帮助您设计和构建具有弹性和可伸缩性的架构。
820 1
|
存储 Prometheus 监控
高可用prometheus集群方案选型分享
高可用prometheus集群方案选型分享
5422 2
高可用prometheus集群方案选型分享
|
1天前
|
XML 负载均衡 数据库
构建高性能微服务架构:挑战与策略
【5月更文挑战第17天】 在当今的软件开发领域,微服务架构已成为实现系统模块化和解耦的重要手段。它允许开发团队独立地开发、部署和扩展应用的各个部分,从而提高了整体系统的灵活性和可维护性。然而,随着服务的增多和分布式环境的复杂性提升,确保这些微服务高效运作面临着不少挑战。本文将探讨在构建高性能微服务架构时常见的问题,并提出一系列解决策略,以帮助开发者优化其系统性能和稳定性。
|
3天前
|
监控 数据库 开发者
构建高效可靠的微服务架构:策略与实践
【5月更文挑战第11天】在当今软件开发的世界中,微服务架构已经成为构建可扩展、灵活且容错的系统的首选方法。本文深入探讨了设计、部署和维护微服务系统时面临的挑战,并提出了一系列实用的策略和最佳实践。我们将从服务的划分原则出发,讨论如何确保每个微服务的自治性,以及如何通过容器化和编排技术实现服务的高效运行。文章还将涉及监控、日志记录和故障恢复的策略,旨在帮助开发人员构建一个既高效又可靠的微服务环境。
13 1
|
3天前
|
消息中间件 敏捷开发 运维
构建高性能微服务架构:策略与实践
【2月更文挑战第27天】 在当今快速迭代和持续部署的软件发展背景下,微服务架构因其灵活性、可扩展性和技术异构性的优势而成为众多企业的首选架构模式。然而,随之而来的复杂性管理和性能优化问题也不容忽视。本文深入探讨了构建高性能微服务架构的策略与实践,包括服务拆分原则、通信机制、数据一致性保障以及监控和故障处理等方面。通过分析具体案例和最佳实践,旨在为开发者提供一个清晰、高效的微服务性能优化路径。
|
3天前
|
存储 缓存 负载均衡
服务治理和分布式 基础
服务治理和分布式 基础
|
8月前
|
负载均衡 算法 微服务
服务发现:构建弹性微服务体系的关键组件
在微服务架构中,服务发现是实现弹性、高可用性和负载均衡的关键组件之一。本博客将深入探讨服务发现的概念、重要性以及如何有效地在微服务环境中使用它。
|
缓存 Kubernetes 监控
服务发现与配置管理高可用最佳实践
本篇是微服务高可用最佳实践系列分享的开篇,系列内容持续更新中,期待大家的关注。
服务发现与配置管理高可用最佳实践
|
缓存 运维 容灾
服务发现与配置管理高可用最佳实践|学习笔记(二)
快速学习服务发现与配置管理高可用最佳实践
224 0
服务发现与配置管理高可用最佳实践|学习笔记(二)