快如闪电的扩容:秒级启动,弹性伸缩让您无忧

news2024/11/18 4:22:23

文章目录

    • 快速扩容:秒级启动,弹性伸缩
      • 服务器秒级启动
      • 服务秒级启动
        • 升级JDK的版本
        • 通过将应用程序打包成WAR文件并部署到已经启动的Tomcat服务器上来实现秒级启动
        • 使用Spring Cloud Function和云原生技术来构建无服务器应用程序,可以实现秒级启动
          • Spring Cloud Function使用了几种技术来缩短应用程序启动时间
          • 实现秒级启动的步骤
            • 将应用程序划分为可独立部署和运行的模块
            • 使用JVM缓存技术,预热机制和功能模块化来缩短Lambda函数的启动时间。
            • 使用无服务器架构来运行应用程序
            • 使用AWS Lambda、Azure Functions、Google Cloud Functions等云服务提供商来托管应用程序
        • 使用Spring Boot的DevTools模块支持应用程序的热重载,可以在不重新启动应用程序的情况下更新应用程序
      • 弹性伸缩
        • 创建专用网络VPC
        • 安全组
        • 创建云服务器
        • 打包部署
        • Java环境
        • 启动项目
        • 开机启动任意服务
          • 1. 制作服务文件
          • 2. 制作启动脚本
          • 3. 制作停止脚本
          • 4. 增加执行权限
          • 5. 设置开机启动
        • 创建镜像
        • 继续创建多台云服务器
        • 负载均衡
        • 创建弹性伸缩
        • redis的报警规则
        • 白名单

📕我是廖志伟,一名Java开发工程师、Java领域优质创作者、CSDN博客专家、51CTO专家博主、阿里云专家博主、清华大学出版社签约作者、产品软文创造者、技术文章评审老师、问卷调查设计师、个人社区创始人、开源项目贡献者。🌎跑过十五公里、徒步爬过衡山、🔥有过三个月减肥20斤的经历、是个喜欢躺平的狠人。

📘拥有多年一线研发和团队管理经验,研究过主流框架的底层源码(Spring、SpringBoot、Spring MVC、SpringCould、Mybatis、Dubbo、Zookeeper),消息中间件底层架构原理(RabbitMQ、RockerMQ、Kafka)、Redis缓存、MySQL关系型数据库、 ElasticSearch全文搜索、MongoDB非关系型数据库、Apache ShardingSphere分库分表读写分离、设计模式、领域驱动DDD、Kubernetes容器编排等。🎥有从0到1的高并发项目经验,利用弹性伸缩、负载均衡、报警任务、自启动脚本,最高压测过200台机器,有着丰富的项目调优经验。

以梦为马,不负韶华

希望各位读者大大多多支持用心写文章的博主,现在时代变了,信息爆炸,酒香也怕巷子深,博主真的需要大家的帮助才能在这片海洋中继续发光发热,所以,赶紧动动你的小手,点波关注❤️,点波赞👍,点波收藏⭐,甚至点波评论✍️,都是对博主最好的支持和鼓励!

  • 💂 博客主页: 我是廖志伟
  • 👉开源项目:java_wxid
  • 🌥 哔哩哔哩:我是廖志伟
  • 🎏个人社区:幕后大佬
  • 🔖个人微信号SeniorRD

📥博主的人生感悟和目标

探寻内心世界,博主分享人生感悟与未来目标

  • 🍋程序开发这条路不能停,停下来容易被淘汰掉,吃不了自律的苦,就要受平庸的罪,持续的能力才能带来持续的自信。我本是是一个很普通程序员,放在人堆里,除了与生俱来的盛世美颜,就剩180的大高个了,就是我这样的一个人,默默写博文也有好多年了。
  • 📺有句老话说的好,牛逼之前都是傻逼式的坚持,希望自己可以通过大量的作品、时间的积累、个人魅力、运气、时机,可以打造属于自己的技术影响力。
  • 💥内心起伏不定,我时而激动,时而沉思。我希望自己能成为一个综合性人才,具备技术、业务和管理方面的精湛技能。我想成为产品架构路线的总设计师,团队的指挥者,技术团队的中流砥柱,企业战略和资本规划的实战专家。
  • 🎉这个目标的实现需要不懈的努力和持续的成长,但我必须努力追求。因为我知道,只有成为这样的人才,我才能在职业生涯中不断前进并为企业的发展带来真正的价值。在这个不断变化的时代,我必须随时准备好迎接挑战,不断学习和探索新的领域,才能不断地向前推进。我坚信,只要我不断努力,我一定会达到自己的目标。

