为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Docker 和 Dapr 框架一步步构建和部署微服务的指南

1. 微服务及 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的状态管理功能旨在简化分布式应用程序中状态的管理。下面是一些关键点:

主要特点:
  1. 插拔式状态存储

2. 状态管理 API

3. 并发控制:

4. 批量处理

5. 可配置的状态存储设置

  • 你可以在状态操作请求中包含额外的元数据来描述你期望请求被处理的方式。这可以包括设定并发控制和一致性需求。更多详情请参阅:状态管理和概述
  1. 加密状态

Dapr支持加密状态,确保敏感数据的安全存储,从而保障数据的安全性

示例

下面是如何在 Node.js 应用程序中使用 Dapr 的状态管理功能的一个简单例子。

  1. 保存状态
    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消息机制的关键点:

主要功能介绍
  1. 跨平台的API

2. 消息中间件

3. CloudEvents (云事件):

4. 至少一次投递

5. 无效主题

  • Dapr支持死信队列,这些队列用于转发无法送达的消息。这有助于优雅地处理消息传递中的失败。

6., 订阅种类

它是怎么工作的:
  1. 发布信息:
  • 出版服务使用 Dapr 的发布/订阅 API 将消息发送到主题上。默认情况下,消息会被包裹在一个 CloudEvents envelope 中。

2. 订阅消息通知

示例

这里是一个如何在 Node.js 应用程序中使用 Dapr 的发布-订阅消息的简单示例:

  1. 发布信息
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的服务调用功能旨在简化并加强微服务之间的通信。以下是一些关键特性和工作方式的简要介绍。

主要特点
  1. 服务查找

2. 支持 HTTP 和 gRPC

3. 自带的恢复能力 :

  • [Dapr 提供内置的重试、超时和断路器功能,用来处理瞬时失败并确保服务间的可靠通信。更多详情请参阅服务调用概述。]

4. 安全性 :

5. 可观察性

它是怎么工作的
  1. 侧边车架构

2. 服务调用接口

3. 示例流程

  • 服务 A 想要调用服务 B
  1. 服务A向本地的Dapr边车发送一个请求。
  2. Dapr边车使用名称解析组件找到服务B的位置。
  3. 请求被转发到服务B的Dapr边车。
  4. 服务B处理完请求后,通过边车返回响应给服务A

示例用法

这里有一个在 Node.js 应用程序中调用 Dapr 服务的简单例子的应用程序示例。

  1. 调用服务
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
  1. 准备一下 AWS 环境
  • 创建 EKS 集群:使用 AWS 管理控制台或 AWS CLI 创建 EKS(弹性 Kubernetes 服务)集群。
  • 安装 kubectl 和 eksctl:确保已在本地机器上安装了 kubectleksctl

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 上部署 Dapr (部署指南)
  1. 准备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

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 — 分布式应用运行时环境(框架)

点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消