高端黑科技系列一:新一代微服务与新一代API管理的集成

文章导读

版权说明:本文书写过程中参照了红帽的技术文档;本系列文章中的部分测试代码为红帽公司版权所有,因此不能提供源码文件。

  • 本文的内容仅限于技术探讨,不能作为指导生产环境的素材;
  • 笔者鼓励读者购买红帽培训获得更多系统性的培训。
  • 本文分为系列文章,将会有多篇,初步预计将有5篇。

一、环境展现

Openshift 3.10,Istio1.0:

istio以容器的方式,运行在Openshift的项目中:

登录Openshift console:

实验中用到的应用:

实验中使用的后端业务服务将是一个名为Catalog Service的简单应用程序。

实验室环境中包含的CoolStore Catalog服务连接到MongoDB数据库。这个MongoDB数据库由Kubernetes使用OpenShift DeploymentConfig而不是Kubernetes Deployment进行管理。这样做的原因是OpenShift DeploymentConfig提供了比Kubernetes部署更多的功能。

测试应用的API:

调用Open API Swagger访问应用

OpenAPI规范(以前称为“Swagger规范”)是REST API的API描述格式。 Swagger是一套围绕OpenAPI规范构建的开源工具,可以帮助我们设计、构建、记录和使用REST API。

Swagger文档可用于目录微服务的REST端点:

二、API管理与Istio对比

实验室环境中安装了API Manager。

登录API Manager环境的管理门户,如下所示:

  • API管理促进API使用者和生产者之间的关系。 它降低了交易成本(即:搜索成本,价格发现,警务和执行成本等),否则会阻碍API消费者和生产者之间的互利交换。 通常情况下,这些API生产者和消费者并不亲自相互了解。
  • 服务网格提供了促进微服务架构(MSA)所需的技术弹性和可观察性。

本实验的目的是探讨这两种技术如何相互补充。

下表提供了API Management和Service Mesh之间的功能比较:

在实验中,将配置受支持的3scale API Gateway版本来管理CoolStore目录服务。

API网关将从预先存在的3scale多租户环境中检索代理服务配置。

创建两个API网关:

然后将应用与API集成:

创建服务:

创建应用计划

应用程序计划为API定义访问策略。

创建应用程序

在本节中,将应用程序与API使用者帐户相关联。 这将根据先前在应用程序计划中定义的详细信息为应用程序生成用户密钥。 用户密钥用作HTTP请求的查询参数,以通过内部部署API网关调用业务服务。

Stage服务整合

在API Manager管理员门户中,选择API。从catalog_service中,选择Application Plans。

对于catalog_app_plan并单击Publish链接:

然后进行应用集成:

集成成功。

三、使用启用了stio的路由替代API网关

截至到目前,实验环境现包含API Manager 2.2功能管理的目录RESTful服务。

本小节中,使用Istio的Envoy sidecar代理注入的API网关(把默认API网关绕开了):

在上图中,请注意新pod的引入:prod-apicast-istio。 通过API网关生产路线和服务的 Ingress现在被引导到注入了Istio sidecar的这个新的API Gateway。

prod-apicast-istio pod中的Envoy sidecar将与istio-system命名空间中的服务网格控制平面功能互操作。

API网关将继续使用其$THREESCALE_PORTAL_ENDPOINT环境变量的值从预配置的多租户API Manager中提取服务代理配置。

注入Istio

检索当前API网关生产部署的yaml表示形式:

部署一个启用了Istio的API网关生产网关:

修改prod-apicast服务以路由到新的启用了Istio的apicast

确保设置了$CATALOG_USER_KEY环境变量:

在prod-apicast-istio接管了服务以后,再度发起curl请求,失败:

回应是HTTP 404,原因如下:

启用了Istio的API网关无法连接到API Manager(参数:$THREESCALE_PORTAL_ENDPOINT)

API网关需要执行此操作,以从API Manager检索所有策略管理配置数据。而API网关无法连接到3scale API Manager的原因是:$THREESCALE_PORTAL_ENDPOINT引用了外部Internet URL。 默认情况下,Istio会阻止所有对Internet的出站请求。 在下一节中,将定义一个出口路由,以允许API网关与API Manager进行通信。

四、部署自定义的Egress Route规则

在本节中,创建一个自定义Istio ServiceEntry,它允许API网关连接到API Manager.

什么是 ServiceEntry?

Istio 内部会维护一个服务注册表,可以用 ServiceEntry 向其中加入额外的条目。通常这个对象用来启用对 Istio 服务网格之外的服务发出请求。例如下面的 ServiceEntry 可以用来允许外部对 *.foo.com 域名上的服务主机的调用。

实验中,为API网关配置文件创建自定义Istio Egress路由:

请注意,spec - > hosts的值设置为3scale API网关中指定的$ THREESCALE_PORTAL_ENDPOINT的相同值。

这应该允许API网关连接到API Manager的系统提供程序服务的路由。

