生成 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 Gateway
、Eureka Discovery Client
和 Config 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 ..
在云中测试项目
转到 Azure Spring Apps 实例中的“应用”。
- 验证“todo-gateway”是否存在显示“1/1”的注册状态。 此信息表明该应用程序已在 Spring Cloud 服务注册表中正确注册。
- 选择“todo-gateway”以获取有关微服务的详细信息。
复制/粘贴提供的公共 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}]