CSDN

📙经过多年在CSDN创作上千篇文章的经验积累,我已经拥有了不错的写作技巧。同时,我还与清华大学出版社签下了四本书籍的合约,并将陆续在明年出版。这些书籍包括了基础篇、进阶篇、架构篇的📌《Java项目实战—深入理解大型互联网企业通用技术》📌,以及📚《解密程序员的思维密码–沟通、演讲、思考的实践》📚。具体出版计划会根据实际情况进行调整,希望各位读者朋友能够多多支持!

🌾阅读前,快速浏览目录和章节概览可帮助了解文章结构、内容和作者的重点。了解自己希望从中获得什么样的知识或经验是非常重要的。建议在阅读时做笔记、思考问题、自我提问,以加深理解和吸收知识。阅读结束后,反思和总结所学内容,并尝试应用到现实中,有助于深化理解和应用知识。与朋友或同事分享所读内容,讨论细节并获得反馈,也有助于加深对知识的理解和吸收。

💡在这个美好的时刻,本人不再啰嗦废话,现在毫不拖延地进入文章所要讨论的主题。接下来,我将为大家呈现正文内容。


快速扩容:秒级启动,弹性伸缩

服务器秒级启动

阿里云的ACK可以做到秒级启动,文档说明:通过kubectl快速搭建魔方游戏
华为云的云容器引擎 CCE可以做到秒级启动,访问链接:https://www.huaweicloud.com/product/cce.html

服务秒级启动

服务启动没有相关的产品,大多数情况都很难做到真正的秒级启动,通常都是对其进行优化,提供访问速度。

Spring Boot应用程序可以使用Spring Boot内置的Tomcat服务器快速启动,但它并不支持秒级启动。然而,对于需要秒级启动的场景,可以考虑使用以下几个方案:

升级JDK的版本

高版本的jdk做了很多优化,能提升服务启动的速度,例如jdk21版本优化了虚拟线程提升并发、新的垃圾回收器更强劲,更好的算法、更高效的工具或更新的类库版本,都有助于提高应用程序的性能和启动速度。

通过将应用程序打包成WAR文件并部署到已经启动的Tomcat服务器上来实现秒级启动

这种方式可以使用Spring Boot的maven插件将应用程序打包成WAR文件,并将WAR文件部署到Tomcat服务器中。这样做可以节省启动服务器的时间,但仍然需要一定的时间来完成新应用程序的部署和启动。当你将WAR文件部署到Tomcat服务器上时,Tomcat会自动将该WAR文件解压缩到一个文件夹中,并在服务器上自动创建一个应用程序上下文。应用程序上下文是指虚拟Web应用程序的目录,其中存放了Web应用程序的资源文件,包括JSP文件、HTML文件、Servlet类文件等。一旦应用程序上下文被创建,Tomcat就会将该应用程序注册到Servlet容器中,以便于处理客户端请求。客户端可以通过Web浏览器访问应用程序上下文,访问应用程序中的不同资源。因此,当WAR文件部署到Tomcat服务器上时,Tomcat会自动将应用程序注册到Servlet容器中,并开始处理客户端发来的请求,从而实现对应用程序接口的访问。
使用Spring Boot的maven插件将应用程序打包成WAR文件非常简单,只需要在pom.xml文件中添加以下配置:

<packaging>war</packaging>
<build>
	<plugins>
		<plugin>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-maven-plugin</artifactId>
			<version>2.5.2</version>
			<executions>
				<execution>
					<goals>
						<goal>repackage</goal>
					</goals>
				</execution>
			</executions>
		</plugin>
	</plugins>
</build>
使用Spring Cloud Function和云原生技术来构建无服务器应用程序,可以实现秒级启动

Spring Cloud Function是可以部署在云平台上的无状态函数式服务框架,可以将Spring Boot应用程序转换为无服务器函数。这种方式可以使用AWS Lambda或Google Cloud Functions等云原生平台。Spring Cloud Function是一款基于Spring Framework构建的,支持编写无服务器Lambda函数的工具,使用它可以让开发人员轻松地将Spring应用程序转换为无服务器Lambda函数。

Spring Cloud Function使用了几种技术来缩短应用程序启动时间

