搭建 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;
}

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

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

相关文章

grpc代理服务的实现(二)

目录 grpc service 的实现grpc服务通过unix域监听请求建立与代理服务的tcp连接请求转发到 unix 上代码地址 grpc service 的实现 假设 grpc service 的服务名是 Bar grpc服务通过unix域监听请求 go svr : grpc.NewServer() messages.RegisterBarServer(svr, bar.New()) reflec…

免杀笔记 ----> 后续更新安排

前一段时间,我疯狂更新了内网,本来想把NTLM-Relay给更上的,但是计划安排不允许了,之后后续再给大家进行深入的内网更新了!! :: 真不是我托更 嘻嘻嘻~~~ 说回正题,接下来…

算法体系-22 第二十二节:暴力递归到动态规划(四)

一 最小距离累加和 1.1 描述 给定一个二维数组matrix,一个人必须从左上角出发,最后到达右下角 沿途只可以向下或者向右走,沿途的数字都累加就是距离累加和 返回最小距离累加和 1.2 分析

把服务器上的镜像传到到公司内部私有harbor上,提高下载速度

一、登录 docker login https://harbor.cqxyy.net/ -u 账号 -p 密码 二、转移镜像 minio 2024.05版 # 指定tag docker tag minio/minio:RELEASE.2024-05-10T01-41-38Z harbor.cqxyy.net/customer-software/minio:RELEASE.2024-05-10T01-41-38Z# 推送镜像 docker push harbo…

陕西印刷平台的元宇宙之旅:打造创意印刷新纪元

在数字化时代的浪潮中,陕西印刷平台不断追求创新与卓越,将目光投向了新兴的元宇宙领域。作为传统印刷业的先行者,陕西印刷平台致力于将先进的元宇宙技术融入传统印刷之中,为品牌和个人提供独一无二的创意印刷解决方案。此刻&#…

学习笔记——交通安全分析04

目录 前言 当天学习笔记整理 交通行为、心理与安全 结束语 前言 #随着上一轮SPSS学习完成之后,本人又开始了新教材《交通安全分析》的学习 #整理过程不易,喜欢UP就点个免费的关注趴 #本期内容接上一期03笔记 #最近感觉有点懒,接受各位…

【AI应用探讨】— GPT-4o模型应用场景

目录 1. 自然语言处理(NLP)任务 文本生成 机器翻译 问答系统 2. 聊天机器人与虚拟助手 智能聊天机器人 虚拟助手与陪伴 3. 内容创作与辅助 创意写作 代码生成 4. 教育辅助 学习工具 5. 客户服务与支持 客户服务聊天机器人 技术支持 6. 研…

GitLab教程(六):通过rebase来合并commit

文章目录 1.理解和操作rebase(1)rebase的逻辑(2)实践演示 2.rebase的优缺点 1.理解和操作rebase (1)rebase的逻辑 Git Rebase的基本逻辑是将一个分支的更改移到另一个分支上,同时看起来好像这…

流批一体计算引擎-9-[Flink]中的数量窗与时间窗

1 数量窗 1.1 数量滚动窗口 0基础学习PyFlink——个数滚动窗口(Tumbling Count Windows) 1.1.1 代码分析 Tumbling Count Windows是指按元素个数计数的滚动窗口。 滚动窗口是指没有元素重叠的窗口。 (1)构造了一个KeyedStream,用于存储word_count_data中的数据。…

英伟达算法岗面试,问的贼专业。。。

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

接口返回的文字段落换行问题

接口返回的文字段落换行问题 解决方案:文本中包含\r\n, 使用v-html显示文本,并给便签添加:white-space: pre-wrap;

【Linux】Linux环境基础开发工具_6

文章目录 四、Linux环境基础开发工具gdb 未完待续 四、Linux环境基础开发工具 gdb 我们已经可以写代码了,也能够执行代码了,但是代码错了该如何调试呢?Linux中可以使用 gdb 工具进行调试。 我们写一个简单的程序: 但是我们尝试…

汇编:宏的使用

汇编语言中的宏是用于定义可重复使用的代码块或指令集合的强大工具。宏通过简化代码编写和提高可读性,使得编写和维护汇编程序更加方便;在 MASM(Microsoft Macro Assembler)中,宏的定义和使用非常常见。以下是对汇编语…

java面试题:springMVC的执行流程

请求到达前端控制器DispatcherServlet,该组件是SpringMVC的核心组件,负责接收所有的请求。 DispatcherServlet根据请求中的URL和HandlerMapping找到对应的Controller对象,HandlerMapping是一个接口,定义了请求的URL和对应的Contro…

【linux网络(三)】HTTP协议详解

💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:Linux从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学更多操作系统知识   🔝🔝 Linux网络 1. 前言2. 序列化和…

定个小目标之刷LeetCode热题(16)

针对本题排序流程,主要是将链表拆分为长度为subLength的子链表1和子链表2,然后把子链表1和子链表2合并为一条有序链表,重复上述步骤直到把链表都拆分完,这样这条链表每段长度为2的子链表都是有序的,那么要整条链表有序…

学习ZYNQ——HLS

文章目录 前言一、HLS是什么?二、HLS开发流程三、HLS工程创建四、代码编写1.led.h2.led.cpp3.test_led.cpp 五、C仿真与C综合六、联合仿真七、添加ap_int.h八、再次进行C仿真的Cosimulation九、导出IP核的时候出现报错: 前言 本文主要记录自己学习HLS的…

JavaScript-DOM

DOM 全称:DOM(Document Object Model--文档对象类型) 作用:用来操控网页类容的功能,开发网页特效和实现用户交互 DOM 结构 将HTML文档以树形结构表现出来称之为DOM树 获取DOM 语法:document.querySelector(css选择器) 参数&…

AIGC实践|用AI制作视频短片创作全流程

前言: 在深入探讨了AI在动态有声绘本和小游戏开发的应用之后,本次我们将聚焦于视频创作领域。本篇文章将详细展示如何使用AI工具从概念构思到画面生成再到最终成片的全过程,涵盖剧本创作、分镜头设计、视觉效果生成及音乐配制等各个阶段。让…

B+索引的分裂及选择率和索引基数

1、B树索引的分裂 B树索引页的分裂并不总是从页的中间记录开始,这样可能会导致页空间的浪费。 例子 比如下面这个记录: 1、2、3、4、5、6、7、8、9 由于插入是以自增的顺序进行的,若这时插入第10条记录然后进行页的分裂操作,那…