重要要点

  • 结合使用Google Kubernetes Engine(GKE)和Spring Boot,可以快速轻松地设置微服务。
  • Jib是容器化Java应用程序的好方法。 它允许您使用Maven或Gradle在不使用Docker的情况下创建优化的映像。
  • Google的Spring Cloud GCP实施允许开发人员以很少的配置并使用某些Spring的模式来利用Google Cloud Platform(GCP)服务。
  • 使用Cloud Code设置Skaffold可使开发人员拥有良好的开发周期。 这对于开始制作新服务的原型特别有用。

介绍

随着微服务在该行业中的日益普及,可以选择构建应用程序的技术和平台不断涌现。 有时很难选择开始的东西。 在本文中,我将向您展示如何创建一个基于Spring Boot的应用程序,该应用程序利用Google Cloud提供的某些服务。 这是我们在Google团队中使用了很长时间的方法。 希望对你有帮助。

基础

让我们开始定义我们要构建的东西。 我们将从使用Java编写的非常基本的基于Spring Boot的应用程序开始。 Spring是一个成熟的框架,可让我们快速创建功能强大且功能丰富的应用程序。

然后,我们将进行一些更改,以使用Jib (为没有Docker的Java应用程序构建经过优化的Docker和OCI映像)和Java 11的发行版来对应用程序进行容器化。Jib可与Maven和Gradle一起使用。 在本示例中,我们将使用Maven。

接下来,我们将创建一个Google Cloud Platform(GCP)项目,并使用Spring Cloud GCP来利用Cloud Firestore 。 Spring Cloud GCP允许基于Spring的应用程序轻松使用Google服务,例如数据库(Cloud Firestore,Cloud Spanner甚至Cloud SQL),Google Cloud Pub / Sub,用于日志记录和跟踪的Stackdriver。

之后,我们将对应用程序进行更改,以将其部署到Google Kubernetes Engine (GKE)。 GKE是一个托管的,可立即投入生产的环境,用于部署基于容器的基于Kubernetes的应用程序。

最后,我们将使用SkaffoldCloud Code 简化开发。 Skaffold处理构建,推送和部署应用程序的工作流程。 Cloud Code是VS Code和IntelliJ的插件,可与Skaffold和您的IDE配合使用,因此您只需单击一下按钮即可执行将其部署到GKE的操作。 在本文中,我将结合使用IntelliJ和Cloud Code。

设置我们的工具

在编写任何代码之前,请确保我们已经安装了Google Cloud项目和所有工具。

创建一个Google Cloud项目

设置GCP实例很容易。 您可以按照以下说明完成此操作 。 这个新项目将使我们能够将应用程序部署到GKE,获得对数据库(Cloud Firestore)的访问权限,还将使我们拥有一个在容器化应用程序时可以推送映像的地方。

安装云代码

接下来,我们将安装Cloud Code。 您可以按照以下说明将Cloud Code安装到IntelliJ。 Cloud Code管理Skaffold和Google SDK的安装,我们将在本文后面使用。 Cloud Code还使我们能够检查GKE部署和服务。 最重要的是,它还具有一个聪明的GKE开发模式,当检测到更改时,它会不断侦听代码中的更改,从而构建应用程序,构建映像,将映像推送到注册表,将应用程序部署到GKE群集,开始流式传输记录并打开localhost隧道,以便您可以在本地测试服务。 就像魔术!

为了使用Cloud Code并继续我们的应用程序,让我们确保您使用CloudJ插件登录,方法是单击IntelliJ窗口右上方显示的图标:

此外,我们将运行一些命令以确保该应用程序正在您的计算机上运行,​​并且可以与您在Google Cloud中的项目上运行的服务进行通信。 确保我们指向正确的项目,并使用以下方法对您进行身份验证:

gcloud config set project <YOUR PROJECT ID>
gcloud auth login

接下来,我们将确保您的计算机具有在本地运行应用程序的应用程序凭据:

gcloud auth application-default login

启用API

现在我们已经完成了所有设置,我们需要启用将在应用程序中使用的API:

  • Google Container Registry API-这将使我们拥有一个注册表,可以在其中私下推送图像。
  • 数据存储区模式下的Cloud Firestore-这将使我们能够将实体存储在NoSQL数据库中。 确保选择数据存储模式,以便我们可以使用Spring Cloud GCP的支持。

您可以通过访问项目的API仪表板来管理在项目中启用的API

创建我们的狗服务

第一件事第一! 我们需要开始使用可以在本地运行的简单应用程序。 我们将创建一些重要的东西,例如Dog微服务。 因为我使用的是IntelliJ Ultimate,所以我将转到“文件->新建->项目…”,然后选择“ Spring Initializr”。 我将选择Maven,Jar,Java 11,并将名称更改为类似`dog`这样的重要名称,如下所示:



单击下一步并添加:Lombok,Spring Web和GCP支持:


如果一切顺利,您现在应该拥有一个可以运行的应用程序。 如果您不想为此使用IntelliJ,请在您的IDE上使用等效项或使用Spring的Initilizr

接下来,我们将为Dog服务添加一个POJO,并添加几个REST端点来测试我们的应用程序。 我们的狗对象将有一个名字和年龄,我们将使用Lombok的@ 数据注解我们从编写制定者,吸气,等救我们也将使用@ AllArgsConstructor注解来创建一个构造我们。 我们稍后将在创建Dogs时使用它。

@Data
@AllArgsConstructor
public class Dog {
 private String name;
 private int age;
}

我们将为Dog和REST端点创建一个控制器类:

@RestController
@Slf4j
public class DogController {

  @GetMapping("/api/v1/dogs")
  public List<Dog> getAllDogs() {
    log.debug("->getAllDogs");
    return ImmutableList.of(new Dog("Fluffy", 5),
        new Dog("Bob", 6),
        new Dog("Cupcake", 11));
  }

  @PostMapping("/api/v1/dogs")
  public Dog saveDog(@RequestBody Dog dog) {
    log.debug("->saveDog {}", dog);
    return dog;
  }
}

端点返回一个预定义的狗列表,而saveDog端点实际上并没有做很多,但这足以让我们开始。

使用Cloud Firestore

现在我们有了一个骨架应用程序,让我们尝试使用GCP中的某些服务。 Spring Cloud GCP在数据存储区模式下为Google Cloud Firestore添加了Spring Data支持。 我们将使用它来存储我们的Dogs,而不是使用简单的列表。 用户现在也可以在我们的数据库中实际保存“狗”了。

首先,我们将Spring Cloud GCP Data Datastore依赖项添加到我们的POM中:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-gcp-data-datastore</artifactId>
</dependency>

现在,我们可以修改Dog类,以便对其进行存储。 我们将在类型Long的值上添加@ Entity批注和@ Id批注,以充当实体的标识符:

@Entity
@Data
@AllArgsConstructor
public class Dog {
  @Id private Long id;
  private String name;
  private int age;
}

现在我们可以创建一个常规的Spring Repository类,如下所示:

@Repository
public interface DogRepository extends DatastoreRepository<Dog, Long> {}

与Spring Repositories一样,由于我们将使用非常基本的方法,因此无需为此接口编写实现。

现在,我们可以修改控制器类。 我们将DogRepository注入DogController中,然后修改类以使用存储库,如下所示:

@RestController
@Slf4j
@RequiredArgsConstructor
public class DogController {

  private final DogRepository dogRepository;

  @GetMapping("/api/v1/dogs")
  public Iterable<Dog> getAllDogs() {
    log.debug("->getAllDogs");
    return dogRepository.findAll();
  }

  @PostMapping("/api/v1/dogs")
  public Dog saveDog(@RequestBody Dog dog) {
    log.debug("->saveDog {}", dog);
    return dogRepository.save(dog);
  }
}

注意,我们使用Lombok的@ RequiredArgsConstructor创建一个构造函数来注入DogRepository 。 当您运行应用程序时,端点将调用您的Dog服务,该服务将尝试使用Cloud Firestore检索或存储Dog。

提示 :为了快速测试,您可以在IntelliJ中使用以下命令创建HTTP请求:

POST http://localhost:8080/api/v1/dogs
Content-Type: application/json

{
  "name": "bob",
  "age": 5
}

仅需几个步骤,我们现在就可以启动应用程序并从GCP运行并使用服务。 太棒了! 现在,让我们把它变成一个容器并部署它!

集装箱化狗服务

此时,您可以开始编写Dockerfile来容器化我们上面创建的应用程序。 让我们改为使用Jib。 我喜欢Jib的一件事是它将应用程序分成多个层,将依赖项与类分开。 这使我们可以更快地构建,这样您就不必等待Docker重建整个Java应用程序-只需部署已更改的层即可。 另外,Jib有一个Maven插件 ,只需修改应用程序中的POM文件,即可轻松进行设置。

要开始使用插件,我们需要修改POM文件以添加以下内容:

<plugin>
        <groupId>com.google.cloud.tools</groupId>
        <artifactId>jib-maven-plugin</artifactId>
        <version>1.8.0</version>
        <configuration>
          <from>
            <image>gcr.io/distroless/java:11</image>
          </from>
          <to>
            <image>gcr.io/<YOUR_GCP_REGISTRY>/${project.artifactId}</image>
          </to>
        </configuration>
</plugin>

请注意,我们正在使用Java 11的Google发行版映像。“ Distroless”映像仅包含您的应用程序及其运行时依赖项。 它们不包含程序包管理器,shell或您期望在标准Linux发行版中找到的任何其他程序。

将运行时容器中的内容严格限制为应用程序所需的内容是Google和其他在生产中使用了多年容器的技术巨头采用的最佳实践。 它改善了扫描仪的信噪比(例如CVE),并减轻了根据您的需要建立来源的负担。