1、预热机制 预热机制可以缩短Lambda函数的启动时间。在函数被调用前,Lambda使用一个空白的容器(Cold Start)启动,这是因为为了避免资源浪费,AWS将容器变成了实例(Instance)而不是台机器。当函数被第一次调用时,AWS会立即触发容器的启动,这个过程叫做冷启动(Cold Start)。预热机制可以在函数被调用之前自动启动一个Lambda函数,并将其保持为热状态,从而避免了冷启动的成本。在每次函数调用之前,该函数将被预先热一段时间,这个时间的长度可以通过配置控制。

2、功能模块化 将应用程序划分为模块,每个模块都相对独立,可以独立部署和运行。在无服务器环境下,可以使用这种方式来降低应用程序的启动时间。因为只有需要的模块被加载,所以可以减少应用程序的启动时间。

3、JVM缓存 在无服务器环境中,由于Lambda函数的生命周期非常短,一旦函数执行完成,Lambda函数就会被销毁。为了加快应用程序的启动时间,可以使用JVM缓存技术。JVM缓存存储应用程序已经编译的代码和类文件,当函数需要被调用时,只需要从JVM缓存中加载类文件和代码,而不需要重新编译代码和加载类文件,从而大大缩短了应用程序的启动时间。

实现秒级启动的步骤
将应用程序划分为可独立部署和运行的模块

一个大型的应用程序往往包含很多个子模块,例如用户管理、订单管理、库存管理等等。为了实现秒级启动,我们可以将应用程序划分为可独立部署和运行的模块。每个模块都可以独立部署和运行,不会对其他模块造成影响。这样,当需要更新或调整某个模块时,只需要重新部署该模块,而不需要重新部署整个应用程序。这样可以大大减少部署时间和启动时间。

使用JVM缓存技术,预热机制和功能模块化来缩短Lambda函数的启动时间。

Lambda函数的启动时间包括3个部分:加载Lambda函数代码、初始化JVM运行时环境和执行Lambda函数。为了缩短Lambda函数的启动时间,我们可以采用以下方法:

一、使用JVM缓存技术

JVM缓存技术可以让JVM在运行时缓存Lambda函数的代码和资源,避免重复加载和初始化,从而加快Lambda函数的启动速度。

JVM缓存技术是利用ClassLoader缓存机制实现的。ClassLoader是Java程序运行中负责加载类、资源的组件,ClassLoader负责将类、资源加载到JVM中。Lambda函数的代码和资源也是由ClassLoader加载到JVM中的。

JVM缓存技术的原理是,当JVM第一次加载Lambda函数时,ClassLoader会将Lambda函数的代码和资源缓存到内存中。当下次使用同一Lambda函数时,ClassLoader会从缓存中获取Lambda函数的代码和资源,从而避免了重复加载和初始化。

虽然缓存可以提高启动速度,但是过度依赖缓存也会导致代码可维护性、可扩展性等方面的问题。因此,在使用JVM缓存技术时,应该把控好缓存的范围和适用场景,避免过度依赖缓存。

在使用JVM缓存技术时,也要注意避免内存泄漏的问题。如果缓存的对象没有及时释放,就会导致内存占用过高,从而影响系统的性能和稳定性。因此,在使用JVM缓存技术时,要注意及时释放缓存对象。

由于Lambda函数和方法引用本质上是代码和资源的引用,因此,在使用JVM缓存技术时,也要注意避免序列化问题。如果Lambda函数或方法引用被序列化后再反序列化,就可能导致代码和资源的丢失,从而导致程序出错。

二、预热机制

预热机制可以在启动Lambda函数之前,提前加载和初始化一些常用的类和库,从而避免在执行Lambda函数时进行加载和初始化,从而加快Lambda函数的启动速度。虽然Lambda是无服务器计算,但是启动Lambda函数的过程并不是从零开始,而是需要一些时间来加载和初始化Lambda函数。这通常是由于需要加载和初始化一些依赖项(如库、框架和类),这些依赖项与Lambda函数的执行代码相关联。这个过程被称为“启动延迟”。

启动延迟是Lambda函数的一个重要因素,因为它可以影响Lambda函数的性能和可扩展性。一个启动较慢的Lambda函数会导致更多的人等待请求的响应,这会影响用户体验。同时,如果您的Lambda函数处理大量请求,您可能需要扩展使用多个实例,而如果每个实例都需要花费很长时间来初始化,那么这个过程就会变得非常低效。因此,需要一种机制来减少启动延迟。

