13、微服务部署:从容器化到自动化部署

微服务部署:从容器化到自动化部署

1. 微服务部署概述

在微服务的世界里,部署意味着将微服务投入有效运行。一个有效的微服务部署策略至关重要,在规划部署过程时,需要注意以下几点:
- 继续遵循关注点分离的模式,为每个微服务的工件构建过程进行自我隔离。
- 解耦微服务内的任何连接需求,让服务发现或接近服务发现的实现来处理微服务绑定。
- 实现一个无缝的部署过程,能够以统一和自动化的方式处理所有微服务应用程序组件的实例化。

2. 技术要求

在开发环境中需要安装和设置以下工具:
| 工具 | 要求 | 下载地址 |
| — | — | — |
| Java SDK | 版本 13 或更高(推荐 Java 14) | 无 |
| Maven | 可选,仅在使用 Maven 作为构建系统时需要 | https://maven.apache.org/download.cgi |
| 开发 IDE | 基于个人偏好,任何基于 Java 的 IDE 都可以,如 IntelliJ | 无 |
| Git | 无 | https://git-scm.com/downloads |
| PostgreSQL | 无 | https://www.postgresql.org/download/ |
| MongoDB | 可以使用 MongoDB Atlas 提供的免费在线数据库服务(最多 512 MB 存储),也可以使用本地数据库 | https://docs.mongodb.com/manual/administration/install-community/ |
| REST 客户端 | 任何 HTTP REST 客户端都可以,如 Advanced REST Client Chrome 插件 | 无 |
| Docker | 无 | https://docs.docker.com/get-docker/ |

3. 构建容器工件

部署任何应用程序的第一步是构建所有必需的工件。对于微服务来说,通常可部署的形式是 Docker 容器映像。Docker 映像优雅地解耦了运行时拓扑要求,它是平台无关的,可以部署到任何运行 Docker 的主机上。

3.1 使用 Jib 对 Micronaut 微服务进行容器化

Jib 是 Google 推出的一个容器化框架,它可以与 Maven 或 Gradle 等 Java 构建框架无缝结合,大大简化了创建容器(Docker)映像的过程。

以下是不使用 Jib 创建 Docker 映像的工作流程:

graph LR
    A[构建源代码] --> B[创建 Docker 文件]
    B --> C[Docker 守护进程使用构建上下文创建容器映像]
    C --> D[将容器映像推送到仓库/注册表]

而使用 Jib 的工作流程则简化为:Jib 从构建文件(如项目的 pom 文件或 Gradle 文件)中获取配置,构建容器映像并将其上传到配置的仓库/注册表。

3.2 对各个微服务进行容器化

以下将分别介绍如何对 pet-owner、pet-clinic、pet-clinic-reviews 和 pet-clinic-concierge 这几个微服务进行容器化。

pet-owner 微服务
1. 修改应用配置 :简化配置管理,使用本地的 application.properties 文件。

