使用Spring Boot和GraalVM在Knative上构建微服务

本文介绍了如何在Knative上运行Spring Boot微服务,利用GraalVM创建原生镜像以提升启动速度,并展示了如何配置Jaeger进行追踪。通过Skaffold和Jib部署到Knative,并对比了原生镜像与传统方式的性能差异。
摘要由CSDN通过智能技术生成

在本文中,您将学习如何在 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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值