确保替换上面代码中的GCP注册表以匹配您的项目名称。

完成此操作后,您可以通过运行以下命令来尝试构建和推送应用程序的图像:

$ ./mvnw install jib:build

这将构建并测试应用程序。 创建映像,然后将新创建的映像最终推送到注册表。

注意 :通常,将发行版与特定摘要结合使用而不使用“最新”是一种常见的良好做法。 我将由读者决定要使用的基本映像和摘要,具体取决于您使用的Java版本。

部署狗服务

至此,我们几乎可以部署应用程序了。 为此,首先创建一个GKE集群,在其中部署应用程序。

创建一个GKE集群

要创建GKE集群,请遵循以下说明 。 基本上,您将要访问GKE页面,等待API启用,然后单击按钮创建集群。 您可以使用默认设置,但只需确保单击“更多选项”按钮即可启用对所有Cloud API的完全访问权限:

这使您的GKE节点有权访问其余的Google Cloud服务。 稍后,将创建集群:

Kubernetes内部的应用程序

Kubernetes喜欢监视您的应用程序以确保其已启动并正在运行。 如果发生故障,Kubernetes知道您的应用程序已关闭,并且需要启动一个新实例。 为此,我们需要确保我们的应用程序能够在Kubernetes戳它时做出响应。 让我们添加一个执行器和Spring Cloud Kubernetes。

将以下依赖项添加到您的POM文件:

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

如果您的应用程序src / main / resources目录中有一个application.properties文件,请将其删除并创建一个具有以下内容的application.yaml文件:

spring:
  application:
    name: dog-service

management:
  endpoint:
    health:
      enabled: true

这将为我们的应用程序添加一个名称,并公开上述健康状况端点。 为验证此方法是否有效,您可以在localhost:8080 / actuator / health上访问您的应用程序。您应该看到类似以下内容:

{
    "status": "UP"
}

配置在Kubernetes中运行

为了使我们的应用程序部署到新的GKE集群中,我们需要编写一些其他的YAML。 我们需要创建部署和服务。 使用以下部署。 只需记住用您项目中的名称替换GCR名称:

deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: dog-service
spec:
  selector:
    matchLabels:
      app: dog-service
  replicas: 1
  template:
    metadata:
      labels:
        app: dog-service
    spec:
      containers:
        - name: dog-service
          image: gcr.io/<YOUR GCR REGISTRY NAME>/dog
          ports:
            - containerPort: 8080
          livenessProbe:
            initialDelaySeconds: 20
            httpGet:
              port: 8080
              path: /actuator/health
          readinessProbe:
            initialDelaySeconds: 30
            httpGet:
              port: 8080
              path: /actuator/health

添加具有以下内容的service.yaml文件:

apiVersion: v1
kind: Service
metadata:
  name: dog-service
spec:
  type: NodePort
  selector:
    app: dog-service
  ports:
    - port: 8080
      targetPort: 8080

该部署包含对“就绪性和活跃性”探针的一些更改。 这样一来,Kubernetes便使用这些终结点来戳戳该应用程序,以查看其是否仍在运行。 该服务公开了部署,以便其他服务可以使用它。

完成此操作之后,我们现在可以开始使用本文开头安装的Cloud Code插件。 从工具菜单中,选择: 云代码-> Kubernetes->添加Kubernetes支持 。 这将自动将Skaffold YAML添加到您的应用程序中,并为您进行一些设置,以便您可以通过单击按钮将其部署到群集中。 要确认所有这些工作正常,您可以从IntelliJ的“运行/调试配置”部分检查配置。 如果单击运行在Kubernetes上运行Develop,它应该已经自动选择了GKE集群和Kubernetes配置文件,并且看起来应该像这样:

单击确定,然后单击右上角的绿色“播放”按钮:

之后,Cloud Code将构建应用程序,创建映像,将应用程序部署到您的GKE群集,并将日志从Stackdriver流式传输到本地计算机。 它还将打开一个隧道,以便您可以通过localhost:8080使用服务。 您还可以在Google Cloud Console的工作负载页面达到顶峰:

结论

恭喜您走到现在! 我们在本文中构建的应用程序展示了大多数基于微服务的应用程序将使用的一些关键技术:一个快速,完全托管,无服务器,云原生的NoSQL文档数据库(Cloud Firestore),GKE一个托管的,生产就绪的环境,用于部署Kubernetes基于容器的应用程序,最后使用Spring Boot构建简单的云原生微服务。 在此过程中,我们还学习了如何使用Cloud Code等一些工具来简化您的开发工作流程,并使用Jib使用常见的Java模式来构建容器化的应用程序。

希望本文对您有所帮助,并且您可以尝试这些技术。 如果您觉得这很有趣,请查看Google提供的大量代码实验室 ,从中可以了解Spring和Google Cloud产品。

翻译自: https://www.infoq.com/articles/spring-boot-tutorial/?topicPageSponsorship=c1246725-b0a7-43a6-9ef9-68102c8d48e1

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