在 ACA (Azure Container Apps) + Dapr 环境中启动Spring Boot WEB服务

在 ACA(Azure Container Apps)+ Dapr 环境下启动 Spring Boot WEB 服务。

为了达到的目标 或者 为了实现所追求的目标

在Azure Container Apps环境中运行Spring Boot WEB服务,以加深对其理解。

实现

将Spring Boot WEB应用程序的Docker镜像部署到Microsoft Azure容器应用程序(ACA),并启用Dapr扩展功能进行启动。

满足

您可以参考以前的文章来了解有关Spring Boot + Dapr的基本操作。

    • Spring Boot REST API に Dapr API からアクセスする手順 (基本編)

 

    Spring Boot REST API に Dapr API からアクセスする手順 (コンテナ編)

IDE (Integrated Development Environment)

    • Windows 11 Home 22H2 を使用しています。

WSL の Ubuntu を操作していきますので macOS の方も参考にして頂けます。

WSL(Microsoft Store应用版)
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu
$ lsb_release -a
没有可用的LSB模块。
发行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
版本:22.04

Java JDK ※ 最小配置 Java JDK 安装和Hello World!
$ java -version
openjdk version “11.0.17” 2022-10-18
OpenJDK Runtime Environment (build 11.0.17+8-post-Ubuntu-1ubuntu222.04)
OpenJDK 64-Bit Server VM (build 11.0.17+8-post-Ubuntu-1ubuntu222.04, mixed mode, sharing)

Maven ※ 最小配置 Maven 安装和Hello World!
$ mvn -version
Apache Maven 3.6.3
Maven home: /usr/share/maven
Java version: 11.0.17, vendor: Ubuntu, runtime: /usr/lib/jvm/java-11-openjdk-amd64

Docker Desktop
版本4.16.3 (96739)

$ docker –version
Docker 版本20.10.22,构建3a2c30b

$ docker-compose –version
Docker Compose 版本v2.15.1

Dapr ※ 安装Dapr CLI的步骤
$ dapr –version
CLI版本:1.10.0
运行时版本:1.10.0

※ 本文将基本上使用Ubuntu终端来执行操作。

显示“Hello World”的步骤

创建Spring Boot WEB应用程序

创建项目文件夹

$ cd ~
$ mkdir -p tmp/hello-spring-dapr
$ cd ~/tmp/hello-spring-dapr

假设~/tmp/hello-spring-dapr是项目文件夹。

创建应用程序类

※ 为了简化构成,我们写下了所有要素。

$ mkdir -p src/main/java/com/example/springdapr
$ vim src/main/java/com/example/springdapr/SpringbootApplication.java

文件的内容 de

package com.example.springdapr;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class SpringbootApplication {

    public static void main(String[] args) {
        SpringApplication.run(SpringbootApplication.class, args);
    }

    @GetMapping("/hello")
    public String hello() {
        return "Hello World!";
    }
}

创建 pom.xml

$ vim pom.xml

文件的内容 de

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.8</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>hello-spring-dapr</artifactId>
    <version>1.0</version>
    <name>hello-spring-dapr</name>

    <properties>
        <java.version>11</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <finalName>app</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

Java应用程序构建

建立
※ 将创建目标/app.jar文件。

$ mvn clean install

使用 Docker 构建镜像

编写Dockerfile

$ vim Dockerfile

文件的内容 de

FROM adoptopenjdk/openjdk11:jdk-11.0.11_9-alpine-slim

WORKDIR /app

