当前位置: 首页 > 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. 引言 随着智能家居技术的快速发展&…...

多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度​

一、引言&#xff1a;多云环境的技术复杂性本质​​ 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时&#xff0c;​​基础设施的技术债呈现指数级积累​​。网络连接、身份认证、成本管理这三大核心挑战相互嵌套&#xff1a;跨云网络构建数据…...

【JavaEE】-- HTTP

1. HTTP是什么&#xff1f; HTTP&#xff08;全称为"超文本传输协议"&#xff09;是一种应用非常广泛的应用层协议&#xff0c;HTTP是基于TCP协议的一种应用层协议。 应用层协议&#xff1a;是计算机网络协议栈中最高层的协议&#xff0c;它定义了运行在不同主机上…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

什么是Ansible Jinja2

理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具&#xff0c;可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板&#xff0c;允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板&#xff0c;并通…...

关键领域软件测试的突围之路:如何破解安全与效率的平衡难题

在数字化浪潮席卷全球的今天&#xff0c;软件系统已成为国家关键领域的核心战斗力。不同于普通商业软件&#xff0c;这些承载着国家安全使命的软件系统面临着前所未有的质量挑战——如何在确保绝对安全的前提下&#xff0c;实现高效测试与快速迭代&#xff1f;这一命题正考验着…...

CSS设置元素的宽度根据其内容自动调整

width: fit-content 是 CSS 中的一个属性值&#xff0c;用于设置元素的宽度根据其内容自动调整&#xff0c;确保宽度刚好容纳内容而不会超出。 效果对比 默认情况&#xff08;width: auto&#xff09;&#xff1a; 块级元素&#xff08;如 <div>&#xff09;会占满父容器…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

Qemu arm操作系统开发环境

使用qemu虚拟arm硬件比较合适。 步骤如下&#xff1a; 安装qemu apt install qemu-system安装aarch64-none-elf-gcc 需要手动下载&#xff0c;下载地址&#xff1a;https://developer.arm.com/-/media/Files/downloads/gnu/13.2.rel1/binrel/arm-gnu-toolchain-13.2.rel1-x…...

Qt 事件处理中 return 的深入解析

Qt 事件处理中 return 的深入解析 在 Qt 事件处理中&#xff0c;return 语句的使用是另一个关键概念&#xff0c;它与 event->accept()/event->ignore() 密切相关但作用不同。让我们详细分析一下它们之间的关系和工作原理。 核心区别&#xff1a;不同层级的事件处理 方…...