背景
- 为Dapr扩展云原生支持:Rainbond 提供了一套完整的云原生应用支持方案,包括应用开发、应用编排、应用交付、应用运维等应用全生命周期管理能力,而 Dapr 只是应用开发框架,包括应用开发模型、服务发现、事件驱动等功能。将 Rainbond 和 Dapr 结合起来可以提供更完整的云原生应用支持,帮助开发人员更快地构建和部署应用。
- 让Dapr应用可移植性增强:Rainbond提供应用模版能力,Dapr开发的应用以模版的方式打包,可以方便交付和迁移到其他平台运行。
- 为Rainbond扩充服务治理能力:Rainbond 支持通过插件扩展服务治理能力,和 Dapr结合,可以通过Dapr的方式实现服务治理。将二者结合起来,可以提供更完整的服务治理功能,帮助开发人员更好地管理和控制应用中的服务。
- 为Rainbond增加BaaS能力:在Rainbond上开发软件,需要自己安装后端数据库和中间件,而Dapr将后端能力以API的方式对外提供,开发者只需要通过API统一访问后端能力,实现了BaaS体验。
总之,Dapr和Rainbond能互相补充能力不足,Rainbond 解决了应用生命周期管理的问题,开发者不需要懂底层技术,但还是需要了解后端服务,Dapr 补足了这块能力,让开发者更加专注业务。
Rainbond和Dapr的整合思路
-
Dapr Service 的安装:Rainbond 将 Dapr Services 资源进行了整合,作为一个插件应用上架到了应用商店,通过安装便可以快速让我们的集群具备 dapr 微服务架构能力,避免了集群中执行
- DaprD注入:传统注入方式我们需要手动添加注入条件字段,费时费力且不易维护还容易出错;Rainbond 支持通过切换应用的治理模式的方式,为我们的 Pod 添加不同属性字段以满足不同微服务架构的注入条件,从而达到批量注入,快速使用、便于管理的效果。
-
Dapr配置:Dapr 提供了四种配置 Daprd 的资源来扩展我们的服务治理能力,分别为Configuration、Component、Resiliency、Subscription,我们需要通过编写 Yaml 的形式在集群中创建这些资源供业务组件使用,Rainbond 平台在应用的 k8s 资源的管理入口,其效果与
kubectl
有些类似但比kubectl
更易于管理。其中 Configuration 资源用于存储应用程序的配置信息,例如连接字符串、密钥、证书等,需要为 Pod 配置的annotations
属性去声明才可使用,Rainbond 的组件视图提供对annotations
属性配置,简化了我们配置的流程。 - Dapr Component安装和对接:Rainbond 的应用商店已经有很多后端实现,如 MySQL、Redis等,在Rainbond里可以一键安装便可使用。在Dapr应用的K8s资源管理里配置Component的yaml,绑定后端服务的地址。
- Dapr应用开发:Dapr开发的应用可以用源码、镜像、yaml部署到Rainbond平台上,然后根据Dapr的API规范访问后端服务,Rainbond提供对Dapr应用的持续集成、持续交付、环境管理、配置管理、日志和性能监控、访问网关、应用运维等能力,辅助Dapr应用的开发和管理。
dapr init -k
命令,同时解决了国外镜像拉取的问题。
部署和使用流程
基于 Rainbond 使用 Dpar 的目标:
- 一键部署 Dapr Service,让集群具备 Dapr 微服务架构能力。
- 自动为业务组件注入 Daprd。
- 可视化管理 Dapr 配置。
- 简化 Daprd 属性参数配置流程。
- 多种方式交付你的 Dapr 业务。
前提条件
- Rainbond 版本大于 v5.13。
- Rainbond 已经对接过开源应用商店并拥有推送权限。
实践步骤
1. 安装 Rainbond Service Mesh 插件
平台管理->应⽤市场->开源应⽤商店->搜索 Rainbond-ServiceMesh 并进行安装
2. 安装Dapr 应用插件
平台管理->应⽤市场->开源应⽤商店->搜索 Rainbond-Dapr 并进行安装。
3. 绑定 Component
平台管理->应⽤市场->开源应⽤商店->搜索 Redis 并进行安装。安装完成后,在应用视图->k8s资源->编写 Component 资源
进行绑定。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: pubsub
spec:
type: pubsub.redis
version: v1
metadata:
- name: "redisHost"
value: "YOUR_REDIS_HOST_HERE"
- name: "redisPassword"
value: "YOUR_REDIS_PASSWORD_HERE"
如果是 MySQL,步骤是平台管理->应⽤市场->开源应⽤商店->搜索 MySQL 并进行安装
,安装完成后在 应用视图->k8s资源->编写 Component 资源
进行绑定。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: <NAME>
spec:
type: state.mysql
version: v1
metadata:
- name: connectionString
value: "<CONNECTION STRING>"
- name: schemaName
value: "<SCHEMA NAME>"
- name: tableName
value: "<TABLE NAME>"
- name: pemPath
value: "<PEM PATH>"
4. 切换应用治理模式
将业务应用的治理模式切换至 Dapr 。通过在 应用视图->治理模式->选择 Dapr 治理模式进行切换
。其中 dapr 治理模式会为我们组件的 annotations
属性添加字段dapr.io/enabled: "true"
以及dapr.io/app-id="xxx"
其中 xxx 为组件的英文名,由于dapr.io/app-id
是Dapr 体系中的唯一标识,Rainbond 支持自行配置,如果检测到有该属性字段,则优先使用原配置。满足注入条件后,dapr-sidecar-injector 服务开始工作,为我们的业务组件注入 Daprd。
5. 部署业务
应用视图->添加组件->指定镜像->填写镜像地址。
demo镜像地址:
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-node-subscriber:latest
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-react-form:latest
registry.cn-hangzhou.aliyuncs.com/zhangqihang/pubsub-go-subscriber:latest
由于 Dapr 中消息队列需要为组件 annotations
属性设置 dapr.io/app-port
字段,切换治理模式的时候并没有自动生成,所以我们需要在组件视图->其他设置->Kubernetes属性->新增属性->选择 annotations->添加 dapr.io/app-port=组件端口字段
。同理其他扩展的 annotations
属性字段均在此处配置。
6. 部署最终效果
pubsub-react-form 组件的组件视图->端口->打开对外服务便可实现访问消息发布组件,向订阅 A、B、C中发布消息,通过观察pubsub-node-subscriber
和pubsub-go-subscriber
组件的日志可看到订阅的内容,日志位置:组件视图->日志
。
7. 通过Dapr控制台管理
8.发布应用模版
发布来发布应用模版,并通过应用模版在线和离线快速安装到其他环境。不过在其他环境使用时需要先安装Rainbond和Dapr基础环境。
在Rainbond上扩展Dapr
链路追踪
Configuration资源绑定追踪器实现进行工作的。下面是以 Zipkin 追踪器实现的Configuration
资源配置示例。更多详见 Dapr Observability。
应用视图->k8s资源->编写 Configuration 资源
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: daprConfig
namespace: default
spec:
tracing:
samplingRate: "1"
zipkin:
endpointAddress: "http://localhost:9411/api/v2/spans"
熔断限流
限制每秒允许的最大 HTTP 请求数,速率限制可以保护您的应用程序免受拒绝服务 (DOS 攻击。我们需要配置component
资源作为中间件,然后通过Configuration 资源
进行绑定,然后在业务组件中配置挂载使用。
应用视图->k8s资源->编写 Component 资源作为中间件,设置每秒的最大请求数为 10。
apiVersion: dapr.io/v1alpha1
kind: Component
metadata:
name: ratelimit
spec:
type: middleware.http.ratelimit
version: v1
metadata:
- name: maxRequestsPerSecond
value: 10
在应用视图->k8s资源->编写 Configuration 配置资源
绑定中间件。
apiVersion: dapr.io/v1alpha1
kind: Configuration
metadata:
name: appconfig
spec:
httpPipeline:
handlers:
- name: ratelimit
type: middleware.http.ratelimit
在组件视图->其他设置->Kubernetes属性->新增属性->选择annotations->添加 dapr.io/config 属性字段
绑定 Configuration 。