Dapr 集成 APISIX 做API网关

在这篇文章中,我将展示如何创建一个 APISIX控制器,该控制器在 Kubernetes 集群中公开启用 Dapr 的应用程序。本质上,APISIX控制器将配置相同的标准 Dapr annotations以注入daprd sidecar。通过公开这个 sidecar,它将允许外部应用程序与集群中启用 Dapr 的应用程序进行通信,请参阅 Dapr API 参考。下图是我们实际项目中的架构图:

d50578018316017470aa16789bb4b025.png

Apache APISIX Ingress 概览

在 K8s 生态中,Ingress 作为表示 K8s 流量入口的一种资源,想要让其生效,就需要有一个 Ingress Controller 去监听 K8s 中的 Ingress 资源,并对这些资源进行相应规则的解析和实际承载流量。在当下趋势中,像 Kubernetes Ingress Nginx 就是使用最广泛的 Ingress Controller 实现。

而 APISIX Ingress 则是另一种 Ingress Controller 的实现。跟 Kubernetes Ingress Nginx 的区别主要在于 APISIX Ingress 是以 Apache APISIX 作为实际承载业务流量的数据面。如下图所示,当用户请求到具体的某一个服务/API/网页时,通过外部代理将整个业务流量/用户请求传输到 K8s 集群,然后经过 APISIX Ingress 进行后续处理。

a9919796d2811414bfcee5e592a6ff7a.png

从上图可以看到,APISIX Ingress 分成了两部分。一部分是 APISIX Ingress Controller,作为控制面它将完成配置管理与分发。另一部分 APISIX Proxy Pod 负责承载业务流量,它是通过 CRD(Custom Resource Definitions) 的方式实现的。Apache APISIX Ingress 除了支持自定义资源外,还支持原生的 K8s Ingress 资源。详细内容参见:https://www.apiseven.com/zh/blog/apisix-ingress-details

Dapr 概览

Dapr是一个可移植,事件驱动的运行时。它使开发人员简单地去构建运行在云和edge上弹性、无状态和有状态的应用,并且包含多种语言和开发人员框架。

Any language, any framework, anywhere

c9c2f6e2e9956a3b72cf5a5cc92b3cb7.png

今天,我们正在经历一波云应用浪潮。开发人员熟悉web +数据库应用程序架构(例如经典的3层设计),但不熟悉本质上是分布式的微服务应用程序架构。成为分布式系统专家很难,你也不应该这样做。开发人员希望专注于业务逻辑,同时依靠平台为他们的应用程序注入伸缩性、弹性、可维护性、弹性和其他本地云架构的属性。

这就是Dapr的用武之地。Dapr将构建微服务应用程序的最佳实践编入开放的、独立的构建块中,使您能够使用自己选择的语言和框架构建可移植的应用程序。每个构建块都是完全独立的,您可以在应用程序中使用其中的一个、一些或全部。

此外,Dapr与平台无关,这意味着您可以在任何Kubernetes集群和其他与Dapr集成的托管环境上本地运行应用程序。这使您能够构建可以在云和edge上运行的微服务应用程序。

详细内容参见:https://docs.dapr.io/zh-hans/concepts/overview/

APISIX 支持Dapr 的部署

前提条件

•Kubernetes 1.19+ 集群,集群上已经配置了 Dapr 。

•安装了 Helm CLI 3x。

•Kubectl CLI 已安装并配置为访问集群。

•可选:用于创建自签名证书的OpenSSL。

•APISIX的Helm Chart 版本0.7.2+,具体原因0.7.2 版本修复的issue:https://github.com/apache/apisix-helm-chart/issues/167

准备APISIX Helm

通过运行以下命令为 APISIX控制器添加最新的 helm chart repo:

$ helm repo add apisix https://charts.apiseven.com

$ helm repo update

创建APISIX Ingerss命名空间

确保当前 kubectl 上下文指向正确的 Kubernetes 集群,然后运行以下命令:

kubectl create namespace ingress-apisix

安装支持 Dapr 的 APISIX 控制器

使用以下内容创建一个名为 dapr-annotations.yaml 的文件,以在 APISIX Proxy Pod 上设置注释:

apisix:

  podAnnotations:

    dapr.io/enabled: "true"

    dapr.io/app-id: " apisix-gateway"

dapr.io/app-port: "9080"

dapr.io/enable-metrics: "true"

dapr.io/metrics-port: "9099"

dapr.io/sidecar-listen-addresses: 0.0.0.0

dapr.io/config: ingress-apisix-config

注意:上面的app-port告诉 daprd sidecar Proxy在监听哪个端口。有关受支持的注释的完整列表,请参阅 Dapr Kubernetes pod 注释规范。

下面是我在AKS上安装的示例dapr-annotations.yaml:

 apisix:

  podAnnotations:

    dapr.io/app-id: apisix-gateway

    dapr.io/app-port: '9080'

    dapr.io/enable-metrics: 'true'

    dapr.io/enabled: 'true'

    dapr.io/metrics-port: '9099'

dapr.io/sidecar-listen-addresses: 0.0.0.0

