微服务部署:从容器化到自动化部署
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 微服务,以便在部署时暴露该端口。
- 修改 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>
-
构建映像
:
- 打开终端并切换到 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 服务器和端口的设置。
- 修改 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>
-
构建映像
:
- 打开终端并切换到 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 服务器和端口的设置。
- 修改 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>
-
构建映像
:
- 打开终端并切换到 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 默认区域和端口的设置。
- 修改 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>
-
构建映像
:
- 打开终端并切换到 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 应用程序的各个方面。
超级会员免费看

被折叠的 条评论
为什么被折叠?



