101 : 反向代理

Service Mesh数据平面的核心组件是网关;网关的核心功能之一是反向代理。Flomesh遵循的是这里反向代理的定义:https://en.wikipedia.org/wiki/Reverse_proxy。

让我们看一下如何配置反向代理,以及Flomesh在基本的反向代理基础之上的一些企业级增强功能。

演示概述

这里有一个http://flomesh.cn/ok的URL,它返回的是一个简单的字符串“OK”。演示的例子是:在Flomesh里创建一个反向代理,对于任何访问Service Mesh的/ok路径的请求,都转发到http://flomesh.cn/ok。

在实际使用中,单独配置反向代理的情况并不多见。大多数时候,反向代理都和其他的元功能一起使用,实现流量的管理。

演示过程

  1. 登录系统

首先我们登录演示系统http://demo.flomesh.cn,用户密码都是admin。

  1. 选择Default Project

登录以后,从项目列表中单击选择Default Project。

小提示:在页面右上角大写A的地方,点击之后,可以切换界面的中英文

  1. 创建API

从左侧菜单中选择API,然后选择“创建一个新的API”:

create api

在弹出的窗口中填写API的名字,这里我们用“反向代理演示”

create api name

在Flomesh里,“API”的概念有清晰的界限和具体的指代:在Flomesh里,当我们访问一个URL的时候,对于访问者,他访问的是一个“API”。这个API会把请求转发到某个具体的HTTP服务实现(在这个例子里,是一个外部的服务提供方,http://demo.flomesh.io/ok)。

  1. 理解API详情页

点击刚刚创建的API,进入API的具体配置页面:

api

这个页面信息很多,让我们快速了解下:

  • 概要。点击API首先会进入“概要”页面,在这里可以看到实时的API访问统计信息,TPS、带宽、延迟等。右侧,是“近期活动”,这里会列出来和这个API相关的各种事件(Event),在Flomesh里,我们把Event和Activity作为一个概念
  • 生命周期。API在使用中,需要经过设计->审核->运行->停止服务,这样的一个生命周期。事实上,大多数关于API的配置都在这个页面。我们稍后看在“生命周期”里如何配置反向代理
  • 监控。当我们配置一个API的时候,我们通常希望对API的一些指标实现监控,比如“TPS超过了1000/秒”,比如“错误率超过5%”等等;同时如果这个API达到了这个设定的监控值(阈值),Flomesh会触发相应的操作,比如告警、扩容、熔断等。关于这些的配置,在“监控”页面里
  • 规格与文档。当我们讨论一个API的时候,通常我们可以用一些通用的文档来描述,比如Swagger;另外我们也常常用一些基本的文档用自然语言来描述API,这个就是“文档”,常见的方式是用Markdown
  • 订阅。当需要访问一个API的时候,我们可以设定API的访问规则。这个时候,访问者首先需要“订阅”这个API。关于这个的详细使用,在访问控制章节,我们会详细讲解
  • 活动。围绕一个API,会有很多操作需要记录下来,这些操作既可以是人的操作,也可以是自动触发的操作。这些被记录的事件,我们成为活动(activity)。Flomesh里,“活动”是一个通用概念
  • 资源。API描述的是逻辑层面的定义,在实际工作中,API需要落实到具体的执行载体上。举个例子,我们开发了一个order api,是一个spring boot fat jar,被部署在两个数据中心(高可用的原因),那么在两个数据中心的流量入口,我们都需要配置这个API,那么这里就涉及到了不同的“资源”。在页面的顶部菜单中,可以看到"分区(zone)"的列表,资源是物理上存在的,是属于某个特定分区的。当我们部署一个API之后,这个API涉及的物理配置,都会在“资源”页面展示和管理

点击“生命周期”标签页,进入反向代理配置页面。

  1. 配置Provider

首先我们简单了解下“生命周期”页面:

api life cycle

  • 首先可以看到“1设计-2审核-3运行-4停止”这些信息,这里描述的是API在生命周期中的某个阶段,Flomesh把API生命周期分为4个阶段(实际上这个部分是可以配置的,具体的实现是一个简单的工作流引擎)
    • 1设计。API在设计阶段,所有的配置都是在控制平面,并没有实际下发到数据平面执行。也就是没有实际配置到网关上
    • 2审核。在完成设计以后,API设计者可以提交做审核
    • 3运行。在审核通过以后,API进入运行状态,这个时候是实际部署在网关上
    • 4停止。当我们不再需要某个API工作的时候,我们可以把这个API做sunset,就是停止服务
    • 在这些生命周期的阶段之间,API是可以根据需要变化所处阶段的。比如:一个运行中的API,如果需要修改某个参数,那么需要重新回到设计阶段,重新审批;同时会生成新的API版本
    • Flomesh对API做了基于角色的权限管理,管理员可以给不同登录的用户设置不同的角色,进而实现不同的权限。比如某个用户只能做设计;某个用户只能做审批,等等
    • 生命周期背后,是一个工作流引擎和权限控制系统
  • "配置的分区"。这里有一个加号“+”,Flomesh被设计成在跨越多个网关协调管理流量。基于此,Flomesh可以在多个分区上协调配置一个API。举个例子:API的配置需要修改DMZ网关的设置,也需要修改微服务网关的设置,这个时候,可以点击加号,配置这个API需要在哪些网关上做设置
  • 下边是个左中右三列的编辑区,分别是:
    • 访问端点配置区。Flomesh为API提供了多种入口条件,这些条件我们称为“访问端点”,就是End Point。比如一个API在数据中心1里,通过/order访问;而在数据中心2里,通过order.example.com来访问
    • 访问策略配置区。如果我们希望对一个API进行访问控制,比如身份验证、限流、流量复制、缓存等,这些在Flomesh中称为“访问策略”,响应的配置在这个区
    • 服务提供方配置区。API是一个接口,需要具体的服务提供方,提供方的配置,在这里

在“反向代理”这个例子中,我们只需要配置服务提供方和访问端点就可以。其他复杂的配置,我们在另外的章节里描述。

点击"添加服务提供者",弹出服务提供者编辑窗口:

api provider host

在这个弹出窗口中,我们在“主机”的标签页里,填写名字和主机域名。其他两个标签页--服务和分区,我们在另外的例子中介绍。

  • 主机,适用与API的提供者在某个域名下。一种常见的情况是,API的提供者是外部的资源,比如天气服务由api.weather.com提供
  • 服务,稍后我们介绍服务。服务是Flomesh的一个重点,组织内部需要互通的服务,都会在Flomesh上有呈现
  • 分区,分区适用的场景很有趣:假设某个请求到达一个分区后,这个分区的网关无法转发请求到服务提供方(比如网关和服务提供方不在一个网络内,类似kubernetes容器网络),这个时候,请求应该被转发到另外的一个分区的网关,比如转发到kubernetes的ingress的入口网关。这很像传统网络中的路由,IP包通过多个路由器转发,最终达到目的地。是的,Flomesh的设计就是参考了传统网络里的路由器的机制和原理

点击“添加服务提供者”按钮,保存,这时候页面看起来是这样的:

api provider

这时候,我们能够看到右侧有了刚刚配置的服务提供者。接下来我们配置访问端点。

  1. 配置访问端点

演示环境的Flomesh包含了两个流量的入口,也就是两个zone,分别是spring和dubbo,注意我们用这两个分区所在微服务的技术作为名字;这个名字和网关本身并没有任何关联,只是为了记忆方便。在反向代理这个例子中,我们首先配置流量从spring的入口进入。点击“添加访问端点”,这里我们只添加最简单的信息--“路径”,这里填写"/ok"。另外注意我们把strip path关闭:

api end point

保存配置,这个时候API页面看起来是这样的,注意多了左侧刚刚添加的访问端点:

api end point added

  1. 配置分区

当我们配置了API之后,我们需要指定这个API被部署到那个分区,也就是部署到哪些网关集群上。点击“配置的分区”右侧的加号:

api add zone

这里我们选择spring,注意,这个名字是说“添加到名字叫做spring的网关上”。

  1. 审核

接下来,我们点击“审核”按钮。在完成了配置工作后,配置需要被审核,然后才能实际部署到网关上。点击审核之后的页面这样:

api reviewed

  1. 部署

接下来点击“部署”。结果页面是这样的:

api deployed

这个时候,API就被部署到了名字叫做“spring”的网关上。感兴趣的可以到“资源”的页面看下部署结果。现在,我们定义的“反向代理演示”API就可以工作了。我们来验证一下。

  1. 验证

我们使用curl 来访问demo环境的网关(主要网关的入口地址在http://demo.flomesh.io:30001):

[root@centos ~]# curl -i http://demo.flomesh.cn:30001/ok
HTTP/1.1 200 OK
Content-Type: application/octet-stream
Content-Length: 3
Connection: keep-alive
Server: nginx/1.14.2
Date: Sat, 19 Oct 2019 16:44:25 GMT
Last-Modified: Mon, 09 Sep 2019 13:41:56 GMT
ETag: "5d7656a4-3"
Accept-Ranges: bytes
X-Kong-Upstream-Latency: 20
X-Kong-Proxy-Latency: 122
Via: kong/1.2.2

ok
  1. 部署的结果

感兴趣的可以看下“资源”页面部署的具体结果;也可以在顶部的“分区”菜单中选择“spring”来查看配置。看到页面应该是这样的:

api resource

还有这样:

api zone