在实施预热机制之前,您需要确定哪些库和类是最常用的,并将它们列为预热列表。预热列表应该基于Lambda函数的实际使用情况,以及预热后能够显着减少启动时间的类和库。您还需要考虑预热过程对Lambda函数的内存使用和执行时间的影响。

预热Lambda函数是一个在启动Lambda函数之前运行的进程。该进程加载和初始化预热列表中的类和库,并执行一些预热任务,以确保它们已经准备好了。预热任务可以包括调用一些函数,设置变量和对象实例等。

预热结果应该被缓存,以便当Lambda函数需要使用它们时可以快速获取。缓存可以在内存中完成,这样可以减少磁盘I/O和网络请求,从而提高性能。您可以使用AWS Lambda的环境变量来存储预热结果,或者将它们存储在Lambda函数的本地文件系统上。

当Lambda函数启动时,它可以从缓存中获取预热结果,并直接使用它们,从而避免在执行过程中加载和初始化。这样可以大大减少Lambda函数的启动时间,提高性能和可扩展性。

实施预热机制需要以下步骤:

1、创建预热脚本
预热脚本是用来加载和初始化预热列表中的类和库的代码。该脚本应该在Lambda函数启动之前运行,并将预热结果缓存到环境变量或本地文件系统中。您可以使用Python、Node.js和其他支持的语言来编写预热脚本。

2、将预热脚本打包到Lambda函数中
将预热脚本打包到Lambda函数中,以便在Lambda函数启动时自动运行。您可以使用AWS CLI或AWS Lambda Console来上传Lambda函数。

3、设置Lambda函数的环境变量
将预热结果缓存到Lambda函数的环境变量中,以便在Lambda函数启动时直接使用。您可以使用AWS Lambda Console或AWS CLI来设置环境变量。

4、在Lambda函数中使用预热结果
Lambda函数可以从环境变量中获取预热结果,并直接使用它们,从而避免在执行过程中加载和初始化。您可以使用Python、Node.js和其他支持的语言来访问环境变量。

三、功能模块化

将Lambda函数按照功能模块划分,分别加载和初始化,从而避免加载和初始化整个Lambda函数的代码和资源,从而加快Lambda函数的启动速度。以下是按模块分离Lambda函数的最佳实践和建议:

  1. 将Lambda函数分成尽可能小的模块。每个模块应该只包含必要的代码和资源。
  2. 为每个模块创建单独的ZIP文件。这可以避免不必要的资源消耗并提高启动速度。
  3. 在Lambda函数的初始化代码中,加载所有必要的模块。这将确保只加载必要的代码和资源。
  4. 在需要时(例如,处理请求时),再加载其他模块。这将确保仅加载必要的代码和资源。
  5. 最小化使用外部依赖项。每个依赖项都需要加载和初始化,这会增加Lambda函数的启动时间。
  6. 对于大型Lambda函数,考虑使用AWS Lambda的可扩展性和高可用性功能。这将确保Lambda函数可以在需要时自动扩展,并提供更好的性能和可靠性。
使用无服务器架构来运行应用程序

无服务器架构可以让应用程序在云端运行,无需管理服务器和基础架构,从而大大缩短部署时间和启动时间。当需要扩展应用程序时,只需要增加云资源,而不需要购买和配置服务器。

无服务器架构(Serverless Architecture),也被称为函数即服务(Function as a Service, FaaS),是一种新的云计算模型,它让应用程序在云端运行,无需管理服务器和基础架构,从而大大缩短部署和启动时间,降低了运维成本,提高了应用程序的可扩展性和弹性。

与传统的基于虚拟机或容器的云计算模型不同,无服务器架构将服务的代码运行部分和基础设施的管理部分进行了分离。在传统的模型中,开发人员需要对服务器的配置、监控和维护进行管理,而在无服务器架构中,这些都是由云服务提供商(如AWS、Azure和Google Cloud等)来管理的。这使得开发人员可以专注于应用程序的开发,而不必担心基础架构的管理和维护。

无服务器架构的基本特点包括:

(1)事件驱动:无服务器架构基于事件驱动的编程模型,应用程序的代码仅在需要处理事件(如HTTP请求)时才被执行。这种编程模型可以让应用程序具有高度的弹性和可伸缩性,可以自动地扩展和收缩应用程序的资源。

(2)按需计费:无服务器架构的计费模式是按照实际的使用量来计费的。也就是说,只有当应用程序被执行时,才会进行计费,这可以大大降低应用程序的成本。

