全部产品
云市场

部署多语言微服务应用

更新时间:2019-08-07 22:59:57

随着 Python、Node.js 等语言的快速发展,多语言微服务应用越来越多。EDAS 能够通过服务网格支持部署多语言微服务应用,且提供应用托管和服务发现、链路追踪、负载均衡等服务治理能力。本文将通过一个示例介绍如何使用 EDAS 部署多语言微服务应用。

背景信息

应用从最初的单体架构演变到目前的微服务架构,在带来便利的同时也大大增加了服务部署、运维的复杂度。而微服务本身可以是任意语言开发的,在部署多语言服务后,如何对多语言的微服务提供通用的链路追踪、服务发现、负载均衡等能力,一种做法是提供多语言的 SDK,一种是服务网格。SDK 对应用有侵入性,而服务网格在无侵入性的同时也能提供服务发现、负载均衡、链路追踪等能力,EDAS 对多语言的支持正是采用的后者——服务网格。

服务网格是致力于解决服务间通讯的基础设施层。它负责在现代云原生应用程序的复杂服务拓扑中可靠地传递请求,通常是通过一组轻量级网络代理,与应用程序部署在一起来实现,而无需感知应用程序本身。

服务网格的价值和接入成本

  • 价值

    现在的服务基本上都是多实例部署的,天然需要服务发现、负载均衡、链路跟踪能力,部署应用时根据代码填写服务的服务名和服务端口,EDAS 的服务网格会依据这两个信息自动完成服务注册,而用户在代码中使用http://服务名:服务端口发起访问时,服务网格会从请求中解析出服务名,完成服务发现、负载均衡和链路追踪。

  • 接入成本

    应用 A 提供了 test 服务,通常我们会采用域名或者 IP 的方式访问,如http://test.com:8080/或者 http://xx.xx.xx.xx:8080。使用服务网格后,原部署服务的实例就可以抽象成为一个服务,仍以 test 为例,假设服务名与端口号分别为my-test-service8080,在服务代码中将调用格式修改为http://服务名:服务端口,如http://my-test-service:8080,然后将服务 my-test-service 以镜像方式部署时启用服务网格,并设置服务名(my-test-service)和端口号(9080),就完成了接入。

示例场景说明

示例应用 BookInfo 模仿在线书店的一个分类,显示一本书的信息。页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。

Bookinfo 是一个异构应用,几个微服务应用是由不同的语言编写的。这些服务构成了一个有代表性的服务网格的例子:它由多个服务、多个语言构成,并且 reviews 服务具有多个版本。微服务架构如下:

BookINFO 服务架构

Bookinfo 应用包含四个单独的服务:

  • productpage :为 Python 服务,会调用 details 和 reviews 两个服务,用来生成页面。同时,productpage 还包含登入和登出功能。

  • details :为 Ruby 服务,包含了书籍的信息。

  • reviews :为 Java 服务,包含了书籍相关的评论。它还会调用 ratings 服务。

  • ratings :为 Node.js 服务,包含了由书籍评价组成的评级信息。包含 3 个版本:

    • v1 版本不会调用 ratings 服务。
    • v2 版本会调用 ratings 服务,并使用 1 到 5 个黑色星形图标来显示评分信息。
    • v3 版本会调用 ratings 服务,并使用 1 到 5 个红色星形图标来显示评分信息。

前提条件

如果想在 EDAS 部署多语言微服务应用,您需要先完成以下工作:

  • 将示例应用制作成镜像,并上传到阿里云镜像仓库。上传镜像请参见上传本地镜像

    示例应用下载地址:BookInfo Sample

  • 创建并导入容器服务 Kubernetes 集群

    • 创建集群时,需要开通公网访问功能,即勾选使用 EIP 暴露 API Server
    • 需要确保 Kubernetes 版本为 1.8.4,且该集群中未安装任何服务网格组件。
  • 开通 Tracing Analysis 服务(公测期,暂时免费)。

    如提前没有开通,在集群内安装服务网格时会提示未开通 Tracing Analysis 服务,需要开通。

    说明

    本文以 BookInfo 的示例向您介绍如何部署,而实际使用时您要部署的是您自己的应用(而且很可能是微服务架构),所以,在部署您还需要对您的服务做以下规划和开发:

    • 如果部署多个服务,请保证每个服务的服务名是唯一的。因为在 EDAS 中同一个命名空间中服务名不能重复,以保证能被其它服务调用。

    • 如果部署的多个服务存在调用关系,在调用者的服务中需要修改按以下格式修改调用代码:

      http://<提供者的服务名>:<提供者的服务端口>

步骤一:为容器服务 K8s 集群安装服务网格

  1. 登录 EDAS 控制台。

  2. 在左侧导航栏选择资源管理 > 集群

  3. 集群页面选择您导入容器服务 K8s 集群的地域命名空间,单击容器服务 K8s 集群页签,再单击之前导入的容器服务 K8s 名称。

  4. 在集群详情页面最下方的服务网络区域单击安装服务网格

  5. 在弹出的确认对话框中单击确定

    确认对话框会提示执行中,然后消失,集群详情页面顶部显示服务网格安装中。等待约 1 分钟,当服务网格安装中消失后,说明安装完成。

  6. 单击服务网格区域右侧的展开服务网格按钮按钮,展开服务网格区域,查看组件版本组建健康状况跟踪采样率

    查看服务网格

步骤二:部署应用

您需要将场景示例中的几个服务以应用的形式分别部署到 EDAS 中。下面介绍单个服务的部署过程。

