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

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.hqwc.cn/news/23062.html

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

相关文章

Wi-Fi 相关概念

Wi-Fi 相关概念 802.11 Wi-Fi 标准及其含义频宽 和 带宽 的概念20MHz与40MHz的区别2.4G 频段2.4G的频道编号和中心频率 5G WiFi 频段中国开放的的5G WiFi频段:5G的频道编号和中心频率: 802.11历史进程一、802.11重要发展二、802.11协议族 参考 802.11 Wi…

2023下半年软考高级系统架构设计师怎么报名?

软考高级系统架构设计师报名时间: 广西2023下半年软考高级系统架构设计师报名时间:8月15日8:00至8月24日17:00 广东2023下半年软考高级系统架构设计师报名时间:8月16日9:00-8月24日17:00 甘肃2023下半年软考高级系统架构设计师报名时间&am…

AcWing 107. 超快速排序—逆序对

问题链接: AcWing 107. 超快速排序 问题描述 分析 这道题考查的算法不难,就只是利用归并排序来求逆序对的数量,但是主要是如何分析问题,如何能从问题中看出来和逆序对数量有关,现在的题目基本上很少是那种模板算法题了&#xff…

漏洞复现 || TerraMaster TOS exportUser.php 远程命令执行

阅读须知 技术文章仅供参考,此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失,均由使用者本人负责。…

大坝安全监测中需要做好检查监测

大坝安全监测是人们了解大坝运行状态和安全状况的有效手段和方法。它的目的主要是了解大坝安全状况及其发展态势,是一个包括由获取各种环境、水文、结构、安全信息到经过识别、计算、判断等步骤,最终给出一个大坝安全 程度的全过程。 此过程包括&#xf…

SpringCloud Alibaba——Nacos服务领域模型

目录 一、Nacos服务领域模型二、Nacos服务领域模型图解 一、Nacos服务领域模型 模型名称解释Namespace实现环境隔离,默认值publicGroup不同的service可以组成一个Group,默认值Default-GroupService服务名称Cluster对指定的微服务虚拟划分,默…

Linux自主学习 - 多线程的创建(#include<pthread.h>)

备注:vscode通过ssh连接虚拟机中的ubuntu,ubuntu-20.04.3-desktop-amd64.iso 函数pthread_create() // pthread.h中的函数pthread_create()extern int pthread_create (pthread_t *__restrict __newthread, // 线程标识符const pthread_attr_t *…

python 面向对象编程

文章目录 前言如何理解面向对象编程在 python 中如何使用面向对象编程定义类创建对象self添加和获取对象属性添加属性类外添加属性类中添加属性 访问属性类外访问属性类中访问属性 魔法方法__ init __() 方法__ str __()方法__ del __() 方法 前言 大家好,前面我们…

Rust操作MySQL

查询 本部分是对 「Rust入门系列」Rust 中使用 MySQL[1]的学习与记录 经常使用的时间处理库: chrono 流式查询使用: query_iter 输出到Vec使用: query 映射到结构体使用: query_map 获取单条数据使用: query_first 命名…

网络通信原理系统的认知(NEBASE第十四课)

1 物理层 第一层 物理层:建立、维护、断开物理连接,定义了接口及介质,实现了比特流的传输。 1.1传输层介质分类 有线介质:网线 (双绞线)光纤 无线: 无线电 1.2 双绞线 五类线 cat5 :适用 10…

HOT62-N皇后

leetcode原题链接:N皇后 题目描述 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返…

Docker安装SonarQube

1.查看稳定版本的SonarQube,注意7.9之后的版本不在支持Mysql。使用PostgreSQL Download | SonarQube | Sonar 2.拉取PostgreSQL和SonarQube docker pull postgres docker pull sonarqube:9.9-community community代表社区版 3.在下面的目录下创建docker-compose…