COPY target/*.jar app.jar

EXPOSE 8080

ENTRYPOINT ["java","-jar","app.jar"]

建筑

$ docker build -t app-hello-spring-boot .

确认 (què

$ docker images | grep app-hello-spring-boot
app-hello-spring-boot   latest   10c6cdc26e44   52 seconds ago   278MB

应用程序”hello-spring-boot”镜像已创建成功。

获取Azure帐户

利用Azure的免费帐户在云上构建

使用 Azure CLI 进行登录

请参考安装 Azure CLI 的步骤。

$ az login

※ 如果要更新到最新版本

$ az upgrade

蔚藍環境

资源组

创建资源组

$ az group create \
    --name rg-hello \
    --location japaneast

展示资源组的列表

$ az group list

如果要删除资源组

$ az group delete -n <group>

容器注册表 ɡqì

创建容器注册表
※ 无法使用–sku Free进行创建。
※ –name需要是公共的且唯一的值。

$ az acr create \
    --resource-group rg-hello \
    --name cr20230212 \
    --sku Basic

展示容器注册表列表

$ az acr list

显示容器注册表登录凭证的资料

$ az acr update -n cr20230212 --admin-enabled true
$ az acr credential show \
    --resource-group rg-hello \
    --name cr20230212
{
  "passwords": [
    {
      "name": "password",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    },
    {
      "name": "password2",
      "value": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
    }
  ],
  "username": "cr20230212"
}

如果要删除容器注册表,则可以执行以下操作

$ az acr delete --n <acr-name>

登录容器注册表

$ az acr login --name cr20230212

将Docker镜像推送到容器注册表

$ docker tag app-hello-spring-boot cr20230212.azurecr.io/app-hello-spring-boot:latest
$ docker push cr20230212.azurecr.io/app-hello-spring-boot:latest

确认容器注册表中的图像

$ az acr repository list --name cr20230212 --output table
Result
---------------------
app-hello-spring-boot

我成功地将本地的Docker镜像推送到Azure容器注册表。

容器应用环境

只需第一次安装扩展功能。

$ az extension add --name containerapp --upgrade

“Microsoft.App命名空间的注册※仅限首次”

$ az provider register --namespace Microsoft.App

Microsoft.OperationalInsights提供程序注册 ※仅需首次

$ az provider register --namespace Microsoft.OperationalInsights

创建容器应用环境
※ 由于这可能是基于Kubernetes的环境,所以可能需要一些时间。

$ az containerapp env create \
    --resource-group rg-hello \
    --name cae-hello \
    --location japaneast

展示容器应用环境的清单。

$ az containerapp env list

如果要删除容器应用环境。

$ az containerapp env delete -n <env-name> -g <group>

容器应用程序

创建和部署容器应用程序

$ az containerapp create \
    --resource-group rg-hello \
    --environment cae-hello \
    --name ca-hello-spring-boot \
    --image cr20230212.azurecr.io/app-hello-spring-boot:latest \
    --target-port 8080 \
    --ingress 'external' \
    --registry-server cr20230212.azurecr.io \
    --registry-username cr20230212 \
    --registry-password XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX \
    --min-replicas 1 \
    --enable-dapr true \
    --dapr-app-id app-hello-spring \
    --dapr-app-port 8080 \
    --dapr-app-protocol http \
    --dapr-enable-api-logging

一个容器应用已经创建。

Container app created. Access your app at https://ca-hello-spring-boot.yellowsky-adeab038.japaneast.azurecontainerapps.io/

※ 如果要删除容器应用程序

$ az containerapp delete -n <name> -g <group>

通过Azure门户操作容器应用的控制台。
※ 在Azure配置中,默认情况下,Dapar API不会在云环境之外公开。

在容器应用程序中安装 curl。

# apk update
# apk apk add curl
# curl --version
curl 7.79.1 (x86_64-alpine-linux-musl) libcurl/7.79.1 OpenSSL/1.1.1k zlib/1.2.11 brotli/1.0.9 nghttp2/1.43.0

从容器应用程序向Dapr API发送请求并进行确认。

$ curl -X GET http://localhost:3500/v1.0/invoke/app-hello-spring/method/hello
Hello World!

我成功从部署在Azure Container Apps上的容器应用中,通过Dapr API获取到了“Hello World!”。

总结

    • Azure Container Apps にデプロイした Spring Boot アプリの REST API を Dapr API 経由で呼び出すことが出来ました。

Azure Container Apps では Dapr の Service invocation API はコンテナ アプリ側の設定だけで使用出来るようです。

この記事の例ではまだ Spring Boot 側のアプリに Dapr への依存関係はありません。
今後さらに Spring Boot から Dapr クライアントオブジェクトを操作する方法を学ぶ必要があります。

请查阅

Azure容器应用程序命令参考手册

广告
将在 10 秒后关闭
bannerAds