Java / Cloud:如何快速创建支持Kubernetes的REST微服务

可以肯定地说,如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多,从而导致应用程序部署数量增加。 在过去的十年中,开发了诸如Docker和Kubernetes之类的容器化和编排工具,从而使微服务模式真正易于采用。

本文将教您如何使用能够与MySQL数据库交互的公开REST API生成功能全面的微服务,并将其部署到本地Kubernetes集群。 这里的知识可以应用于几乎任何数据库类型,例如Oracle,SQL Server,DB2等。

如果您在本文中遇到麻烦,请随时参考源代码的最终版本,该最终版本可在此GitHub存储库中找到。

速度是关键

作为开发人员,我们在日常工作中力争的一件事就是缩短开发时间。

至此,我们已经可以确定微服务的两个方面,这将使我们的开发时间超出所需的时间:

  1. 我们需要创建一个持久层
  2. 我们需要公开一个REST API

如果我要告诉您,存在一种可以处理这些事情而无需编写任何代码的工具,该怎么办?

Speedment是一个Java ORM工具包和运行时,旨在使开发人员能够超快速地创建超快速的应用程序。 Speedment使用本地Java Streams API进行数据库交互,因此对于新手,经验丰富的退伍军人以及介于两者之间的任何人都非常容易使用。 Speedment带有图形工具,使开发人员能够在几秒钟内生成其数据库的Java表示。

此外,Speedment的捆绑软件系统使开发人员可以轻松扩展基本Toolkit的基本功能。 Spring插件就是这种增强功能之一,它使开发人员能够生成功能齐全的CRUD REST API,以便与他们的数据库进行交互。

在本文的其余部分,您将学习如何使用Speedment Tool生成有效的REST微服务并将其部署到Kubernetes集群。 如果您总体上对Speedment感兴趣,可以在在线手册中找到带有示例的详细文档。

入门

通过Maven分发,Speedment是免费安装的,但需要Java 8或更高版本。 首先,请转到Speedment Initializer ,在这里您将能够下载具有创建微服务所需的所有依赖项的项目模板。 这些是我们将在示例中使用的设置:

如果您的设置不同,例如数据库不同,请确保在初始化程序中应用适当的更改。

完成项目配置后,单击“下载”按钮并解压缩下载的zip文件。 要启动Speedment Tool,请从终端执行以下命令:
mvn speedment:tool
如果这是您第一次运行Speedment Tool,则会要求您连接到数据库。 我们正在运行香草MySQL
我们本地计算机上的Sakila示例数据库 ,因此auth信息如下所示:

填写必填字段后,单击“连接”按钮。 如果您提供的身份验证信息正确,则会显示以下屏幕:

生成微服务

通过Speedment Tool连接到数据库后,即可开始配置可用的各种选项。 您可以使用许多选项,但是出于本文的目的,我们将重点介绍公开REST API所需的选项。

要启用REST API生成,请在树视图中单击“项目”节点,然后选中“启用REST”选项:

我们还启用了“生成REST文档”选项,以自动为我们的REST API生成OpenAPI文档。 此选项不是强制性的,但最终使我们可以更轻松地测试API。

下一步是可选的,但它将使我们的REST路由在美学上更具吸引力。 转到树视图中的数据库架构节点,然后将REST Endpoint的值设置为斜杠(/)。 默认情况下,架构名称包含在生成的REST路由中,此修改会将其删除。

接下来,我们将为下表启用REST控制器的生成:

  • 演员
  • 类别
  • 顾客
  • 电影
  • 员工
  • 商店

无论使用哪个表格,启用控制器生成的步骤都是相同的。 因此,我们仅在Actor表上进行演示。

单击树视图中的Actor表,并启用Generate @RestController选项。 反过来,这将为该表启用几个与REST相关的选项。 您应该启用的我们感兴趣的选项是:

  • REST启用清单
  • REST启用GET
  • REST启用创建
  • REST启用更新
  • REST启用DELETE

我们还将REST端点从/ actor重命名为/ actors(同样仅出于美观目的)。 默认情况下,REST端点的名称与其关联的表相同。 在我们的例子中,重命名是有道理的,因为当我们访问/ actors端点时,将检索参与者列表,而不是单个参与者。

继续并对上面列出的其他表重复这些步骤。 完成后,单击“生成”按钮。 这将生成数据库的Java表示以及必要的REST配置和控制器。

运行微服务

如果我们现在就按原样运行应用程序,则很有可能会崩溃。 这是因为我们尚未指定应用程序用于连接数据库的密码。

当我们生成应用程序时,暴露了许多特定于Speedment的应用程序属性。 其中一个属性就是spring.speedment.password属性,我们可以使用它来设置Speedment连接到数据库所使用的密码。

