当前位置: 首页 > news >正文

搭建 Tomcat 集群【Nginx 负载均衡】

当我们想要提高后端服务器的并发性能,可以通过分配更多的资源给 Tomcat 服务器,但是这只能提高一部分的性能。因为每台 Tomcat 的服务器是有最大连接数为 200.所以即可拥有无穷无尽的内存,也会因为单台 Tomcat 的原因而无法发挥这些资源的最大价值。

所以我们就使用多台 Tomcat 来解决这个问题。然后使用 Nginx 负载均衡来将请求转发到后端服务器。

首先你得先有 Nginx 的安装包,这里我就不演示这个下载安装的过程了。你可以在这个页面选择你想要下载的 nginx 版本:nginx: download

然后就是对我们的代码进行打包,我们的项目是 Maven 项目,所以打包起来会很简单,并且是 SpringBoot 项目,所以打包结果就是 jar 包,可以在 Windows 的控制台中使用 java -jar xx.jar 来启动项目即可,因为 SpringBoot 项目在打包时会将 Tomcat 服务器也打包进去。

普通的 Java 项目则是打包成 war 包,然后放在 Tomcat 的 webapps 目录下来部署的。

1. 打包项目

这里示例项目是 SpringBoot 项目,所以部署起来非常的简单。

首先在 Maven 的生命周期中选择 package,它会生成一个 target 目录,然后你可以直接使用 java -jar xxx.jar 来运行这个 jar 包。

比如这个项目的端口是 9090,由于我们的服务器都是在本地搭建的,所以我们会设置不同的端口,比如端口设置为 90909091 这两个端口。

不过使用 java -jar xxx.jar 你可能会遇到下面的这个问题,因为我们 IDEA 中的 JDK 版本与环境变量中的 JDK 版本可能会不一样,下面的这个就是 IDEA 使用的是 Java 11,然后环境变量中的使用的是 Java 8。总的来说就是环境变量的 JDK 版本太低了,使用 Java 11 为妥。

下面的是报错信息:

org.springframework.beans.factory.CannotLoadBeanClassException: Error loading class [com.example.dao.UserDAO] for bean with name ‘userDAO’ defined in URL [jar:file:/E:/tomcat-cluster/apis-1.0.0.jar!/BOOT-INF/lib/mapper-1.0.0.jar!/com/example/dao/UserDAO.class]: problem with class file or dependent class; nested exception is java.lang.UnsupportedClassVersionError: com/example/dao/UserDAO has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0

这个的意思是说当前电脑的 Java 版本太低(52.0 -> Java8,55.0 -> Java11),电脑中的 Java 为版本 8。

如果还有其他的报错就自行解决吧,比如常见的端口被占异常。

2. Nginx 负载均衡

在启动了 Tomcat 服务器之后,我们需要在 Nginx 的配置文件进行配置。

配置如下:

http {upstream tomcat {server localhost:9090;server localhost:9091;}server {listen 8080location / {proxy_pass http://tomcat;}}
}

配置完成之后,然后双击 nginx.exe 就可以了。当然以上是一些基本的配置。

最后我们在本地浏览器访问 localhost:8080 就可以了,nginx 会将请求分配到两个 Tomcat 的其中一个。这个我们不需要关心。

3. Nginx 负载均衡策略

Nginx 常见的负载均衡有四种,当然还有第三方的负载均衡策略,这里我们就只介绍 Nginx 自带的均衡策略。

  • 轮询(默认使用)
  • weight(权重)
  • ip_hash(客户端 IP 哈希)
  • least_conn(最少连接)

3.1. 轮询

这是 Nginx 默认的负载均衡策略,通常我们也不会去设置其他的负载均衡策略,因为这些设置主要由业务场景来决定。

轮询就是将客户端的请求依次发送给后端服务器,比如下面的配置就是 9090 和 9091 交替处理请求。

upstream tomcat {server localhost:9090;server localhost:9091;
}

它还有其他的参数,这里也介绍一下:

  • max_fails:设置服务器在 fail_timeout 时间内的最大失败次数,如果向该服务器发送的请求在 fail_timeout 时间内失败了三次,就将该服务器设置为已宕机,最大宕机时间则需要设置 fail_time 参数。
  • fail_timeout:失败超时时间,与 fail_fails 一起使用。
  • fail_time:服务器最大宕机时长,默认为 10s,fail_time 之后 nginx 会去确认服务器是否可用。
  • backup:该参数代表该服务器为备用机,当主服务器宕机时,备用机就会接收请求。
  • down:该参数设置服务器为永久宕机。

比如下面的配置,

upstream tomcat {# fail_timeout 时间内最大失败次数为 3,最大宕机时长为 100sserver localhost:9090 max_fails=3 fail_timeout=20 fail_time=100;server localhost:9091 backup;server localhostL9092 down;
}

3.2. weight(权重)

这种设置方式主要是根据服务器的资源多少来具体地分配请求,需要手动指定。

upstream tomcat {server localhost:9090;# 权重为 2,将会收到更多的请求,按照轮询来讲就是 1:2:1 的分配server localhost:9091 weight=2;server localhostL9092;
}
  • 权重默认值为 1,权重数字越大被分配到的请求也会越多。
  • 可以结合 轮询ip_hashleast_conn 来使用。

3.3. ip_hash(客户端 IP 哈希)

根据客户端 IP 的哈希值来转发请求。这样可以保证一个客户端只会请求一台服务器,可以保证 session 的一致性。

upstream tomcat {# 加上这一个配置即可,非常简单!ip_hash;server localhost:9090;server localhost:9091;server localhostL9092;
}

3.4. least_conn(最少连接)

当请求处理时间不一导致有些服务器处于繁忙、有些处于空闲时,使用该配置可以更好地解决这个问题。它会根据服务器正在处理请求的数量来分配请求,将请求分配给那些比较空闲的服务器。

upstream tomcat {# 加上这一个配置即可,非常简单!least_conn;server localhost:9090;server localhost:9091;server localhostL9092;
}

相关文章:

搭建 Tomcat 集群【Nginx 负载均衡】

当我们想要提高后端服务器的并发性能,可以通过分配更多的资源给 Tomcat 服务器,但是这只能提高一部分的性能。因为每台 Tomcat 的服务器是有最大连接数为 200.所以即可拥有无穷无尽的内存,也会因为单台 Tomcat 的原因而无法发挥这些资源的最大…...

深入理解指针(二)

目录 1. 数组名的理解 2. 使用指针访问数组 3. ⼀维数组传参的本质 4. 冒泡排序 5. 二级指针 6. 指针数组 7. 指针数组模拟二维数组 1. 数组名的理解 有下面一段代码: #include <stdio.h> int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int* p &arr[…...

【Qt 学习笔记】Qt窗口 | 标准对话框 | 文件对话框QFileDialog

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Qt窗口 | 标准对话框 | 文件对话框QFileDialog 文章编号&#xff1a;Q…...

换卡槽=停机?新手机号使用指南!

刚办理的手机号莫名其妙的就被停用了&#xff1f;这到底是怎么回事&#xff1f;这篇文章快来学习一下吧。 ​ 先说一下&#xff0c;你的手机为什么被停机&#xff1f; 现在运营商对于手机卡的使用有着非常严格的要求&#xff0c;尤其是刚办理的新号码&#xff0c;更是“严上加…...

主题切换之根元素CSS自定义类

要实现CSS样式的主题切换&#xff0c;可以通过在HTML中添加一个按钮来触发JavaScript事件&#xff0c;进而通过JavaScript动态修改HTML元素的class或直接切换CSS文件&#xff0c;以达到改变页面整体风格的目的。以下是实现这一功能的步骤、原理及代码示例。 原理&#xff1a; …...

如何在 ASP.NET Core Web Api 项目中应用 NLog 写日志?

前言 昨天分享了在 .NET Core Console 项目中应用 NLog 写日志的详细例子&#xff0c;有几位小伙伴私信说 ASP.NET Core Web Api 项目中无法使用&#xff0c;其实在 ASP.NET Core Web Api 项目中应用 NLog 写日志&#xff0c;跟 .NET Core Console 项目是有些不一样的&#xf…...

selenium execute_script常用方法汇总

driver.execute_script() 是 Selenium WebDriver 中非常强大且灵活的功能&#xff0c;可以用来执行任意的 JavaScript 代码在浏览器上下文中。以下是一些常用的 execute_script() 方法的例子和用法&#xff1a; 修改元素的属性和值 python# 修改输入框的值 driver.execute_sc…...

如何选择最佳的APP封装平台-小猪APP分发为您解忧

在开发移动应用程序的过程中&#xff0c;选择一个可靠的APP封装平台显得尤为重要。无论你是初创企业还是大型企业&#xff0c;找到一个合适的平台可以大大简化你的开发流程。如何选择最佳的APP封装平台呢&#xff1f;今天我们就来聊聊这个话题&#xff0c;并重点介绍一下小猪AP…...

Linux基础 (十八):Libevent 库的安装与使用

目录 一、Libevent 概述 1.0 Libevent的安装 1.0.1 使用源码方式 1.0.2 终端命令行安装 1.1 主要特性 1.2 主要组件 1.3 Libevent 使用模型 1.4 原理 1.5 使用的基本步骤 1.5.1 初始化事件基础设施 1.5.2. 创建和绑定服务器套接字 1.5.3. 设置监听事件 1.5.4. 定义…...

冒泡排序的详细介绍 , 以及c , python , Java的实现方法

冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它重复地遍历要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换&#xff0c;也就是说该数列已经排序完成…...

使用llama.cpp实现LLM大模型的格式转换、量化、推理、部署

使用llama.cpp实现LLM大模型的格式转换、量化、推理、部署 概述 llama.cpp的主要目标是能够在各种硬件上实现LLM推理&#xff0c;只需最少的设置&#xff0c;并提供最先进的性能。提供1.5位、2位、3位、4位、5位、6位和8位整数量化&#xff0c;以加快推理速度并减少内存使用。…...

给你一个扫码支付的二维码,如何写测试用例?

前言 面试的时候&#xff0c;经常会临场出题&#xff1a;给你一个xxx, 如何测试, 或者说如何写测试用例&#xff1f;xxx可以是圆珠笔&#xff0c;水杯&#xff0c;电梯等生活中常见的场景。 那么给你一个支付的二维码&#xff0c;如何写测试用例呢&#xff1f; 二维码扫码支…...

计算机专业在未来的发展与抉择

目录 前言 计算机专业的发展历史 计算机专业的前景 计算机专业的挑战 如何判断自己是否适合计算机专业 计算机行业的未来发展态势 作为过来人和从业者 前言 随着2024年高考落幕&#xff0c;数百万高三学生又将面临人生中的重要抉择&#xff1a;选择大学专业。在这个关键…...

【Linux】基础IO——文件描述符,重定向

话接上篇&#xff1a; 1.文件描述符fd 磁盘文件 VS 内存文件&#xff1f; 当文件存储在磁盘当中时&#xff0c;我们将其称之为磁盘文件&#xff0c;而当磁盘文件被加载到内存当中后&#xff0c;我们将加载到内存当中的文件称之为内存文件。磁盘文件和内存文件之间的关系就像程…...

1.0 Android中Activity的基础知识

一&#xff1a;Activity的定义 Activity是一个应用组件&#xff0c;它提供了一个用户界面&#xff0c;允许用户执行一个单一的、明确的操作&#xff0c;用户看的见的操作都是在activity中执行的。Activity的实现需要在manifest中进行定义&#xff0c;不让会造成程序报错。 1.…...

线代知识点总结

目录 一.初等行/列变换 1.计算行列式时&#xff0c;行列变换都可 2.求矩阵的秩时&#xff0c;行列变换都可 3.解线性方程组时&#xff0c;仅能使用初等行变换 4.判定解的情况&#xff0c;单纯求r(A),r(A,b)的过程行列变换都可 5.求向量组极大无关组、线性表出关系&#x…...

案例学习-存量更新规划实施探索(武汉)

案例学习-存量更新规划实施探索&#xff08;武汉&#xff09; 武汉市在早期旧城更新实践中发现零散化的更新往往导致资源配置分散、城市建设破碎化等弊病&#xff0c;特别是由于过于强调项目自身“经济平衡”&#xff0c;在实施过程中也逐步暴露出住宅占比过大、强度偏高、公服…...

C#操作MySQL从入门到精通(17)——使用联结

前言: 我们在查询数据的过程中有时候查询的数据不是来自一个表而是来自多个表,本文使用的测试数据如下: 本文使用了两个表student_info、address_info student_info的数据如下: address_info的数据如下: 1、内联结 所谓内联结就是求交集,两个表都有的数据才是有效数…...

MyBatis 关于查询语句上配置的详细内容

1. MyBatis 关于查询语句上配置的详细内容 文章目录 1. MyBatis 关于查询语句上配置的详细内容2. 准备工作3. SQL查询结果&#xff0c;返回为POJO实体类型4. SQL查询结果&#xff0c;返回为List<POJO\> 集合类型5. SQL查询结果&#xff0c;返回为Map 集合6. SQL查询结果&…...

基于STM32和人工智能的智能家居监控系统

目录 引言环境准备智能家居监控系统基础代码实现&#xff1a;实现智能家居监控系统 4.1 数据采集模块4.2 数据处理与分析4.3 控制系统4.4 用户界面与数据可视化应用场景&#xff1a;智能家居管理与优化问题解决方案与优化收尾与总结 1. 引言 随着智能家居技术的快速发展&…...

边缘计算医疗风险自查APP开发方案

核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...

如何在看板中体现优先级变化

在看板中有效体现优先级变化的关键措施包括&#xff1a;采用颜色或标签标识优先级、设置任务排序规则、使用独立的优先级列或泳道、结合自动化规则同步优先级变化、建立定期的优先级审查流程。其中&#xff0c;设置任务排序规则尤其重要&#xff0c;因为它让看板视觉上直观地体…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

React19源码系列之 事件插件系统

事件类别 事件类型 定义 文档 Event Event 接口表示在 EventTarget 上出现的事件。 Event - Web API | MDN UIEvent UIEvent 接口表示简单的用户界面事件。 UIEvent - Web API | MDN KeyboardEvent KeyboardEvent 对象描述了用户与键盘的交互。 KeyboardEvent - Web…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

2.3 物理层设备

在这个视频中&#xff0c;我们要学习工作在物理层的两种网络设备&#xff0c;分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间&#xff0c;需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质&#xff0c;假设A节点要给…...

Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合

无论是python&#xff0c;或者java 的大型项目中&#xff0c;都会涉及到 自身平台微服务之间的相互调用&#xff0c;以及和第三发平台的 接口对接&#xff0c;那在python 中是怎么实现的呢&#xff1f; 在 Python Web 开发中&#xff0c;FastAPI 和 Django 是两个重要但定位不…...

Linux入门课的思维导图

耗时两周&#xff0c;终于把慕课网上的Linux的基础入门课实操、总结完了&#xff01; 第一次以Blog的形式做学习记录&#xff0c;过程很有意思&#xff0c;但也很耗时。 课程时长5h&#xff0c;涉及到很多专有名词&#xff0c;要去逐个查找&#xff0c;以前接触过的概念因为时…...