(3)无服务器管理:开发人员无需管理服务器和基础架构,不需要安装、配置和维护操作系统、Web服务器和数据库等组件。这样可以大幅降低了开发人员的工作量,同时也降低了出错的可能性。

(4)高可用性:无服务器架构具有高度的可靠性和弹性,可以自动地将应用程序的实例分布在多个数据中心,并自动处理服务器故障和其他问题。这种方式大幅提高了应用程序的可用性和可靠性。

无服务器架构的工作原理可以简述为:

(1)应用程序开发人员编写代码,将其上传到无服务器平台上。

(2)无服务器平台根据应用程序的事件驱动模型,将应用程序代码分解为函数。

(3)无服务器平台将这些函数存储在云环境中,并提供API接口,以便应用程序可以调用这些函数。

(4)当应用程序需要处理事件时,它将发送请求到无服务器平台,请求执行相应的函数。

(5)无服务器平台根据请求执行相应的函数,并返回结果给应用程序。

(6)无服务器平台根据应用程序的负载自动扩展和收缩函数的实例,并根据需要调整资源。

无服务器架构的基本组件包括:

(1)函数:函数是无服务器架构中最基本的组件,它是应用程序代码的基本单位。函数通常只完成一个简单的操作,并以无状态的方式运行。无服务器平台可以自动地为函数分配资源,并执行多个函数实例来处理请求。

(2)触发器:触发器是无服务器架构中的事件源,它会触发函数的执行。触发器可以是各种事件源,包括HTTP请求、消息队列、定时器和文件上传等。触发器可以自动地调用函数,无需手动配置。

(3)API网关:API网关是无服务器架构中的API中间件,它负责为应用程序提供外部访问的接口。API网关可以接受HTTP请求,并将请求转发给相应的函数处理。API网关还可以进行请求身份验证和授权,以确保应用程序的安全性。

(4)数据存储:数据存储是无服务器架构中的持久层,它可以为应用程序提供数据的存储和检索能力。数据存储可以是关系型数据库(如MySQL和PostgreSQL)或NoSQL数据库(如MongoDB和DynamoDB)等。

(5)日志和监控:日志和监控是无服务器架构中的管理工具,它可以提供应用程序的运行日志、性能指标和错误报告等。日志和监控还可以帮助开发人员优化应用程序的性能,并及时处理错误和故障。

函数的生命周期是指函数从创建到销毁的整个过程。无服务器架构中的函数生命周期可以分为以下几个阶段:

(1)创建:函数是在开发人员上传代码之后创建的。当代码被上传到无服务器平台时,无服务器平台将会自动地分解代码为多个函数,并将其存储在云环境中。

(2)部署:函数被部署到云环境中,并分配所需的资源(例如CPU、内存和网络带宽)。函数的部署可以根据应用程序的负载自动地进行扩展和收缩。

(3)执行:当应用程序需要执行函数时,它会向无服务器平台发送请求。无服务器平台会根据请求自动分配函数实例,并执行函数。函数可以访问应用程序的数据存储和其他服务。

(4)日志和监控:当函数执行时,无服务器平台会记录函数的运行日志和性能指标,并生成报告和警报。开发人员可以使用这些日志和监控数据来优化函数的性能,并快速处理错误和故障。

(5)销毁:当函数不再需要时,它会被销毁。无服务器平台会自动地回收函数的所有资源,并将其从云环境中删除。

使用AWS Lambda、Azure Functions、Google Cloud Functions等云服务提供商来托管应用程序

AWS Lambda、Azure Functions、Google Cloud Functions等云服务提供商提供了一种快速托管应用程序的方法。这些服务可以自动管理服务器和基础架构,而且还提供了很多高级功能,例如自动扩展、自动备份、自动恢复等等。使用这些云服务提供商可以大大加快应用程序的启动速度和运行效率。AWS Lambda、Azure Functions、Google Cloud Functions 都是云服务提供商,提供了一种快速托管应用程序的方法。它们可以自动管理服务器和基础架构,提供了很多高级功能,例如自动扩展、自动备份、自动恢复等等。

AWS Lambda 是由亚马逊公司提供的一种无服务器计算服务,可以让您运行代码而无需自己管理服务器。此服务可以自动扩展应用程序、自动备份和恢复,并支持多种编程语言和运行时。

Azure Functions 是由微软提供的一种无服务器计算服务,可以让您在云中运行代码而无需管理服务器。此服务支持多种编程语言和运行时。