dapr.io/config: ingress-apisix-config

gateway:

  type: LoadBalancer

ingress-controller:

  enabled: true

dashboard:

  enabled: true

运行以下命令,该命令引用上述文件:

helm install apisix apisix/apisix -f dapr-annotations.yaml -n ingress-apisix

创建APISIX的Dapr Sidecar 资源

1、配置一个Apisix 上游 upstream—apisix-dapr

70fb8284b20b6465f9ef7b15eeb81680.png

主机名 填写:apisix-gateway-dapr,端口号填写3500

{

  "nodes": [

    {

      "host": "apisix-gateway-dapr",

      "port": 3500,

      "weight": 1

    }

  ],

  "retries": 1,

  "timeout": {

    "connect": 6,

    "read": 6,

    "send": 6

  },

  "type": "roundrobin",

  "scheme": "http",

  "pass_host": "pass",

  "name": "apisix-dapr"

}

2、配置一个apisix 服务 apisix-gateway-dapr , 上游服务选择apisix-dapr:

7c0c99c6943033abe0e1d3982a0873da.png

{

  "name": "apisix-gateway-dapr",

  "upstream_id": "376187148778341098"

}

部署测试示例项目

HTTPBin是以Python+Flask写的一款工具,它cover了各类的HTTP场景,且每个接口一定都有返回。我们使用 kennethreitz/httpbin 作为示例项目进行演示:

kubectl apply -f 01.namespace.yaml

kubectl apply -f 02.deployment.yaml

kubectl apply -f 03.svc.yaml

ce215a1993c27fb7f392fac7c7b3365a.png

上面假设有一个使用 Dapr app-id kennethreitz-httpbin运行的微服务,

路径匹配改写 

比如请求网关是 /httpbin/*, 然后后端接收的路径应该是 /*, 中间的httpbin只是充当服务名的标识。

路径 填 /*    匹配/get这种请求

路径改写选正则改写 

匹配^/ httpbin/(.*)  表示匹配/之后的部分,作为第一个匹配到的值,变量名为$1

转发路径模板 /v1.0/invoke/svc-kennethreitz-httpbin.kind-test/method/$1    即取上一个匹配后的参数拼接转发。在支持命名空间的托管平台上,Dapr 应用 ID 是符合有效的 FQDN 格式,其中包括目标名称空间。例如,以下字符串包含应用 ID (svc-kennethreitz-httpbin) 以及应用运行在 命名空间(kind-test)。

测试是否代理成功,访问http://20.195.90.43/httpbin/get:

d5e55a1ea733ac9bcd7d035d51ca2f1c.png

可以看到也正常代理了。

删除 APISIX控制器

为方便起见,这里是删除 APISIX控制器的命令:

helm delete apisix -n ingress-apisix

不要忘记删除之前创建的命名空间ingress-apisix。

总结

你可以在 Kubernetes 中使用 Apache APISIX 的官方 Helm 仓库直接部署 Apache APISIX 和 APISIX Ingress Controller。并且 Apache APISIX可通过作为网关,承载 APISIX Ingress Controller 的数据面来承载业务流量。将Dapr 通过Sidecar 的annotations 注入到APISIX Proxy Pod,通过Dapr的服务调用模块调用集群中的微服务。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295504.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

判断一个字符串是否包含另一个字符串(用java但是不能用index()这个函数)

目录: 一.方法介绍 二.图示意 三.源代码 一.方法介绍 判断一个字符串str1是否包含另一个字符串str2: 1.取str2的第一个字符一次和str1的字符依次比较,知道找到相等的字符为止或者找完整个str1的length. 2.当找到相等的字符后,在str2长度内str2与str1依次进行比较 二…

跳槽9招让你“空降”任何企业都能成功

2019独角兽企业重金招聘Python工程师标准>>> 作为一名职业经理人,没有谁没跳过槽,撇开在跳槽时对所“空降”的企业所需要的行业知识知根知底而“得心应手”,从而“稳定”外,其他人可能或多或少都有过因“不适应”新单位…

这个年纪,喜欢你的肉体还会送你包的,原来是......

1 iPhone 12一出王守义成最大赢家(素材来源网络,侵删)▼2 想搭免费车的喵(dy:大兔几)▼3 拼纹身的有吗?纹在我身,刀在你身▼4 那你泡啥?▼5 快把知识君p上去&#xff…

C# WPF MVVM模式Caliburn.Micro框架下事件发布与订阅

01—前言处理同模块不同窗体之间的通信和不同模块之间不同窗体的通信,Caliburn提供了一种事件机制,可以在应用程序中低耦合的模块之间进行通信,该机制基于事件聚合器服务,允许发布者和订阅者之间通过事件进行通讯,且彼…

常用的加密算法---数字摘要

数字摘要:数字摘要也称为消息摘要,它是一个唯一对应一个消息或文本的固定长度的值,它是一个单向Hash函数对消息进行计算产生的。摘要生成的过程:待摘要串-----> Hash函数-----> 摘要消息摘要的特点:1.无论输入的…

清华最强本科生Top10出炉,从来没有什么天才学霸!

全世界只有3.14 % 的人关注了爆炸吧知识‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍本文转自:量子位作者:木易 鱼羊一年一度,清华园里的“神仙打架”,投票结果已经出炉。根据清华大学官方消息,2020年清华大学特等奖学金&#x…

day19(中)_IO流3(模拟缓冲区,装饰设计模式)

1.MyBufferedReader和MyBufferedInputStream 1.模拟字符读取流的缓冲区: /*根据readLine原理:自定义一个类包含一个功能和readLine一致的方法来模拟以下BufferedReader方法 */ package myreadline; import java.io.FileReader; import java.io.IOException;class MyBufferedRea…

