在本文中,您将学习如何在 Knative 上运行相互通信的 Spring Boot 微服务 。我还将向您展示如何使用 GraalVM 准备 Spring Boot 应用程序的本机映像。然后我们将使用 Skaffold 和 Jib Maven 插件在 Kubernetes 上运行它。
在 Knative 上,您可以运行任何类型的应用程序——不仅仅是一个函数。在这篇文章中,当我写“微服务”时,其实我在思考的是服务到服务的通信。
源代码
如果您想自己尝试一下,可以随时查看我的源代码。为此,您需要克隆我的 GitHub 存储库 。
作为本文中的微服务示例,我使用了两个应用程序callme-service和caller-service. 它们都公开了一个端点,该端点打印了应用程序 pod 的名称。caller-service应用程序还调用应用程序公开的端点callme-service。
在 Kubernetes 上,这两个应用程序都将部署为多个修订版的 Knative 服务。我们还将使用 Knative 路由在这些修订中分配流量。下面可见的图片说明了我们示例系统的 架构 。
1.准备Spring Boot微服务
我们有两个简单的 Spring Boot 应用程序,它们公开一个 REST 端点、健康检查和运行内存 H2 数据库。我们使用 Hibernate 和 Lombok。因此,我们需要在 Maven 中包含以下依赖项列表pom.xml。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.16</version> </dependency>
每次我们调用ping端点时,它都会创建一个事件并将其存储在 H2 数据库中。REST 端点返回 Kubernetes 内的 pod 和命名空间的名称以及事件的 id。该方法在我们对集群的手动测试中很有用。
@RestController @RequestMapping(<font>"/callme"</font><font>) <b>public</b> <b>class</b> CallmeController { @Value(</font><font>"${spring.application.name}"</font><font>) <b>private</b> String appName; @Value(</font><font>"${POD_NAME}"</font><font>) <b>private</b> String podName; @Value(</font><font>"${POD_NAMESPACE}"</font><font>) <b>private</b> String podNamespace; @Autowired <b>private</b> CallmeRepository repository; @GetMapping(</font><font>"/ping"</font><font>) <b>public</b> String ping() { Callme c = repository.save(<b>new</b> Callme(<b>new</b> Date(), podName)); <b>return</b> appName + </font><font>"(id="</font><font> + c.getId() + </font><font>"): "</font><font> + podName + </font><font>" in "</font><font> + podNamespace; } } </font>
这是我们的模型类 - Callme。应用程序中的模型类caller-service非常相似。
@Entity @Getter @Setter @NoArgsConstructor @RequiredArgsConstructor <b>public</b> <b>class</b> Callm