微服务系列文章之 nginx负载均衡

news2024/9/22 21:35:11

nginx负载均衡

负载均衡建立在现有网络结构之上,提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽,增加吞吐量、加强网络数据处理能力、提高网络的灵活性和可用性。

随着网站的发展,服务器压力越来越大,我们可能首先会将数据库,静态文件分离出去。但是随着发展,单独业务API的请求的压力也会变得很大,这时候我们可能需要做负载均衡将一台服务器面临的压力分散到多台服务器上。

nginx 不仅可以作为强大的web服务器,也可以作为反向代理服务器,而且nginx还可以按照调度规则实现动静分离,还可以对后端的服务器做负载均衡

nginx负载均衡配置

nginx的负载均衡主要是对proxy_pass和upstream的配置。

我们首先需要建立一个Spring Boot的项目对外提供服务,来模拟我们实际的服务,还可以配置其它可以提供网络请求处理的框架来提供服务,这里具体由什么来提供服务和nginx配置并不相关。

Spring Boot 项目建立的过程就不提了,这里只贴一下主要的代码:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@SpringBootApplication
public class NginxtestApplication {

    @Value("${server.port:}")
    private String port;

    public static void main(String[] args) {
        SpringApplication.run(NginxtestApplication.class, args);
    }

    @GetMapping("")
    public String hello() {
        System.out.println("call me " + port);
        return "i am " + port;
    }

}

将项目打包后,我们执行下面的命令

java -jar test.jar --server.port=8001
java -jar test.jar --server.port=8002

接下来我们打开nginx的配置文件

