1. 微服务及 Dapr 简介
微服务:即微服务架构
- 微服务是一种架构风格,将应用程序构建成一组松散耦合的服务,每个服务提供特定的业务功能。
- 好处:可伸缩性、灵活性、弹性和恢复能力以及独立部署。
Dapr :
- Dapr 是一个便携且事件驱动的运行时,使得构建无状态和有状态的微服务变得简单且可靠,同时。
- 在微服务中的角色:Dapr 提供了服务调用、状态管理、发布/订阅消息等构建模块,简化了分布式应用程序的开发.
2. 搭建开发环境
安装 Docker 和 Dapr :,这是一个容器化工具和平台。
- Docker : 按照官方的Docker安装指南安装Docker。
- Dapr : 参照官方的Dapr安装指南安装Dapr组件。
设置本地的开发环境
- 给每个微服务都创建一个Dockerfile。Dockerfile就像一个脚本,它包含了用来构建Docker镜像的所有指令。
以下是一个用于 Node.js 微服务的 Dockerfile 示例:
# 使用官方的 Node.js 版本
FROM node:14
# 创建工作目录并设置为当前目录
WORKDIR /app
# 复制 package.json 文件并安装依赖项
COPY package*.json ./
RUN npm install
# 复制应用的其余文件
COPY . .
# 暴露应用运行的端口(3000)
EXPOSE 3000
# 运行应用的命令行
CMD ["node", "app.js"]
3. 设计和搭建自己的微服务
微服务架构设计:
- 专注于分离关注点,并明确界定每个服务的边界。
- 使用 Dapr 的服务调用功能进行服务间通信。
搭建一个简单的微服务
在 Node.js 中的示例:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('嘿,来自微服务的问候!');
});
app.listen(port, () => {
console.log(`微服务正在监听 http://localhost:${port}`);
});
微服务容器化 :
- 为每个微服务使用Dockerfile来构建Docker镜像。
- 最佳做法:使用多阶段构建,尽量减少层数的数量,并避免使用基础镜像的latest标签,建议使用具体版本号。
4.: 使用 Dapr 构建多容器应用
Dapr简介:
Dapr 提供了服务调用、状态管理功能、发布-订阅消息等 API,使构建分布式应用变得更简单。
创建 docker-compose.yml
文件
- 在
docker-compose.yml
文件中定义服务、网络配置和数据卷。
一个示例的 docker-compose.yml 文件:
version: '3'
services:
service1:
build: ./service1
ports:
- "3000:3000"
command: 启动命令:["dapr (命令)", "run", "--app-id", "service1", "--app-port", "3000", "--", "node", "app.js"]
description: 服务1: 提供特定功能的后端服务
service2:
build: ./service2
ports:
- "3001:3001"
command: 启动命令:["dapr (命令)", "run", "--app-id", "service2", "--app-port", "3001", "--", "node", "app.js"]
description: 服务2: 提供特定功能的后端服务
连接容器和管理网络:
- 使用 Dapr 的服务调用来管理微服务间的网络连接。容器可以通过 Dapr 的服务发现来互相通信。
5. 测试与调试微服务的应用
测试方法:
- 单元测试:测试单个模块。
- 集成测试:测试模块间的交互。
- 工具:使用像 Postman 这样的工具来测试 API。
调试小贴士
- 使用
docker logs
查看容器的日志信息。 - 使用 Dapr 的观测功能来监控和调试服务运行。
6: 启动微服务
上线生产
- 使用像 AWS、Azure 或 Google Cloud 這樣的雲服務提供商。
- 推送 Docker 鏡像到 Docker Hub 或私人 registry 服務。
部署策略如下:
- 蓝绿部署:新旧版本同时部署,然后切换流量。
- 滚动更新:逐步用新版本替换旧版本,使之生效。
7. 监控和扩缩微服务
监控工具 :
- 普罗米修斯:用于监控和报警。
- Grafana:用于可视化。
- ELK Stack:用于日志记录和监控。
微服务扩展:
- 本地:用 Docker Compose 来扩展服务规模。
- 生产:用 Kubernetes 进行编排和扩展服务规模。
8. 结论与最佳做法
要点:
- 微服务带来灵活性和可扩展性。
- Dapr 简化分布式应用的构建与管理。
- 使用最佳实践编写 Dockerfile 并管理容器,让操作更高效。
加油:
- 探索高级主题,例如 Kubernetes 编排和 服务网格,以实现更强大的微服务管理。
Dapr的状态管理功能旨在简化分布式应用程序中状态的管理。下面是一些关键点:
主要特点:- 插拔式状态存储。
- Dapr 支持多种状态存储系统,例如 Redis、Azure Cosmos DB、AWS DynamoDB 等。这些状态存储系统被设计成组件,允许你在不更改服务代码的情况下进行切换。
2. 状态管理 API
- Dapr 提供了一套状态管理 API,允许您的应用程序保存、读取和查询键值对。您可以通过 HTTP 或 gRPC 访问此 API。更多详情,请参阅构建模块中的状态管理概述。
3. 并发控制:
- Dapr 使用 ETags 来支持乐观并发控制(OCC)。在请求状态值时,Dapr 会在返回的状态值上附带 ETag 属性。这有助于管理并发更新,确保数据的一致性。https://docs.dapr.io/developing-applications/building-blocks/state-management/state-management-overview
4. 批量处理:
5. 可配置的状态存储设置
- 你可以在状态操作请求中包含额外的元数据来描述你期望请求被处理的方式。这可以包括设定并发控制和一致性需求。更多详情请参阅:状态管理和概述。
- 加密状态:
Dapr支持加密状态,确保敏感数据的安全存储,从而保障数据的安全性
示例下面是如何在 Node.js 应用程序中使用 Dapr 的状态管理功能的一个简单例子。
- 保存状态:
const dapr = require('dapr-client'); // dapr-client 是一个用于与 Dapr 系统交互的客户端库
const client = new dapr.DaprClient();
const state = { key: 'orderId', value: '12345' };
await client.state.save('statestore', state);
console.log('状态已保存');
2. 获取状态信息:
const result = await client.state.get('statestore', 'orderId');
console.log('状态已检索,', result);
3. 删除状态:
await client.state.delete('statestore', 'orderId');
console.log('已删除状态');
好处
- 简化状态管理:让开发者专注于业务逻辑。
- 可移植性:可插拔的状态存储模型允许应用在不同环境中运行而无需修改代码。
- 一致性和并发性:内置的并发控制和可配置的一致性保障了可靠的状态管理。
借助Dapr的状态管理功能,您可以轻松构建坚固且保持状态的微服务。【https://docs.dapr.io/developing-applications/building-blocks/state-management/state-management-overview】
Dapr的发布/订阅(pub/sub)消息机制是一个强大的特性,它使微服务能够异步地通过消息进行通信。此模式特别适合用于构建事件驱动架构。以下是Dapr的pub/sub消息机制的关键点:
主要功能介绍- 跨平台的API
2. 消息中间件,
- Dapr 支持多种消息代理服务,例如 Redis Streams、NATS Streaming、Azure 服务总线、Google Cloud Pub/Sub 等等。这些消息代理服务被配置为 Dapr 组件,使得在不修改应用代码的情况下轻松切换。
3. CloudEvents (云事件):
- Dapr 使用 CloudEvents 1.0 规范标准作为其消息格式,这提供了一种标准化的方式来描述事件数据。它有助于消息的路由,并为每条消息提供额外的上下文。
4. 至少一次投递
5. 无效主题
- Dapr支持死信队列,这些队列用于转发无法送达的消息。这有助于优雅地处理消息传递中的失败。
6., 订阅种类 :
它是怎么工作的:- 发布信息:
- 出版服务使用 Dapr 的发布/订阅 API 将消息发送到主题上。默认情况下,消息会被包裹在一个 CloudEvents envelope 中。
2. 订阅消息通知:
- 一个订阅者服务可以订阅某个主题并通过 Dapr 的发布/订阅组件接收消息。Dapr 负责将消息推送至订阅者的端点地址。
这里是一个如何在 Node.js 应用程序中使用 Dapr 的发布-订阅消息的简单示例:
- 发布信息
const dapr = require('dapr-client');
const client = new dapr.DaprClient();
const message = { data: 'Hello, World!' };
await (client.pubsub.publish('pubsub', 'mytopic', message));
console.log('消息已发送');
2. 订阅消息通知 :
const express = require('express');
const app = express();
const port = 3000;
app.use(express.json());
app.post('/dapr/subscribe', (req, res) => {
const message = req.body;
console.log('收到的消息是:', message);
res.sendStatus(200);
});
app.listen(port, () => {
console.log(`正在监听订阅者 http://localhost:${port}`);
// 正在监听的地址是 http://localhost:${port}
});
好处
- 微服务解耦:发布/订阅消息机制使微服务解耦,允许它们在不了解对方的情况下进行通信。
- 水平扩展能力:它通过允许多个订阅者实例来处理消息,支持水平扩展。
- 灵活性:可插拔的消息代理模型提供了选择和切换消息代理的灵活性。
通过利用 Dapr 的发布/订阅消息机制,你可以构建出稳定、可扩展且松耦合的微服务架构。
Dapr旨在让微服务之间的通信变得更加简单和高效。Dapr的服务调用功能旨在简化并加强微服务之间的通信。以下是一些关键特性和工作方式的简要介绍。
主要特点- 服务查找:
- Dapr 自动处理服务的发现。每个服务都会被分配一个唯一的标识符(appId),然后Dapr 使用此标识符来定位和通信。
2. 支持 HTTP 和 gRPC
- Dapr 支持利用 HTTP 和 gRPC 协议进行服务调用。这种灵活性让你可以根据应用的需求选择最适合的协议。
3. 自带的恢复能力 :
- [Dapr 提供内置的重试、超时和断路器功能,用来处理瞬时失败并确保服务间的可靠通信。更多详情请参阅服务调用概述。]
4. 安全性 :
5. 可观察性 :
它是怎么工作的- 侧边车架构:
- Dapr 使用边车模式,每个服务都与一个 Dapr 边车并行运行。边车负责处理服务发现、通信以及其他相关功能。
2. 服务调用接口
- 要调用服务,您可以使用 Dapr 服务调用 API。该 API 充当反向代理,通过各自的服务侧车将请求从一个服务转发到另一个服务,例如。
3. 示例流程 :
- 服务 A 想要调用服务 B
- 服务A向本地的Dapr边车发送一个请求。
- Dapr边车使用名称解析组件找到服务B的位置。
- 请求被转发到服务B的Dapr边车。
- 服务B处理完请求后,通过边车返回响应给服务A。
示例用法
这里有一个在 Node.js 应用程序中调用 Dapr 服务的简单例子的应用程序示例。
- 调用服务
const dapr = require('dapr-client');
const client = new dapr.DaprClient();
const response = await client.invoker.invoke('serviceB', 'method', 'POST', { data: 'Hello, Service B!' });
console.log('来自Service B的响应:', response);
2. 服务配置
dapr run --app-id serviceA, --app-port 3000, -- node app.js
dapr run --app-id serviceB, --app-port 3001, -- node app.js
# 启动服务A和服务B,使用dapr命令运行,分别使用3000和3001端口.
好处
- 简化通信:Dapr 抽象了服务间通信的复杂性,让构建和管理微服务变得更加简单。
- 弹性和安全性:内置的重试、超时、断路器和安全通信等功能增强了服务的可靠性和安全性,使其更加稳定和安全。
- 可观测性:分布式追踪与指标提供了有关微服务性能和健康状况的见解。
通过使用Dapr的服务调用能力,您可以构建可靠的、稳定、可扩展和易于维护的微服务架构,
将 Dapr 部署到 AWS 和 Azure 上需要设置必要的基础设施,并配置 Dapr 组件。以下为这两个平台的分步指南:
在 AWS 上部署 Dapr- 准备一下 AWS 环境:
- 创建 EKS 集群:使用 AWS 管理控制台或 AWS CLI 创建 EKS(弹性 Kubernetes 服务)集群。
- 安装 kubectl 和 eksctl:确保已在本地机器上安装了
kubectl
和eksctl
。
2. 将 Docker 镜像发布到 ECR
- 新建一个ECR仓库:通过AWS管理控制台或AWS CLI新建一个弹性容器注册表(ECR)。
- 推送Docker镜像:构建并推送到您的Docker镜像到ECR。
3. 将 Dapr 部署到 EKS 上:
- 安装 Dapr CLI:按照 Dapr 的安装指南来安装。
- 在您的 EKS 集群上启动 Dapr:使用 Dapr CLI 在您的 EKS 集群上启动 Dapr
你现在可以运行这个命令来初始化 Dapr,注意使用 Kubernetes 环境:
dapr init -k
- 部署您的应用:为您的应用创建Kubernetes部署文件,并在文件中添加Dapr注解以启用Dapr边车容器。
4. 配置 Dapr 组件:
- 创建 Dapr 组件的 YAML 文件:定义你的 Dapr 组件(如状态存储和发布/订阅),这是 YAML 文件。
- 应用组件文件:使用
kubectl apply -f <component-file>.yaml
命令将组件配置应用到你的 EKS 集群。
- 准备Azure环境:
- 创建 AKS 集群: 使用 Azure 门户或 Azure CLI 创建 AKS 集群。
- 安装 Azure CLI: 确保已在本地机器上安装了 Azure CLI。
2. 推送Docker镜像到ACR :
- 创建 ACR 仓库:使用 Azure 门户或 Azure CLI 创建 Azure 容器注册表仓库。
- 推送 Docker 镜像:构建并推送 Docker 镜像到 ACR。
3. 在 AKS 上部署 Dapr
- 安装 Dapr CLI:按照 Dapr 的安装指南操作。
- 在 AKS 上初始化 Dapr 环境:使用 Dapr CLI 在你的 AKS 集群上初始化 Dapr
在命令行中输入以下命令:```
dapr init -k
* **部署应用**:创建应用的Kubernetes部署文件,并加入Dapr注解以启用Dapr边车。
4\. **设置 Dapr 组件** :
* **创建组件的 YAML 文件**:定义您的 Dapr 组件(如状态存储、发布/订阅)的 YAML 文件。
* **应用组件文件**:使用 `kubectl apply -f <component-file>.yaml` 将组件配置应用到您的 AKS 集群中,增加“中”字使句子更加完整。
# 部署示例
**Kubernetes 部署文件(YAML/JSON)带有 Dapr 注解:**
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp
spec:
replicas: 1
selector:
matchLabels:
app: myapp
template:
metadata:
labels:
app: myapp
annotations:
dapr.io/enabled: "true"
dapr.io/app-id: "myapp"
dapr.io/app-port: "3000"
spec:
containers:
- name: myapp
image: <your-docker-image>
ports:- containerPort: 3000
- containerPort: 3000
Dapr 组件配置文件(例如 Redis 状态存储组件):
apiVersion: dapr.io/v1alpha1
kind: 组件:
metadata:
name: statestore
namespace: default
spec:
type: state.redis
version: v1
metadata:
- name: redisHost
value: "redis-master.default.svc.cluster.local:6379"
- name: redisPassword
value: ""
1: Dapr — 分布式应用运行时环境(框架)
共同学习,写下你的评论
评论加载中...
作者其他优质文章