有两种方法可以指定应用程序属性。 我们将在application.properties文件中定义它们,您应该在应用程序的resources文件夹中创建该文件。

这是我们的application.properties文件的样子:

#应用程序属性文件– START

spring.application.name =速度弹簧应用

spring.speedment.password = sakila

#应用程序属性文件– END

Sakila数据库的默认密码是sakila,但是如果您的数据库使用不同的密码,请确保这些更改反映在application.properties文件中。

完成所有配置后,即可运行应用程序。 这是通过从项目的根文件夹执行以下命令来完成的:
mvn spring-boot:run

如果启用了“生成REST文档”选项,则可以访问
http:// localhost:8080 / swagger-ui.html访问REST API文档:

您可以手动执行请求,也可以直接从Swagger UI执行请求。 如果要在浏览器中访问http:// localhost:8080 / actors ,我们将获得一个JSON响应,其中包含存储在数据库中的actor列表:

 [ { "actorId": 1, "firstName": "PENELOPE", "lastName": "GUINESS" }, { "actorId": 2, "firstName": "NICK", "lastName": "WAHLBERG" }, { "actorId": 3, "firstName": "ED", "lastName": "CHASE" },  ... TRUNCATED ...  ] 

部署前

在开始微服务的部署过程之前,请确保您在本地计算机上安装了以下依赖项:Docker,kubectl,Minikube和Skaffold。

Docker化我们的微服务

在将微服务实际部署到Kubernetes集群之前,我们需要将其转换为Kubernetes可以实际使用的格式。 Kubernetes是一个容器编排工具,因此Docker就是在这里帮助我们进行容器创建过程的。

在项目的根目录中,创建一个包含以下内容的Dockerfile:

 FROM openjdk:11-slim-buster  EXPOSE 8080  ARG JAR_LOCATION=target  ARG JAR_NAME=speedment-spring-app  ARG JAR_VERSION=1.0.0  ADD ${JAR_LOCATION}/${JAR_NAME}-${JAR_VERSION}.jar app.jar  ENTRYPOINT ["java", "-jar", "app.jar", "--spring.speedment.host=sakila"] 

导出的参数(JAR_LOCATION,JAR_NAME,JAR_VERSION)对于您的项目可能有所不同,具体取决于您在pom.xml文件中提供的信息。 在项目的根目录中,执行以下命令:


mvn install

这将使用包含您的微服务的JAR文件创建一个目标文件夹。 确保文件的名称和版本与您放入Dockerfile中的信息匹配。

创建部署配置

我们将向Kubernetes集群部署两个映像:Sakila数据库和微服务。 Sakila数据库已经有一个公开可用的Docker映像:restsql / mysql-sakila。 但是,我们需要为微服务构建映像。 这是我们之前创建的Dockerfile派上用场的地方。 稍后,我们将使用一个名为Skaffold的工具为我们的微服务创建映像,并将其在部署过程中使用。

首先在项目的根目录中创建一个名为k8s的文件夹。 您将在这里存储所有的Kubernetes 部署和服务配置。 我们将微服务和数据库配置分开,因此在k8s文件夹中创建两个名为storage和app的文件夹。

现在,我们继续进行Sakila数据库的配置。 在存储文件夹中,我们将创建两个YAML文件– sakila-deployment.yml和sakila-service.yml。 sakila-deployment.yml文件将存储我们对Sakila数据库的部署配置。 由于这不是Kubernetes教程,因此我们仅提供最终配置。 这是sakila-deployment.yml文件的最终外观:

 apiVersion: apps/v1  kind: Deployment  metadata: name: sakila labels: storage: sakila  spec: replicas: 1 selector: matchLabels: storage: sakila template: metadata: labels: storage: sakila spec: containers: - name: sakila image: restsql/mysql-sakila ports: - containerPort: 3306 

这是最终的sakila-service.yml文件:

 apiVersion: v1  kind: Service  metadata: name: sakila labels: storage: sakila  spec: selector: storage: sakila ports: - name: database port: 3306 targetPort: 3306 

我们的微服务的部署和服务配置几乎相同。 在app文件夹中,创建一个名为speedment-spring-app-deployment.yml的YAML文件,其内容如下:

 apiVersion: apps/v1  kind: Deployment  metadata: name: speedment-spring-app labels: app: speedment-spring-app  spec: replicas: 1 selector: matchLabels: app: speedment-spring-app template: metadata: labels: app: speedment-spring-app spec: containers: - name: speedment-spring-app image: speedment-spring-app-example ports: - containerPort: 8080 