Google Cloud Functions 是由谷歌提供的一种无服务器计算服务,可以让您在云中运行代码而无需管理服务器。此服务支持多种编程语言和运行时。

使用Spring Boot的DevTools模块支持应用程序的热重载,可以在不重新启动应用程序的情况下更新应用程序

Spring Boot的DevTools还提供了一些其他开发工具,例如自动重启功能,可以在修改代码后自动重启应用程序。这种方式虽然不能实现秒级启动,但可以在开发过程中提高开发效率。需要在Maven或Gradle依赖中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <scope>runtime</scope>
</dependency>

自动重启功能的原理实现是非常简单的。在启用自动重启功能后,DevTools会在后台启动一个额外的进程,这个进程会监控应用程序的类文件和资源文件的变化。

当我们修改了类文件和资源文件后,DevTools会通知应用程序的主进程,告诉它需要重新启动。为了避免频繁的重启,DevTools还提供了一个延迟时间(默认为1秒),在这个时间内如果有更改则不会重启,否则会启动一个新的进程来代替原来的应用程序进程。

当应用程序重启时,DevTools会重新加载所有的类文件和资源文件,确保应用程序的状态保持不变。这个过程类似于一个完整的应用程序启动过程,包括Spring的启动过程和应用程序的初始化过程。

自动重启功能的优点是显而易见的。它可以让我们在开发过程中快速验证更改,提高开发效率。在少量代码修改的情况下,重启的时间可以做到秒级。

但是自动重启功能也有一些缺点。首先,重启应用程序需要一定的时间,如果代码修改比较频繁,反复重启会浪费大量的时间。其次,重启应用程序可能会导致应用程序状态的丢失,例如内存中的变量和缓存等。因此,在开发过程中,我们应该尽量避免在应用程序运行时修改代码。

弹性伸缩

创建专用网络VPC

在这里插入图片描述

安全组

在这里插入图片描述

创建云服务器

在这里插入图片描述在这里插入图片描述在这里插入图片描述

打包部署

在这里插入图片描述

Java环境
#下载jdk17
wget https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.tar.gz
#安装上传工具 以后使用命令 rz  选中文件进行上传
yum install -y lrzsz

#解压
tar -xzvf jdk-17_linux-x64_bin.tar.gz

#移动到指定位置; 记住全路径: /opt/user/jdk-17.0.8
mv jdk-17.0.8 /opt/user/jdk-17.0.8

#配置环境变量   /opt/jdk-17.0.2
vim /etc/profile

#在最后加入下面配置,注意修改 JAVA_HOME位置为你自己的位置
export JAVA_HOME=/opt/user/jdk-17.0.8
export PATH=$JAVA_HOME/bin:$PATH

#使环境变量生效
source /etc/profile

#验证安装成功
java -version

在这里插入图片描述

启动项目

在这里插入图片描述测试能否访问
在这里插入图片描述

开机启动任意服务

作为基础服务器,需要配置开机自启服务,方便后面自动伸缩以这台服务器为主,扩容服务器能实现开机运行java服务。

1. 制作服务文件
cd /usr/lib/systemd/system
vim springbootapp.service
#内容如下

[Unit]
Description=springbootapp
After=syslog.target network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
ExecStart=/opt/app/app-start.sh
ExecStop=/opt/app/app-stop.sh
PrivateTmp=true

[Install]
WantedBy=multi-user.target
2. 制作启动脚本
vim app-start.sh

内容如下

#!/bin/sh
export JAVA_HOME=/opt/jdk-17.0.2
export PATH=$JAVA_HOME/bin:$PATH
nohup java -Xms2048m -Xmx2048m -Xss1m -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m -jar /opt/app/app.jar > /opt/app/app.log 2>&1 & --spring.profiles.active=prod
echo $! > /opt/app/app-service.pid
3. 制作停止脚本
vim app-stop.sh

内容如下

#!/bin/sh
PID=$(cat /opt/app/app-service.pid)
kill -9 $PID
4. 增加执行权限
chmod +x app-start.sh
chmod +x app-stop.sh
5. 设置开机启动
systemctl daemon-reload
systemctl status springbootapp
systemctl enable springbootapp

关闭开机自启动

systemctl disable springbootapp

立即执行启动服务脚本

systemctl start springbootapp

立即执行关闭服务脚本

systemctl stop springbootapp
创建镜像

