Java / Cloud:如何快速创建支持Kubernetes的REST微服务
可以肯定地说,如今微服务与云的结合风靡一时。 微服务的开发比以往任何时候都多,从而导致应用程序部署数量增加。 在过去的十年中,开发了诸如Docker和Kubernetes之类的容器化和编排工具,从而使微服务模式真正易于采用。
本文将教您如何使用能够与MySQL数据库交互的公开REST API生成功能全面的微服务,并将其部署到本地Kubernetes集群。 这里的知识可以应用于几乎任何数据库类型,例如Oracle,SQL Server,DB2等。
如果您在本文中遇到麻烦,请随时参考源代码的最终版本,该最终版本可在此GitHub存储库中找到。
速度是关键
作为开发人员,我们在日常工作中力争的一件事就是缩短开发时间。
至此,我们已经可以确定微服务的两个方面,这将使我们的开发时间超出所需的时间:
- 我们需要创建一个持久层
- 我们需要公开一个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,请从终端执行以下命令:
如果这是您第一次运行Speedment Tool,则会要求您连接到数据库。 我们正在运行香草MySQL
mvn speedment:tool
我们本地计算机上的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
当我们执行此命令时,将发生两件事:
- 将从我们之前创建的Dockerfile创建一个Docker映像
- 部署和服务将根据我们之前创建的配置进行创建
微服务启动后,就可以像以前一样使用它。 现在唯一的区别是它是从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
Java / Cloud:如何快速创建支持Kubernetes的REST微服务相关推荐
- java调用webservice_笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解...
原标题:笃学私教:Java开发网站架构演变过程-从单体应用到微服务架构详解 Java开发网站架构演变过程,到目前为止,大致分为5个阶段,分别为单体架构.集群架构.分布式架构.SOA架构和微服务架构.下 ...
- 服务网格——后 Kubernetes 时代的微服务(前言)
目录 重要观点 阅读本文之前 Kubernetes vs Service Mesh kube-proxy 组件 kube-proxy 的缺陷 Kubernetes Ingress vs Istio G ...
- Service Mesh(服务网格)——后 Kubernetes 时代的微服务
本文转载自:宋净超的博客 这不是一篇教程,本文试图带您梳理清楚 Kubernetes.Envoy(xDS 协议)以及 Istio Service Mesh 之间的关系及内在联系.本文介绍了 Kuber ...
- 使用spring boot+kubernetes构建完整微服务平台
微服务架构被认为是构建大型复杂系统的最佳理论指导,其采用了分而治之.单一职责.关注点分离等方法论来设计系统架构.微服务的实现方式和思路有很多种,本文简述基于kubernetes的微服务平台建设思路及技 ...
- 为什么 kubernetes 天然适合微服务
最近总在思考,为什么在支撑容器平台和微服务的竞争中,Kubernetes 会取得最终的胜出,事实上从很多角度出发三大容器平台从功能方面来看,最后简直是一摸一样. 参考 Docker, Kubernet ...
- 后Kubernetes时代的微服务
\ 本文要点 \\ 当前微服务架构依然是最流行的分布式系统架构风格.Kubernetes和云原生运动已大规模地重新定义了应用设计和开发中的一些方面.\\t 在云原生平台上,服务仅具备可观测性是不够的. ...
- 马斯洛理论告诉你,Kubernetes可以满足微服务的这些需求
需求层次理论是由心理学家艾伯特·马斯洛设计的,它是一种解释人类动机的心理学理论,它由多层次的人类需求模型组成,通常被描述成金字塔内的等级层次.马斯洛使用诸如生理.安全.归属感和爱.尊重.自我实现和自我 ...
- 借助 Cloud Toolkit 快速创建 Dubbo 工程
Cloud Toolkit 是一个 IDE 插件,帮助开发者更高效地开发.测试.诊断并部署应用.在最新版的插件中,提供了快速创建 Dubbo 工程的功能,下面就来快速体验下吧. Dubbo 采用全 S ...
- Oracle Java Cloud系列(02)——创建Java云的应用服务器实例 及 数据库云实例
本指南为整个系列的第二篇,介绍如何创建Oracle数据库云服务与Java云服务,文章整体将分为下面三个部分: 第一步:创建服务前准备 - 密钥与云存储容器 第二步:创建数据库云服务 第三步:创建Jav ...
最新文章
- ScratchCardView:刮刮卡视图组件
- 深入解析Linux中的fork函数
- html文档中media=all是什么
- centos7 rabbitmq安装/配置
- 项目已被os x使用 不能打开-黑苹果之路
- c++ cout 控制精度、宽度、进制
- 转:Web页面通过URL地址传递参数常见问题及检测方法
- numpy 在机器学习中 常用函数总结
- 创造新世界--全国模拟(二)
- Shell脚本字符串截取方法总结
- linux 3t 硬盘无法识别,希捷(3T)硬盘故障处理备忘
- 网易涉暴力裁员引众怒 5大争议背后是否违法?
- http://jingyan.baidu.com/article/a3761b2b66fe141577f9aa51.html
- 在钉钉小程序中实现录音和播放功能实例
- java 吸血鬼数字_java编程思想之吸血鬼数字
- 2020届部分校招IC笔试题
- python量化分析岗位_量化金融有哪些职位可以选择?
- sdust-Java-字符串集合求并集 (10分)
- SQL server 清空数据库所有表
- SpringCloud-Zuul常用路由网关
热门文章
- ssl2648-线段树练习5【线段树】
- 【做题记录】图论杂题
- codeforces1453 E. Dog Snacks
- 北京区域赛I题,Uva7676,A Boring Problem,前缀和差分
- 40、使用javassit操作运行时字节码文件
- HighChart模拟点击series的name显示隐藏
- JavaFX官方教程(六)之带有JavaFX CSS的花式表单
- MySQL date_add()函数​​​​​​​
- Jdk8一行代码读取文件
- Java中关于String类型的10个问题