micronaut:
  application:
    name: pet-owner
  server:
    port: 32581
  router:
    static-resources:
      swagger:
        paths: classpath:META-INF/swagger
        mapping: /swagger/**
datasources:
  default:
    url: "jdbc:postgresql://host.docker.internal:5432/postgres"
    username: postgres
    password: postgres
    driverClassName: org.postgresql.Driver
consul:
  client:
    default-zone: "consul:8500"
    registration:
      enabled: true
jpa:
…

需要注意的是:
- 数据源 URL 使用 host.docker.internal 而不是 localhost 来指向安装在主机操作系统(Docker 外部)上的 Postgres 实例。
- Consul 默认区域需要指定服务名称而不是 localhost,以便从 pet-owner Docker 容器中使用 Dockerized consul。
- 指定一个固定端口来运行 pet-owner 微服务,以便在部署时暴露该端口。

  1. 修改 pom 文件 :使用 Jib 进行容器化,在项目的 pom 文件构建设置中进行如下更改:
<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>2.8.0</version>
      <configuration>
        <from>
          <image>openjdk:13-jdk-slim</image>
        </from>
        <to>
          <image>pet-owner-0.1-image</image>
        </to>
        <container>
          <creationTime>${maven.build.timestamp}</creationTime>
        </container>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 构建映像
    • 打开终端并切换到 pet-owner 根目录。
    • 在终端中输入并运行 mvn compile jib:dockerBuild 命令。
    • 等待命令完成。

可以使用 docker images | grep pet-owner 命令在终端中验证本地 Docker 映像是否创建成功。

pet-clinic 微服务
1. 修改应用配置

micronaut:
  application:
    name: pet-clinic
  server:
    port: 32582
kafka:
  bootstrap:
    servers: kafka:9092
datasources:
  default:
    url: "jdbc:postgresql://host.docker.internal:5432/postgres"
    username: postgres
    password: postgres
    driverClassName: org.postgresql.Driver
consul:
  client:
    default-zone: "consul:8500"
    registration:
      enabled: true
…

同样需要注意数据源 URL、Consul 默认区域、Kafka 服务器和端口的设置。

  1. 修改 pom 文件 :与 pet-owner 微服务类似,使用 Jib 进行容器化。
<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>2.8.0</version>
      <configuration>
        <from>
          <image>openjdk:13-jdk-slim</image>
        </from>
        <to>
          <image>pet-clinic-0.1-image</image>
        </to>
        <container>
          <creationTime>${maven.build.timestamp}</creationTime>
        </container>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 构建映像
    • 打开终端并切换到 pet-clinic 根目录。
    • 在终端中输入并运行 mvn compile jib:dockerBuild 命令。
    • 等待命令完成。

使用 docker images | grep pet-clinic 命令验证本地 Docker 映像。

pet-clinic-reviews 微服务
1. 修改应用配置

micronaut:
  application:
    name: pet-clinic-reviews
  server:
    port: 32583
kafka:
  bootstrap:
    servers: kafka:9092
mongodb:
  uri: mongodb://mongodb:mongodb@host.docker.internal:27017/pet-clinic-reviews
  databaseName: pet-clinic-reviews
  collectionName: vet-reviews
consul:
  client:
    default-zone: "consul:8500"
    registration:
      enabled: true
…

注意 Mongo 数据库 URI、Consul 默认区域、Kafka 服务器和端口的设置。

  1. 修改 pom 文件
<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>2.8.0</version>
      <configuration>
        <from>
          <image>openjdk:13-jdk-slim</image>
        </from>
        <to>
          <image>pet-clinic-reviews-0.1-image</image>
        </to>
        <container>
          <creationTime>${maven.build.timestamp}</creationTime>
        </container>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 构建映像
    • 打开终端并切换到 pet-clinic-reviews 根目录。
    • 在终端中输入并运行 mvn compile jib:dockerBuild 命令。
    • 等待命令完成。

使用 docker images | grep pet-clinic-reviews 命令验证本地 Docker 映像。

pet-clinic-concierge 微服务
1. 修改应用配置

micronaut:
  application:
    name: pet-clinic-concierge
  server:
    port: 32584
  config-client:
    enabled: true
consul:
  client:
    default-zone: "consul:8500"
    registration:
      enabled: true
…

注意 Consul 默认区域和端口的设置。

  1. 修改 pom 文件
<build>
  <plugins>
    ...
    <plugin>
      <groupId>com.google.cloud.tools</groupId>
      <artifactId>jib-maven-plugin</artifactId>
      <version>2.8.0</version>
      <configuration>
        <from>
          <image>openjdk:13-jdk-slim</image>
        </from>
        <to>
          <image>pet-clinic-concierge-0.1-image</image>
        </to>
        <container>
          <creationTime>${maven.build.timestamp}</creationTime>
        </container>
      </configuration>
    </plugin>
  </plugins>
</build>
  1. 构建映像
    • 打开终端并切换到 pet-clinic-concierge 根目录。
    • 在终端中输入并运行 mvn compile jib:dockerBuild 命令。
    • 等待命令完成。

使用 docker images | grep pet-clinic-concierge 命令验证本地 Docker 映像。

现在,所有微服务都已完成容器化,可以在 Docker 仪表板中验证这些映像。在 Docker UI 中,只需转到 Images 并在 LOCAL 选项卡下过滤所有 pet-clinic 应用程序映像。

后续将介绍如何使用这些 Docker 映像进行 pet-clinic 应用程序的部署。

微服务部署:从容器化到自动化部署

4. 部署容器工件

在上一部分,我们探讨了如何使用 Jib 简化微服务容器化。在这一部分,我们将深入研究如何使用 Docker 编排工具 docker-compose 实现端到端的无缝、统一部署。

4.1 使用 docker-compose 部署 pet-clinic 服务

docker-compose 是 Docker 生态系统中的一个工具,它使用简单的 YAML 语法来定义和部署多容器应用程序。通过一个命令,我们就可以部署整个应用程序。

首先,我们需要在 docker-compose 文件中定义辅助服务:

version: '3'
services:
  consul:
    image: bitnami/consul:latest
    ports:
      - '8500:8500'

  zookeeper:
    image: bitnami/zookeeper:3-debian-10
    ports:
      - 2181:2181
    volumes:
      - zookeeper_data:/pet-clinic-reviews
    environment:
      - ALLOW_ANONYMOUS_LOGIN=yes  

  kafka:
    image: bitnami/kafka:2-debian-10
    ports:
      - 9094:9094
    volumes:
      - kafka_data:/pet-clinic-reviews
    environment:
      - KAFKA_BROKER_ID=1
      - KAFKA_CFG_ZOOKEEPER_CONNECT=zookeeper:2181
      - ALLOW_PLAINTEXT_LISTENER=yes
      - KAFKA_LISTENERS=INTERNAL://kafka:9092,OUTSIDE://kafka:9094
      - KAFKA_ADVERTISED_LISTENERS=INTERNAL://kafka:9092,OUTSIDE://localhost:9094
      - KAFKA_LISTENER_SECURITY_PROTOCOL_MAP=INTERNAL:PLAINTEXT,OUTSIDE:PLAINTEXT
      - KAFKA_INTER_BROKER_LISTENER_NAME=INTERNAL
    depends_on:
      - zookeeper

  kafdrop:
    image: obsidiandynamics/kafdrop
    ports:
      - 9100:9000
    environment:
      - KAFKA_BROKERCONNECT=kafka:9092
      - JVM_OPTS=-Xms32M -Xmx64M
    depends_on:
      - kafka

在上述代码中,我们定义了 Consul 服务发现、Zookeeper、Kafka 和 Kafdrop UI 等服务。

接下来,定义 pet-clinic 微服务:

pet-owner:
  image: "pet-owner-0.1-image"
  ports:
    - "32581:32581"
  depends_on:
    - consul

  pet-clinic:
    image: "pet-clinic-0.1-image"
    ports:
      - "32582:32582"
    depends_on:
      - kafka
      - consul

  pet-clinic-reviews:
    image: "pet-clinic-reviews-0.1-image"
    ports:
      - "32583:32583"
    depends_on:
      - kafka
      - consul

  pet-clinic-concierge:
    image: "pet-clinic-concierge-0.1-image"
    ports:
      - "32584:32584"
    depends_on:
      - consul    

在定义 pet-clinic 微服务的配置时,我们使用 depends_on 指定依赖关系,确保 Docker 按照依赖顺序实例化服务。同时,使用之前创建的 pet-clinic 微服务 Docker 映像进行部署。

以下是部署 pet-clinic 应用程序的步骤:
1. 打开 bash 终端。
2. 切换到存储 docker-compose 文件的目录。
3. 在终端中输入并运行 docker compose up 命令。
4. 等待 Docker 根据 docker-compose 文件中的配置实例化容器。

部署完成后,我们可以在 Docker 仪表板中验证 pet-clinic 应用程序的部署情况:

graph LR
    A[打开 Docker 仪表板] --> B[查看服务状态]
    B --> C[点击服务可查看日志和访问 Web 界面]
    B --> D[检查 Consul 服务发现中微服务的健康状态]

在 Docker 仪表板中,我们可以看到 pet-clinic 应用程序中所有服务的状态。点击某个服务可以监控其日志并访问其 Web 界面(如果有)。此外,我们还可以在 Consul 服务发现中检查 pet-clinic 微服务的健康状态。在 Consul 服务发现中,我们可以观察每个微服务实例的健康状况。

微服务容器编排是任何部署策略的基础。在本文中,我们介绍了 pet-clinic 应用程序的本地 Docker 部署,但使用 docker-compose 构建的容器映像可以部署到任何地方,无论是本地还是云环境。

5. 总结

本文首先讨论了如何使 Micronaut 微服务具备容器化条件,然后深入研究了如何使用 Jib 为每个微服务创建容器映像。接着,我们展示了如何使用 docker-compose 定义所有服务容器配置,并通过一个命令无缝部署所有必需的服务组件。

通过本文的学习,你将掌握微服务容器化和自动化部署的第一手知识,这些技能在微服务应用程序开发和维护中非常受欢迎。

6. 常见问题解答

为了帮助大家更好地理解和应用上述内容,下面列出一些常见问题及解答:
| 问题 | 解答 |
| — | — |
| 什么是 Jib? | Jib 是 Google 推出的一个容器化框架,它可以与 Maven 或 Gradle 等 Java 构建框架无缝结合,简化创建容器(Docker)映像的过程。 |
| 如何在 Micronaut 中使用 Jib 创建 Docker 容器? | 1. 修改项目的 pom 文件,添加 jib-maven-plugin 配置。
2. 打开终端,切换到项目根目录。
3. 运行 mvn compile jib:dockerBuild 命令。 |
| 如何在 Micronaut 中从 Docker 容器连接到 localhost? | 使用 host.docker.internal 代替 localhost 来指向安装在主机操作系统(Docker 外部)上的服务。 |
| 如何在 Micronaut 中使用 docker-compose 部署多服务应用程序? | 1. 创建 docker-compose 文件,定义所有服务及其依赖关系。
2. 打开终端,切换到存储 docker-compose 文件的目录。
3. 运行 docker compose up 命令。 |
| 如何对 Micronaut 微服务应用程序进行 Docker 容器化? | 1. 修改应用配置,确保使用正确的数据源和服务地址。
2. 修改 pom 文件,使用 Jib 进行容器化配置。
3. 运行 mvn compile jib:dockerBuild 命令构建 Docker 映像。 |

在后续的学习中,我们将探索如何监控 Micronaut 中 pet-clinic 应用程序的各个方面。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值