加载新的出口规则:

查看新的ServiceEntry

现在已添加自定义出口路由,API网关能够从API管理器中提取配置数据。

使用如下命令验证启用了Istio的API网关现在可以轮询API Manager以获取代理服务配置信息

使用curl实用程序,重新尝试通过启用istio的API网关检索目录数据的请求。

这次,我们在响应中看到目录数据。 此请求现在流经启用了istio的API网关。

五、部署Istio Ingress网关

到目前为止,进入生产API网关的Ingress流量是通过Openshift集成的、基于HAProxy的OCP路由器实现的。

Openshift的Router缺乏与Jaeger和Promtheus等服务网格可观察性工具的集成。 Istio包含一个实现这些附加功能的 Ingress 网关。

在本实验的这一部分中,使用Istio Ingress替代Openshift的Router。

创建一个环境变量,该变量定义的是API Manager中配置的目录服务的Production Public Base URL:

$ CATALOG_API_GW_HOST的值将在作为HTTP HOST头的Istio ingress网关的请求中指定。 它应该与API Manager中的目录服务中配置的内容相匹配。

创建定义 ingress gateway配置文件:

创建路由:

创建 virtual service的文件:

在OCP中创建 virtual service:

设置反映Istio Ingress网关服务的主机和端口的环境变量:

通过新配置的Istio Ingress Gateway对目录数据的请求进行冒烟测试:

请注意使用HTTP Host标头。

如果此HOST标头包含在请求中,但其值(以及网关和虚拟服务中的主机属性)与API Manager中目录服务的Production Public Base Url不匹配,会发生什么?

之前的冒烟测试,使用了本地网络上提供的$INGREGRESS_HOST和$ INGRESS_PORT。 使用这个本地$INGRESS_HOST只能工作,因为你的curl客户端恰好与openshift位于同一台机器上。

istio-system命名空间提供了一个名为:istio-ingress gateway的路由。 与所有OCP路由一样,它暴露给外部客户端。

尝试通过此istio-ingress gateway路由调用API网关,而不是使用与内部服务网格相关的$ INGRESS_HOST和$ INGRESS_PORT。 结果是一样的。

要使用的curl命令如下:

curl -v \ -HHost:$CATALOG_API_GW_HOST \ `echo "http://"$(oc get route istio-ingressgateway -n istio-system -o template --template {{.spec.host}})"/products?user_key=$CATALOG_USER_KEY"`

原文发布于微信公众号 - 大魏分享(david-share)

原文发表时间:2018-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Ryan Miao

Linux文件属性,权限和修改文件权限,所属者和所属组

剩下的三组主要由[rwx]组成,r-read, w-write, x-execute, [-]表示占位符,即没权限。

1033
来自专栏黑白安全

中间件漏洞与防护

中间件漏洞可以说是最容易被web管理员忽视的漏洞,原因很简单,因为这并不是应用程序代码上存在的漏洞,而是属于一种应用部署环境的配置不当或者使用不当造成的 我们...

2063
来自专栏杂文共赏

如何构建NodeJS微电影服务并使用docker部署

在本系列中,我们将构建一个基于NodeJS微服务,并使用Docker Swarm集群进行部署。

1803
来自专栏用户画像

7.4.2 程序中断方式

程序中断是指在计算机执行现行程序的过场中,出现某些急需处理的异常情况或特殊请求,CPU暂停中断现行程序,而专区对这些异常情况或特殊情况进行处理,在处理完毕后CP...

621
来自专栏魏艾斯博客www.vpsss.net

lnmp环境下如何手动备份网站文件和数据库

我们站长做个网站都是挺不容易的,从域名注册,掌握虚拟主机或者 VPS 的基本配置,到安全防护,搭建网站、图片处理、发布文章,SEO 等等,是样样精通,不过这里面...

44515
来自专栏Java学习网

Web服务器的工作原理

Web服务器的工作原理 Web服务器工作原理概述 很多时候我们都想知道,web容器或web服务器(比如Tomcat或者jboss)是怎样工作的?它们是怎样处理来...

35710
来自专栏云计算

开发者的福利--Cloud Foundry

要确保公司云资产的安全性,首先要应用基于虚拟网络独特性修改的可靠的数据安全实践。

6998
来自专栏闵开慧

让XP支持4G内存

  4G内存已经成为很多中高档笔记本电脑的标准配置。前两篇文章介绍了WIN7系统4G内存的破解过程和4G内存的完美利用。但是,很多朋友还是习惯用32位 XP系统...

95111
来自专栏weixuqin 的专栏

win10 + Lubuntu 双系统安装

最近重装了系统,索性直接安装win10 + Lubuntu 双系统,便于在物理机下进行 Linux开发. 这里我选择的 Linux 发行版是 Lubuntu ....

4572
来自专栏魏艾斯博客www.vpsss.net

lnmp 如何备份网站文件和数据库

1732

扫码关注云+社区