在这里插入图片描述在这里插入图片描述

继续创建多台云服务器

在这里插入图片描述在这里插入图片描述在这里插入图片描述
在这里插入图片描述

负载均衡

在这里插入图片描述
在这里插入图片描述直接通过负载均衡的ip访问服务的8888端口
在这里插入图片描述测试一下
在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述

创建弹性伸缩

在这里插入图片描述在这里插入图片描述

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
通常还需要配置目标追踪规则才能实现扩容。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述如果我配置的期望值是1台服务器,那么过一段时间没有负载就会直接把你创建的实例给删除了,仅保留一台。
在这里插入图片描述
在这里插入图片描述

redis的报警规则

在这里插入图片描述在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

白名单

这里设置和云服务器的一样,可以在同一个网络访问,其他ip即便知道用户名密码和主机ip也无法访问。
在这里插入图片描述

CSDN

🔔如果您需要转载或者搬运这篇文章的话,非常欢迎您私信我哦~

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

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

相关文章

linux 安装操作 redis

1、redis概述和安装 1.1、安装redis 1. 下载redis 地址 https://download.redis.io/releases/ 2. 将 redis 安装包拷贝到 /opt/ 目录 3. 解压 tar -zvxf redis-6.2.1.tar.gz4. 安装gcc yum install gcc5. 进入目录 cd redis-6.2.16. 编译 make7. 执行 make install 进…

中文编程语言开发工具开发的软件实例:洗车会员管理软件案例

中文编程语言开发工具开发的软件实例&#xff1a;洗车会员管理软件案例图片资料 上图说明&#xff1a;会员登记的时候&#xff0c;可以直接使用手机号&#xff0c;可以绑定车牌号&#xff0c; 上图说明&#xff1a;洗车软件可以一卡多用&#xff0c;一卡管理多个项目。 软件特…

Java面向对象进阶

Java面向对象 基本类型包装类 包装类介绍 Java提供的基本类型包装类&#xff0c;使得Java能够更好的体现面向对象的思想&#xff0c;同时也使得基本类型能够支持对象操作 包装类实际上就是将我们的基本数据类型&#xff0c;封装成一个类&#xff08;运用了封装的思想&#x…

计网----数据包在传输中的变化过程,单播组播和广播,ARP协议,ARP代理,免费ARP,DNS协议,路由数据转发过程

计网----数据包在传输中的变化过程&#xff0c;单播组播和广播&#xff0c;ARP协议&#xff0c;ARP代理&#xff0c;免费ARP&#xff0c;DNS协议&#xff0c;路由数据转发过程 一.数据包在传输中的变化过程&#xff08;在同一个路由器下&#xff09; 1.传输数据时&#xff0c…

【python海洋专题二十五】给南海年平均海流+scale