手把手教你学Dapr - 8. 绑定

介绍使用绑定,您可以使用来自外部系统的事件触发您的应用程序,或与外部系统交互。这个构建块为您和您的代码提供了几个好处:消除连接和轮询消息系统(如队列和消息总线)的复杂性关注业务逻辑,而不是如何与系…

Android之百度地图定位最详细使用总结

Android之百度定位 如果项目里面有定位功能的话,一般还是觉得蛮高大上的,我们项目用的百度定位,到网上找了很多资料,很多都不全面,很多博客都没有小伙伴期望得到当前的省和城市出来,然后自己动手也有很多错误,不知道错在哪里,也在网上找为什么…

CountDownLatch应用实战

2019独角兽企业重金招聘Python工程师标准>>> 1. CountDownLatch简介 一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。其本质就是一个共享锁。 他最主要的作用是用来同步java的线程。 主要有以下三个方…

40张令人震惊的对比图,第一张细思恐极

全世界只有3.14 % 的人关注了爆炸吧知识世界之大,无奇不有。来看Reddit网友们分享的一组对比图,涨涨姿势!医生对戴口罩和不戴口罩的培养皿分别:打喷嚏,唱歌,说话和咳嗽之后的区别(难怪有些国家疫…

Smark.Data 1.5更新详解

由于一直忙于Beetle的开发和优化,Smark.Data组件已经有很长一段时间更新。这段时间发现Smark.Data在某些情况下不足,而这些情况又比较普遍所以进行了1.5版的更新。其更新的主要功能包括:查询可填充到自定义对象中,可直接执行存储过程和执行存…

C# 数据适配器之 DataAdapter 对象

01 DataAdapter 对象概述DataAdapter 对象是一个数据适配器对象,是DataSet 与数据源之间的桥梁。DataAdapter 对像提供了 4 个属性,用于实现与数据源之间的互通。SelectCommand 属性:向数据库发送查询 SQL 语句。 DeleteCommand 属性&#x…

express 4 简单实现自动注册路由功能

为什么80%的码农都做不了架构师?>>> ##实现 在express,模块的lib/router/index.js 的 proto.route 方法定义附件添加代码,实现自动注册路由方法: var fs require("fs"); var Path require("path&quo…

速战速决?你不会是不行吧......

1 真服了!!▼2 同猫不同命......▼3 无锡:??▼4 还是黄金好?▼5 你会不会是不行??▼6 爸爸:那也太惊喜了...▼7 倒是毫无违和感?▼8 皇上您说的对&…

mysql普通标转分区表_MySQL分区表到普通表互转

由于最近总有人抱怨,数据迁移后执行SQL变慢,经过查看原来是分区导致的问题。原分区根据按月设置RANGE分区,看到这图的时候也许有人就会发现问题.......业务查询SQL:从SQL上看 执行计划确实是走了分区,但为什么没有命中…

C# 用IrisSkin4.dll美化你的WinForm

1. 将IrisSkin4.dll动态文件导入当前项目引用中。具体操作为:解决方案资源管理器->当前项目->引用->右键->添加引用,找到IrisSkin4.dll文件,然后加入即可。建议,最好把IrisSkin4.dll文件放在当前项目\bin\Debug文件中…

全球最大油田、金矿、煤矿、铁矿、铜矿,究竟哪个最值钱?

全世界只有3.14 % 的人关注了爆炸吧知识1世界上最大油田:沙特加瓦尔油田(Ghawar Oil field)加瓦尔油田位于沙特阿拉伯东部,首都利雅得以东约500km处,它探明的石油可采储量为114.8亿吨,天然气储量9240亿立方…

MVC3快速搭建Web应用(二)

easyui与mvc的结合 上一篇文章发布后,自己又仔细读了数遍,感觉一是文笔太差,二是描述逻辑比较混乱,客观原因是涉及到东西其实蛮多的,那三个步骤不可能在一篇短短的文章中就可以描述清楚。此篇笔者将尽量更加详尽一些。…

这个发热鞋垫厉害了,有它冬天再也不怕脚冷

▲ 点击查看冬天一到,小爆发现身边的“抖友”又开始上线了!至于为什么会抖脚?有盆友说,当然不是真的想抖,而是因为脚太冷冷冷了!有时候穿了棉袜厚鞋,脚都是冷冰冰的,感觉就像踩在冰窟…