生成 Spring Cloud Gateway

已完成

在本模块中,我们将生成 Spring Cloud 网关并将其部署在 Azure Spring Apps 上。

网关用于将公共 HTTP 流量路由到微服务:

  • 它们处理路由逻辑。
  • 它们会保护对微服务(不公开可用)的访问。
  • 它们还可以具有服务质量 (QoS) 功能,例如执行 HTTP 速率限制。

创建 Spring Cloud Gateway

为了创建网关,我们结合使用 https://start.spring.io 与命令行:

curl https://start.spring.io/starter.tgz -d type=maven-project -d dependencies=cloud-gateway,cloud-eureka,cloud-config-client -d baseDir=todo-gateway -d bootVersion=3.1.5.RELEASE -d javaVersion=17 | tar -xzvf -

注意

我们使用 Cloud GatewayEureka Discovery ClientConfig Client 组件。

配置应用程序

src/main/resources/application.properties 配置文件中,添加以下属性:

spring.main.allow-bean-definition-overriding=true
spring.cloud.gateway.discovery.locator.enabled=true
  • spring.main.allow-bean-definition-overriding=true 部分是配置 Spring Cloud 网关以使用 Azure Spring Apps 客户端库中配置的 Spring Cloud Discovery 服务器 bean。
  • spring.cloud.gateway.discovery.locator.enabled=true 部分用于将 Spring Cloud Gateway 配置为使用 Spring Cloud Service Registry 发现可用的微服务。

在 Azure Spring Apps 上创建应用程序

与上一模块中一样,在 Azure Spring Apps 实例中创建特定的 todo-gateway 应用程序。 由于此应用程序是网关,因此我们添加了 --assign-endpoint 标志,以便其公开显示。

az spring app create --name todo-gateway --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" --runtime-version Java_17 --assign-endpoint

部署应用程序

现在,可以生成“todo-gateway”项目并将其发送到 Azure Spring Apps

cd todo-gateway
./mvnw clean package -DskipTests
az spring app deploy --name todo-gateway --service "$SPRING_CLOUD_NAME" --resource-group "$RESOURCE_GROUP_NAME" --artifact-path target/demo-0.0.1-SNAPSHOT.jar
cd ..

在云中测试项目

  1. 转到 Azure Spring Apps 实例中的“应用”。

    1. 验证“todo-gateway”是否存在显示“1/1”的注册状态。 此信息表明该应用程序已在 Spring Cloud 服务注册表中正确注册。
    2. 选择“todo-gateway”以获取有关微服务的详细信息。
  2. 复制/粘贴提供的公共 URL。 妥善保存此 URL,以便用于后续部分。

    有一个测试终结点(类似微服务)但网关在 Internet 上直接公开,因此我们使用公共 URL。

由于网关已连接到 Spring Cloud Service Registry,因此它应该已经自动打开到可用微服务的路由,其 URL 路径的格式为 /MICROSERVICE-ID/**:[MICROSERVICE-ID 必须使用大写字母]

通过执行以下命令来测试 todo-service 微服务终结点:curl https://XXXXXXXX-todo-gateway.azuremicroservices.io/TODO-SERVICE/(将 XXXXXXXX 替换为 Azure Spring Apps 实例的名称)。

与上一模块中一样,此命令的结果应该是最初插入 MySQL 数据库中的三个项目:

[{"id":"1","description":"First item","done":true},{"id":"2","description":"Second item","done":true},{"id":"3","description":"Third item","done":false}]