【python海洋专题二十五】给南海年平均海流scale 往期推荐 **[[ 【python海洋专题一】查看数据nc文件的属性并输出属性到txt文件] 【python海洋专题二】读取水深nc文件并水深地形图 【python海洋专题三】图像修饰之画布和坐标轴 【Python海洋专题四】之水深地图图像…

【数据结构】线性表(三)循环链表的各种操作(创建、插入、查找、删除、修改、遍历打印、释放内存空间)

目录 线性表的定义及其基本操作&#xff08;顺序表插入、删除、查找、修改&#xff09; 四、线性表的链接存储结构 1. 单链表 2. 循环链表 a. 循环链表节点结构体 b. 创建新节点 c. 在循环链表末尾插入节点 d. 删除循环链表中指定值的节点 e. 在循环链表中查找指定值的…

Docker启动失败:Failed at step LIMITS spawning /sbin/modprobe

下图为报错信息&#xff1a; 解决方法 docker启动时文件描述符比系统的大&#xff0c;会导致docker起不来。 需在命令行执行 sysctl -w fs.nr_open1048576 再重启Docker即可。

如何处理前端SEO(搜索引擎优化)?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前端入门之旅&#xff01;感兴趣的可以订阅本专栏哦&#xff01;这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…

面试题:Hash 碰撞是什么?如何解决?

文章目录 Hash如何存数据Hash碰撞解决方法 Hash如何存数据 hash表的本质其实就是数组&#xff0c;hash表中通常存放的是键值对Entry。 如下图: 这里的学号是个key&#xff0c;哈希表就是根据key值来通过哈希函数计算得到一个值&#xff0c;这个值就是下标值&#xff0c;用来确…

【K8S】Kubernetes

mesos apache基金会&#xff0c;后来是推特公司 mesos分布式资源管理框架2019淘汰 marathon 容器编排框架 用来调度、编排运行的常驻服务 mesos marathon 容器管理 k8s容器或云平台两种趋势&#xff08;工资好&#xff09; 1.K8s是什么 K8s全称为 Kubernetes&#xff…

Java并发面试题:(七)ThreadLocal原理和内存泄漏

ThreadLocal是什么&#xff1f; ThreadLocal是线程本地存储机制&#xff0c;可以将数据缓存在线程内部。ThreadLocal存储的变量在线程内共享的&#xff0c;在线程间又是隔离的。 ThreadLocal实现原理&#xff1f; ThreadLocal的底层是ThreadLocalMap&#xff0c;每个Thread都…

Linux内核UART串口子系统驱动框架详解

目录 1 TTY的概念和历史 2 终端的概念 3 TTY整体框架 3.1 TTY子系统中设备节点的差别 4 UART驱动程序整体框架和注册过程 4.1 uart_register_driver(&imx_reg)函数流程 4.2 platform_driver_register(&serial_imx_driver)函数 4.3 uart驱动注册整体架构图 5 怎…

信息安全产品汇总

主要安全机制 防火墙&#xff08;进入系统的安全门&#xff09; 网络入侵检测&#xff08;监控和报警&#xff09; 漏洞扫描&#xff08;巡逻保安&#xff09; 中央控制的安全和策略管理&#xff08;闭路电视监控器&#xff09; 身份识别、4A认证、访问控制服务器、证书验证&am…

html+css布局,DIV区域的宽度和高度随页面宽度变化时等比变化

htmlcss布局,DIV区域的宽度和高度随页面宽度变化时等比变化(即:DIV保持纵横比随页面宽度变化),利用img图片标签能撑起高度的特点实现。 如下图所示&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset&q…

浅谈安科瑞无线测温产品在埃及某房建配电项目中的应用

1.电气接点测温的必要性 电力系统的一次系统一般由供电线路&#xff08;包括架空线路和电缆&#xff09;、变压器、母线、开关柜等电气设备组成。其相互之间存在大量的电气连接点&#xff0c;由于电流流过产生热量&#xff0c;所以几乎所有的电气故障都会导致故障点温度的变化…

药物滥用第五篇介绍

THC&#xff1a; 四氢大麻酚&#xff08;Tetrahydrocannabinol,THC&#xff09;&#xff0c;是一种有机化合物&#xff0c;化学式为C21H30O2&#xff0c;是大麻植物中的一种化学物质&#xff0c;也是大麻中最主要的活性成分之一。THC可以产生放松和幻觉的效果&#xff0c;有助于…

16.1 Socket 端口扫描技术

端口扫描是一种网络安全测试技术&#xff0c;该技术可用于确定对端主机中开放的服务&#xff0c;从而在渗透中实现信息搜集&#xff0c;其主要原理是通过发送一系列的网络请求来探测特定主机上开放的TCP/IP端口。具体来说&#xff0c;端口扫描程序将从指定的起始端口开始&#…

Java —— 程序逻辑控制

目录 1. 顺序结构 2. 分支结构 2.1 if 语句 2.1.1 语法格式1 2.1.2 语法格式2 2.1.3 语法格式3 2.2 switch 语句 3. 循环结构 3.1 while循环 3.2 break与continue 3.3 for循环 4. 输入输出 4.1 输出到控制台 格式化字符串 4.2 从键盘输入 5. 练习 和C语言类似地, Java的程序逻辑…

通讯协议学习之路:USB协议协议理论

通讯协议之路主要分为两部分&#xff0c;第一部分从理论上面讲解各类协议的通讯原理以及通讯格式&#xff0c;第二部分从具体运用上讲解各类通讯协议的具体应用方法。 后续文章会同时发表在个人博客(jason1016.club)、CSDN&#xff1b;视频会发布在bilibili(UID:399951374) 1、…

服务CPU异常飙高问题分析和解决

&#x1f4e2;&#x1f4e2;&#x1f4e2;&#x1f4e3;&#x1f4e3;&#x1f4e3; 哈喽&#xff01;大家好&#xff0c;我是「奇点」&#xff0c;江湖人称 singularity。刚工作几年&#xff0c;想和大家一同进步&#x1f91d;&#x1f91d; 一位上进心十足的【Java ToB端大厂…