在同一文件夹中,创建另一个名为speedment-spring-app-service.yml的YAML文件,其内容如下:

 apiVersion: v1  kind: Service  metadata: name: speedment-spring-app  spec: selector: app: speedment-spring-app ports: - name: http port: 8080 targetPort: 8080 type: NodePort 

这些是我们部署数据库和应用程序所需的所有配置。 添加部署配置后,我们的文件结构应如下所示:

启动集群

部署的准备工作几乎完成了。 我们需要做的最后一件事–启动本地Kubernetes集群。 这是通过执行以下命令来完成的:
minikube start

部署

为了部署我们的数据库和应用程序,我们将使用Skaffold。 在项目的根目录中,创建一个名为skaffold.yml的文件,其中包含以下内容:

 apiVersion: skaffold/v2alpha3  kind: Config  build: artifacts: - image: speedment-spring-app-example docker: dockerfile: Dockerfile  deploy: kubectl: manifests: - k8s/app/* - k8s/storage/* 

完成此文件后,我们终于可以进行部署了。 在项目根目录中,执行以下命令:
skaffold dev --port-forward=true

当我们执行此命令时,将发生两件事:

  1. 将从我们之前创建的Dockerfile创建一个Docker映像
  2. 部署和服务将根据我们之前创建的配置进行创建

微服务启动后,就可以像以前一样使用它。 现在唯一的区别是它是从Kubernetes集群运行的。

注意: Sakila数据库完全启动大约需要30-60秒。 由于我们的应用程序启动速度比Sakila数据库快得多,因此它很可能崩溃并在数据库准备就绪之前重新启动几次。

摘要

以省时的方式创建应用程序有时可能很困难。 我们已经解释了如何从数据库生成微服务并将其部署到Kubernetes集群,因此希望您已经学到了一些可以减少开发时间的知识。

我们希望您喜欢阅读本文并喜欢撰写本文。 可以找到本文源代码的最终版本
在这里 。

s

Per Minborg

米斯拉夫·米利切维奇(MislavMiličević)

资源资源

Speedment Initializer能够生成项目模板

GitHub上的Speedment OpenSource
加速在线手册
Github仓库以及最终版本的源代码

Sakila示例数据库

翻译自: https://www.javacodegeeks.com/2020/04/java-cloud-how-to-quickly-create-a-kubernetes-ready-rest-microservice.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/339768.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用Spring Boot和Project Reactor处理SQS消息-第2部分

这是我关于使用Spring Boot和Project Reactor有效处理SQS消息的博客文章的后续文章 我在第一部分中列出了一些方法上的差距。 1.处理SQS客户端调用中的失败 2.该方法一次只能处理来自SQS的一条消息,如何并行化 3.它不处理错误,管道中的任何错误都会中…

java爬虫jsoup_Java爬虫之利用Jsoup自制简单的搜索引擎

内容导读在上述代码中,url为输入词条(暂时仅限于英文),进入while循环可一直搜索,当输入为’exit’时退出。contentText为该词条的百度百科简介的网页形式,通过正则表达式将其中的文字提取出来。代码虽然简洁,但是功能还…

matplotlib的默认字体_浅谈matplotlib默认字体设置探索

控制默认字体的设置根据官方文档https://matplotlib.org/tutorials/text/text_props.html#default-font可知:The base default font is controlled by a set of rcParams默认字体是由一组rcParams控制的。rcParamusage‘font.family"List of either names of f…

java空心菱形_java 空心菱形

分为两部分,先打印前四行,再打印后三行,int n 4;    //设初始值为4for(int i0;ifor(int j0;jSystem.out.print(" ");}for(int k0;kif(k0||k2*i) {    //打印前四行的*,中间部分输出空格System.out.print(&quo…

java接口版本控制_为什么要在Java中控制类和接口的可见性

java接口版本控制维护是软件开发的重要方面之一,并且经验证明,保持较低组件可视性的软件比暴露更多组件的软件更易于维护。 您不会在一开始就意识到它,但是在重新设计应用程序时会严重错过它。 由于保持向后兼容性是许多应用程序的“必须具备…

遮掩java_css之图片下方定位遮掩层

需要的效果如图,图片下方加个遮掩层:html:css:.listContent>div{width:300px;height: 300px;float: left;margin-top: 20px;margin-left: 20px;position:relative;}.mask{width:300px;height: 40px;background-color:#FFCCCC;p…

使用JDK的密码流的加密怪癖(以及如何做)

在我们的日常工作中,我们经常遇到经常性的主题,即将数据(例如文件)从一个位置传输到另一个位置。 这听起来像是一个非常简单的任务,但让我们通过声明这些文件可能包含机密信息并可以通过非安全的通信渠道进行传输这一事…

学java专科_专科学历可以学习java开发吗

学习Java的热潮越来越高涨,除了转行而来的人,很多刚毕业的学生也加入到其中。很多人都觉得学习Java需要有一个高学历作为基础,一些专科生在学习之前会犹豫,他们是否能学习Java,首先学程序开发,入行Java开发…

具有InlfuxDB的Spring Boot和Micrometer第3部分:Servlet和JDBC

在上一个博客中,我们使用由InfluxDB支持的千分尺设置了反应式应用程序。 在本教程中,我们将使用传统的带JDBC阻塞式Servlet的Spring Stack。 我选择的数据库是postgresql。 我将使用与先前博客文章相同的脚本。 因此,我们将拥有初始化数据库…

jsf xhtml调用方法_JSF的工作方式以及调试方法–可以使用polyglot吗?

jsf xhtml调用方法JSF不是我们通常认为的那样。 这也是一个调试起来可能有些棘手的框架,尤其是在初次遇到时。 在这篇文章中,让我们继续探讨为什么会出现这种情况,并提供一些JSF调试技术。 我们将讨论以下主题: JSF不是我们经常想…

将Auth0 OIDC(OAUTH 2)与授权(组和角色)集成

如果您正在使用Auth0对多个现有应用程序中的用户进行身份验证和授权,则可能需要将下一个Web应用程序与Auth0集成。 有多种方法可以执行此操作,例如,如果要将Jenkins与Auth0集成,则可以使用SAML v2;否则,可…

tomee_一罐将其全部统治:Apache TomEE + Shrinkwrap == JavaEE引导

tomee警告:我不是Spring Boot的专家。 我发现很多事情对此非常有趣,并且当然可以真正改善您的日常工作。 而且,我对Spring Boot没有任何反对,也没有开发或使用它的人。 但是我认为社区高估了该产品。 一年前,我开始收…

使用Spring Boot和Project Reactor处理SQS消息

我最近参与了一个项目,在该项目中,我不得不有效地处理通过AWS SQS Queue流入的大量消息。 在这篇文章(可能还有一篇)中,我将介绍使用出色的Project Reactor处理消息的方法。 以下是我要进行的设置: 设置本…

初级测试开发面试题_初级开发人员在编写单元测试时常犯的错误

初级测试开发面试题自从我编写第一个单元测试以来已经有10年了。 从那时起,我不记得我已经编写了成千上万的单元测试。 老实说,我在源代码和测试代码之间没有任何区别。 对我来说是同一回事。 测试代码是源代码的一部分。 在过去的3-4年中,我…

使用SoapUI调用安全WCF SOAP服务–第1部分,该服务

在这个由三部分组成的传奇中,我将演示如何使用SoapUI API工具来调用安全的SOAP服务。 首先,我将专注于创建服务,在接下来的文章中它将充当被测系统。 使用基本身份验证传输安全性机制维护对该服务中资源的访问。 Windows Communication Foun…

java简单系统_Java简单学生管理系统

Java简单学生管理系统这个不需要手动输入,笔记记录//studentpublic class student(){private String id;//学号private String name;//姓名private int age;//年龄public String getId() {return id;}public void setId(String id) {this.id id;}public String get…

kafka java编程demo_Kafka简单客户端编程实例

今天,我们给大家带来一篇如何利用Kafka的API进行客户端编程的文章,这篇文章很简单,就是利用Kafka的API创建一个生产者和消费者,生产者不断向Kafka写入消息,消费者则不断消费Kafka的消息。下面是具体的实例代码。一、创…

java我的世界极限生存_我的世界 1.7.10 极限生存整合包

整合包介绍:最近总有人觉得Minecraft很无聊,没有什么可玩的,或者觉得生存太简单 那么就来试试这个吧,全部是增强怪物的MOD,保证不无聊,保证不简单 基本上没有增加一些新的东西,只增加了几种怪物…

具有InlfuxDB的Spring Boot和Micrometer第1部分:基础项目

对于那些关注此博客的人来说,难怪我倾向于大量使用InfluxDB。 我喜欢这样一个事实,它是一个真正的单一用途的数据库(时间序列),具有许多功能,并且还带有企业支持。 Spring也是我选择的工具之一。 因此&…

PIT,JUnit 5和Gradle –仅需额外的一行配置

在Gradle(带有gradle-pitest-plugin 1.4.7)中发现简单,经过改进的PIT和JUnit 5配置。 不可否认,如今JUnit 5越来越受欢迎。 虽然为JUnit 5提供了一个专用于PIT的插件,并且gradle-pitest-plugin支持了很多年&#xff0…