说明:多语言应用目前仅支持使用镜像部署。

  1. 登录 EDAS 控制台。

  2. 在左侧导航栏选择应用管理 > 应用列表,在应用列表页面右上角单击创建应用

  3. 应用基本信息页面设置应用参数,然后单击下一步

    应用基本信息

    基本参数说明:

    • 命名空间:在左侧下拉选择框选择地域;在右侧下拉选择框选择命名空间,如果不做选择命名空间则设置为默认
    • 集群类型:在左侧下拉选择框中选择集群类型为 容器服务 K8S 集群,右侧下拉选择框内选择具体的集群。
    • K8S Namespace:K8S Namespace 通过将系统内部的对象分配到不同的 Namespace 中,形成逻辑上分组的不同项目、小组或用户组,便于不同的分组在共享使用整个集群的资源的同时还能被分别管理。
      • default:没有其他命名空间的对象的默认命名空间。
      • kube-system:系统创建的对象的命名空间。
      • kube-public:此命名空间是自动创建的,并且可供所有用户(包括未经过身份验证的用户)读取。
      • istio-system:部署服务网格后系统自动创建的命名空间。
    • 应用名称:输入应用名称。
    • 应用描述:填写应用的基本情况。
  4. 应用配置页面勾选应用部署方式镜像,并选择您之前上传的的服务镜像。

    选择镜像

  5. 设置 Pod。

    Pod 是应用最小的部署单元。应用可以有多个 Pod,在负载均衡下,请求会被随机分配给某个 Pod 处理。

    设置 Pod

    1. 设置 Pod 总数

      Pod 在运行失败或出现故障时,可以自动重启或者快速迁移,保证应用的高可用。有状态应用如果使用了持久化存储,能保存实例数据;无状态应用重新部署时不保存实例数据。您最多可以设置 Pod 总数为 50 。

    2. 设置单 Pod 资源配额

      系统默认不做配额限制,即单 Pod 的 CPU 和 Memory 显示为 0。如果需要限制配额,请填设置数字。

  6. 启动命令环境变量持久化存储本地存储应用生命周期管理都为可选设置。需要您需要设置,请参见在容器服务 K8S 集群中部署应用(镜像)中的参数说明。

  7. 设置服务网格。

    设置服务网格

    • 服务网格:启用服务网格。

    • 服务名:应用提供的服务名,要和应用代码中的服务名一致,以保证服务能成功注册和被调用。本示例 Demo 中的 4 个服务的服务名分别为 productpagedetailsratingsreviews。如果部署您自己的服务,请填写服务代码中的服务名。

    • 服务端口:应用提供的服务端口,要和应用代码中的服务端口一致,以保证服务能成功注册和被调用。本示例 Demo 中的 4 个服务的服务端口号均为 9080。如果部署您自己的服务,请填写服务代码中的服务端口。

  8. 设置完成后,单击确认创建

    应用创建可能需要几分钟,创建过程中,可以通过查看应用变更跟踪创建的过程。

    在容器服务 Kubernetes 集群中应用创建完成即部署完成。创建完成后,返回应用详情页面查看实例部署信息中 Pod 状态若为正常运行则说明应用部署成功。

(可选)步骤三:启用公网访问

如果服务需要被公网访问,需要开启并设置公网访问。本示例中,主服务 productpage 需要设置公网访问。

  1. 在应用详情页应用设置区域启用公网访问

  2. 设置公网访问路径

    说明

    • 服务名是在部署时设置的,不可修改。

    • 服务端口也是在部署时设置的,可以修改。不过在本示例中统一为9080,不可修改。

    • 公网 IP公网端口是在为容器服务 K8s 集群安装服务网格时 EDAS 通过 SLB 为集群自动分配的,不可修改。

    • 公网访问路径:由于在安装服务网格时,系统为该集群分配了公网 IP 和端口,所以该集群中部署的服务需要使用路径区分。在本示例中,仅主服务需要被公网访问,需要分别设置 productpage 的访问、登入、登出服务的访问路径:分别为:

      • 访问:/productpage
      • 登入:/login
      • 登出:/logout

      说明:如果部署您自己的服务,请按服务代码填写实际的访问路径。

结果验证

在将 4 个应用都部署完成后,访问主服务,页面上会显示一本书的描述,书籍的细节(ISBN、页数等),以及关于这本书的一些评论。同时还能进行登入、登出操作。

  1. 在浏览器的地址栏中输入http://<公网 IP>:<公网端口><主服务路径>,如 http://xxx.xxx.xxx.xxx:80/productpage,然后回车。

    主服务页面

    页面可以访问,且 Book Details(书籍的细节)和 Book Reviews(评论)两个区域可以正常显示。说明主服务 productpage、子服务 datails 和 子服务 reviews 都正常。

  2. 单击 Sign in,在弹出的对话框中输入用户名和密码(均为 admin),然后单击 Sign in,登录成功。

    主服务页面-登录

  3. 登录后,单击 Sign out,可以正常登出。

后续操作

在服务部署完成后,您还可以通过 EDAS 控制台监控服务的运行状态,在遇到问题是可以通过日志进行诊断。

  • 监控:您可以通过 EDAS 集成的 Tracing Analysis (需要开通,暂时免费)在应用详情页监控应用,查看调用链信息。具体功能(应用总览、应用详情和接口调用)的详细使用方式请参见 Tracing Analysis 中的相关文档。
  • 日志:您可以通过 EDAS 的日志管理功能查看容器的标准日志和业务日志。详情请参见实时日志业务日志