http {
    upstream upstream_name{
        server 192.168.0.28:8001;
        server 192.168.0.28:8002;
    }

    server {
        listen       8080;
        server_name  localhost;

        location / {
            proxy_pass http://upstream_name;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

我这里没有把默认的一些配置贴出来。

首先,在http下添加 upstream upstream_name {} 来配置要映射的服务器。

其中的upstream_name大家可以指定为服务的域名或者项目的代号。

server下的location 我们将 / 下的全部请求转发到 http://upstream_name ,也就是我们上面配置的服务器列表中的某一台服务器上。具体是哪台服务器,nginx会根据配置的调度算法来确认。

我们在浏览器中打开localhost:8080。多刷新几次就可以看到页面上的内容发生了变化。

 

nginx负载均衡策略

nginx的负载均衡策略有4种:

轮询(默认)

最基本的配置方法,它是upstream的默认策略,每个请求会按时间顺序逐一分配到不同的后端服务器。

参数有:

参数描述
fail_timeout与max_fails结合使用
max_fails设置在fail_timeout参数设置的时间内最大失败次数,如果在这个时间内,所有针对该服务器的请求都失败了,那么认为该服务器会被认为是停机了
fail_time服务器会被认为停机的时间长度,默认为10s。
backup标记该服务器为备用服务器。当主服务器停止时,请求会被发送到它这里。
down标记服务器永久停机了。

注意:

  • 在轮询中,如果服务器down掉了,会自动剔除该服务器。
  • 缺省配置就是轮询策略。
  • 此策略适合服务器配置相当,无状态且短平快的服务使用。

权重

在轮询策略的基础上制定沦陷的几率。例如

upstream foo {
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

这里例子中,weight参数用于制定轮询的几率,weight默认值为1;weight的数值和被访问的几率成正比。

注意:

  • 权重越高分配到需要处理的请求越多。
  • 此策略可以与least_conn和ip_hash结合使用。
  • 此策略比较适合服务器的硬件配置差别比较大的情况。

ip_hash

负载均衡器按照客户端IP地址的分配方式,可以确保相同客户端的请求一直发送到相同的服务器。这样每个访客都固定访问一个后端服务器。

upstream foo {
    ip_hash;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:

  • 在nginx版本1.3.1之前,不能在ip_hash中使用权重(weight)。
  • ip_hash不能与backup同时使用。
  • 此策略适合有状态服务,比如session。
  • 当有服务器需要剔除,必须手动down掉。

least_conn 最小连接

把请求转发给连接数较少的后端服务器。轮询算法是把请求平均的转发给各个后端,使它们的负载大致相同;但是,有些请求占用的时间很长,会导致其所在的后端负载较高。这种情况下,least_conn这种方式就可以达到更好的负载均衡效果

upstream foo {
    least_conn;
    server localhost:8001 weight=2;
    server localhost:8002;
    server localhost:8003 backup;
    server localhost:8004 max_fails=3 fail_timeout=20s;
}

注意:

  • 此负载均衡策略适合请求处理时间长短不一造成服务器过载的情况。

除了上面这些调度策略之后,还有一些第三方的调度策略可以集成到nginx中。

在实际运用中,需要根据不同的场景选择不同的策略,大多是多种策略结合使用以达到实际需求的性能。

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

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

相关文章

虚拟IP绑定公网IP访问

绑定公网 IP 我们目前的虚拟 IP,还不能通过公网的形式进行访问,我们首先,来使用内部的 IP 进行访问看看效果如下: curl 虚拟IP 如上图我访问了两次,第一次访问返回的是 2222 的 nginx,第二次访问是 1111 的…

【SpringCloud-9】JWT

这一篇主要介绍一下,微服务之间的用户权限问题。 通常呢,对于用户的登录鉴权,有两种方式: 1、基于session的方式: session是要存到服务端的,但是分布式服务太多,不可能每个服务端都存。 那就…

Python:文件选择界面 and 文件夹选择界面

文章目录 (1)文件选择界面(2)文件夹选择界面 Python本身没有内置的文件夹选择界面。然而,可以使用第三方库来实现在代码中选择文件或文件夹的功能。一个常用的库是tkinter,它是Python的标准GUI库之一&#…

IDEA中侧边栏没有git commit模块,如何恢复?

一、修改之前 侧边栏没有git commit模块 二、修改之后 侧边栏恢复了git commit模块 三、下面是恢复教程 1.中文版 打开 文件 -> 设置 -> 版本控制 -> 提交 -> 勾选 【使用非模式提交界面】 -> 点击【确定】 2.英文版 打开 file -> Settings -> Version Co…

ABB机器人在RobotStudio中进行数字与字符串相互转换的具体方法

ABB机器人在RobotStudio中进行数字与字符串相互转换的具体方法 如下图所示,打开RobotStudio软件,在RAPID—Module1中编写程序,首先声明几个测试需要用到的变量, 本例中利用 NumToStr 函数将数组变量中的元素依次转换成字符后赋值给tempString变量, 如下图所示,利用 StrTo…

第八章 npm锁定版本

1、历史原因 当我们走 npm install 带 ^ 会升级 为什么要锁版本 稳定大于一切 代码需要可控 风险可控 系统可控 环境需要一致

第四章 React18的重要更新和使用的新特性

1、7个新特性 2、3个新API 3、1个新模式 4、2个新并发API 1、7个新特性 Render API 使用了它才可以进入并发模式的渲染 setState自动批处理 有些情况,不希望合并处理 flsuhSync 关于卸载组件时的更新状态警告(直接删除这个报错) 关于r…

nacos启动问题整理

一 win下启动 1、nacos1.X启动 2、nacos2.X启动 2.x需要jdk11以上版本 1)打开bin目录,修改startup.com脚本 启动模式,点击startup.cmd默认启动的集群模式,需要修改这个启动文件 2) 连接mysql,执行sql…

【笔记】数字电路基础2 - 数制编码与逻辑电路

目录 数制、编码与逻辑代数数制编码逻辑代数 组合逻辑电路组合逻辑电路分析与设计编码器译码器加法器数值比较器数据选择器奇偶校验器 数制、编码与逻辑代数 数制 本小节主要陈述十进制、二进制、十六进制及其对应的转换法则,网上对应的文章已经有很多,…

一文搞定SpringBoot中日志框架使用

文章目录 Spring Boot 对日志框架的封装SLF4J Logback快速入门调试模式Logback 扩展SLF4J Log4J2 Spring Boot 对日志框架的封装 我们知道在日志方面,SpringBoot默认是使用的SLF4JLogBack的形式。我们来看看它使用的日志实现框架LogBack,其在 Default…

Tomcat、Maven以及Servlet的基本使用

Tomcat什么是TomcatTomcat的目录结构启动Tomcat MavenMaven依赖管理流程配置镜像源 Servlet主要工作实现Servlet添加依赖实现打包分析 配置插件 Tomcat 什么是Tomcat Tomcat 是一个 HTTP 服务器。前面我们已经学习了 HTTP 协议, 知道了 HTTP 协议就是 HTTP 客户端和 HTTP 服务…

LinearAlgebraMIT_4_矩阵的LU分解

矩阵做逆变换需要要反过来,如下, 转置的逆等于逆的转置。 在知道了上面的基础知识后,我们进行矩阵的分解,常见如LU分解和LDU分解,如下, 在这里,我们首先具有一个矩阵A,我们对矩阵A进…

用html+javascript打造公文一键排版系统3:获取参数设置、公文标题排版

我们用自定义函数setDocFmt()来实现对公文的排版。 一、获取公文参数值 要对公文进行排版,首先要读取公文“参数设置”区中的参数值。比如公文要求对公文标题的一般规定是:一般用2号小标宋体字,居中显示。标题与正文中间空一行。 这些是“参…

Git---企业级开发模型

文章目录 前言拓展 一、系统开发环境二、Git分支设计规范master分支release分支develop分支feature分支hotfix分支 三、企业级项目管理实战准备工作创建项目创建仓库添加成员1. 添加企业成员2.添加项目成员3. 添加仓库开发⼈员 开发场景-基于git flow模型的实践新需求加入修复测…

Python之字典(dict)基础知识点

文章目录 一、创建字典1.1 基于dict函数创建1.2 基于{}创建1.3 基于空字典添加元素创建 二、访问字典三、修改字典四、删除字典五、字典的常用方法5.1 dict.items()方法5.2 dict.get()方法5.3 dict.setdefault()方法 参考资料 字典是python当中的一种数据类型,其结果…

Kafka入门,手动提交offset,同步提交,异步提交,指定 Offset 消费(二十三)

手动提交offset 虽然offset十分遍历,但是由于其是基于时间提交的,开发人员难以把握offset提交的实际。因此Kafka还提供了手动提交offset的API 手动提交offset的方法有两种:分别commitSync(同步提交)和commitAsync(异步提交)。两者的相同点是&…

conda创建环境等相关知识

1、首先下载Anaconda,官网下载即可,打开如下选项, 2、创建一个环境:命令如下 conda create -n 虚拟环境名称 python?实例:创建一个pytorch环境,指定python版本为3.9版本 conda create -n pytorch pytho…

【七天入门数据库】第一天 MySQL的安装部署

系列文章传送门: 【七天入门数据库】第一天 MySQL的安装部署 【七天入门数据库】第二天 数据库理论基础 【七天入门数据库】第三天 MySQL的库表操作 MySQL数据库存在多种版本,不同的版本在不同的平台上(OS,也就是操作系统上&a…

文件资源管理器卡住,使用任务管理器结束任务后桌面图标和任务栏消失的解决方案

事情的起因是这样的,我想删除压缩包里的一张照片,结果文件资源管理器就卡住了,删除进度一直是0%,等了好久也没反应。没办法,只能掏出秘密武器任务管理器了,找到文件资源管理器,右键选择结束任务…

游戏渲染技术:前向渲染 vs 延迟渲染 vs Forward+渲染 (一)

在这篇文章中,会分析和对比三种渲染算法: 前向渲染(Forward Rendering)延迟着色(Deferred Shading)Forward(基于Tile的前后渲染) 介绍 前向渲染 前向渲染是通过在场景中光栅化每个几何对象来工作的,在着色过程中,通过迭代每个灯…