Nginx+GateWay

news2024/10/6 0:35:55

目录

Nginx

nginx如何配置负载均衡

负载均衡有哪些策略

1、轮询(默认)

2、指定权重

3、ip_hash(客户端ip绑定)

4、least_conn(最少连接)

5、fair

6、url_hash

Nginx为什么效率高

gateway

使用gateway都做了那些事情

 Spring Cloud Gateway实战案例(限流、熔断回退、跨域、统一异常处理和重试机制)

在gateway身份认证,权限认证是怎么去做的

路由的断言有那些(路由策略)

如何做动态路由

限流的策略有那些

链路追踪zipkin

链路追踪zipkin的原理是啥

Zipkin 的原理

1. ZipKin 架构

2. Zipkin 核心组件

3. Zipkin 核心结构

4. Zipkin 的工作流程

TraceId spanId是怎么生成的

如何保证微服务之间接口的幂等性?

Nginx

nginx如何配置负载均衡

所谓负载均衡就是:就是把大量的请求按照我们指定的方式均衡的分配给集群中的每台服务器,从而不会产生集群中大量请求只请求某一台服务器,从而使该服务器宕机的情况。

实现负载均衡之前要先实现反向代理,即请求到某个域名,默认该请求被nginx接收到,然后nginx根据配置,类似DNS解析,nginx会根据配置把特定的请求转发到对应的服务器

通过upstream这个配置,写一组被代理的服务器地址,然后配置负载均衡的算法。

upstream mysvr { 
    server 192.168.10.121:3333;
    server 192.168.10.122:3333;
}
server {
    ....
    location  ~*^.+$ {         
        proxy_pass  http://mysvr;  #请求转向mysvr 定义的服务器列表         
    }
}

nginx配置文件详解及其负载均衡; - 笑~笑 - 博客园 (cnblogs.com)

负载均衡有哪些策略

1、轮询(默认)

每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,会自动剔除;

upstream test {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
}
2、指定权重

指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况;

upstream test {
        server 10.0.0.7:80 weight=2;
        server 10.0.0.8:80 weight=1;
}
3、ip_hash(客户端ip绑定)

每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端的服务器,可以解决session问题;

upstream test {
        ip_hash;
        server 10.0.0.7:80;
        server 10.0.0.8:80;
}
4、least_conn(最少连接)

把请求转发给连接数较少的后端服务器。

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

#动态服务器组
upstream dynamic_zuoyu {
  least_conn;  #把请求转发给连接数较少的后端服务器
  server localhost:8080  weight=2; #tomcat 7.0
  server localhost:8081; #tomcat 8.0
  server localhost:8082 backup; #tomcat 8.5
  server localhost:8083  max_fails=3 fail_timeout=20s; #tomcat 9.0
}

2、随机法

通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,

第三方策略

第三方的负载均衡策略的实现需要安装第三方插件。(5、fair 6、url_hash)

5、fair

按后端服务器的响应时间来请求分配,响应时间短的优先分配;

upstream test {
        fair;
        server 10.0.0.7:80;
        server 10.0.0.8:80;
}
6、url_hash

按访问url的hash结果来分配请求,按每个url定向到同一个后端服务器,后端服务器为缓存时比较有效;

upstream test {
        server 10.0.0.7:80;
        server 10.0.0.8:80;
        hash $request_uri;
        hash_method crc32;
}

Nginx为什么效率高

Nginx采用了先进的异步非阻塞IO模型,高度可定制性等特点

Nginx 实现了对epoll的封装,是多进程单线程的典型代表。使用多进程模式,不仅能提高并发率,而且进程之间是相互独立的,一 个worker进程挂了不会影响到其他worker进程。

  • Nginx 采用多进程 + 异步非阻塞方式(IO 多路复用 Epoll)。

gateway

使用gateway都做了那些事情

跨域,路由,限流(一般是sentinel),

(身份认证,权限认证),

熔断回退、统一异常处理和重试机制

 Spring Cloud Gateway实战案例(限流、熔断回退、跨域、统一异常处理和重试机制)

在gateway身份认证,权限认证是怎么去做的

1.使用Session,可使用spring security来实现Session的管理 ,使用redis来存储会话状态,客户端的sessionID需要cookie来存储

2.使用Token,由服务端签发,并将用户信息存储在redis中,客户端每次请求都带上进行验证

3.使用JWT,由服务端签发且不保存会话状态,客户端每次请求都需要验证合法性

路由的断言有那些(路由策略)

如何做动态路由

限流的策略有那些

1,计数器算法

计数器算法为最简答的限流算法,其实现原理是为维护一个单位时间内的计数器。在单位时间内,开始计数器为0,每次通过一个请求计数器+1。如果单位时间内 计数器的数量大于了预先设定的阈值,则在此刻到单位时间的最后一刻范围内的请求都将被拒绝。单位时间结束计数器归零,重新开始计数。

2,漏桶算法

漏桶算法实际为一个容器请求队列,关键要素为 桶大小(队列大小),流出速率(出队速率)。即无论请求并发多高,如果桶内的队列满了,多余进来的请求都将被舍弃。由于桶的流出速率固定,所以可以保证限流后的请求并发数可以固定在一个范围内。

3,令牌桶算法

令牌桶算法为漏桶算法的一种改进。漏桶算法能够控制调用服务的速率,而令牌桶算法不仅能控制调用服务的速率,还能在短时间内允许一个超并发的调用。其实现原理为,存在一个令牌桶,并且有一个持续不断地产生令牌的机制,

Ribbon 7种负载均衡策略

1.轮询策略

轮询策略:RoundRobinRule,按照一定的顺序依次调用服务实例。比如一共有 3 个服务,第一次调用服务 1,第二次调用服务 2,第三次调用服务3,依次类推。 此策略的配置设置如下:

2.权重策略

权重策略:WeightedResponseTimeRule,根据每个服务提供者的响应时间分配一个权重,响应时间越长,权重越小,被选中的可能性也就越低。 它的实现原理是,刚开始使用轮询策略并开启一个计时器,每一段时间收集一次所有服务提供者的平均响应时间,然后再给每个服务提供者附上一个权重,权重越高被选中的概率也越大。 此策略的配置设置如下:

3.随机策略

随机策略:RandomRule,从服务提供者的列表中随机选择一个服务实例。 此策略的配置设置如下:

4.最小连接数策略

最小连接数策略:BestAvailableRule,也叫最小并发数策略,它是遍历服务提供者列表,选取连接数最小的⼀个服务实例。如果有相同的最小连接数,那么会调用轮询策略进行选取。 此策略的配置设置如下:

5.重试策略

重试策略:RetryRule,按照轮询策略来获取服务,如果获取的服务实例为 null 或已经失效,则在指定的时间之内不断地进行重试来获取服务,如果超过指定时间依然没获取到服务实例则返回 null。 此策略的配置设置如下:

6.可用性敏感策略

可用敏感性策略:AvailabilityFilteringRule,先过滤掉非健康的服务实例,然后再选择连接数较小的服务实例。 此策略的配置设置如下:

7.区域敏感策略

区域敏感策略:ZoneAvoidanceRule,根据服务所在区域(zone)的性能和服务的可用性来选择服务实例,在没有区域的环境下,该策略和轮询策略类似。 此策略的配置设置如下:

链路追踪zipkin

链路追踪zipkin的原理是啥

Zipkin 每一个调用链路通过一个 trace id 来串联起来,只要你有一个 trace id ,就能够直接定位到这次调用链路,并且可以根据服务名、标签、响应时间等进行查询,过滤那些耗时比较长的链路节点。

ZipKin 可以分为两部分:

  • ZipKin Server :用来作为数据的采集存储、数据分析与展示;
  • ZipKin Client :基于不同的语言及框架封装的一些列客户端工具,这些工具完成了追踪数据的生成与上报功能。

整体架构如下:

Zipkin 的原理

基本思路是在服务调用的请求和响应中加入ID,标明上下游请求的关系。利用这些信息,可以可视化地分析服务调用链路和服务间的依赖关系。

1. ZipKin 架构

ZipKin 可以分为两部分:

  • ZipKin Server :用来作为数据的采集存储、数据分析与展示;
  • ZipKin Client :基于不同的语言及框架封装的一些列客户端工具,这些工具完成了追踪数据的生成与上报功能。

整体架构如下:

Zipkin链路追踪原理与使用(图文详解)-mikechen的互联网架构

2. Zipkin 核心组件

Zipkin (服务端)包含四个组件,分别是 collector、storage、search、web UI。

1)  collector  信息收集器

collector 接受或者收集各个应用传输的数据。

2)  storage  存储组件

zipkin 默认直接将数据存在内存中,此外支持使用 Cassandra、ElasticSearch 和 Mysql 。

3)  search  查询进程

它提供了简单的 JSON API 来供外部调用查询。

4)  web UI  服务端展示平台

主要是提供简单的 web 界面,用图表将链路信息清晰地展示给开发人员。

3. Zipkin 核心结构

当用户发起一次调用时,Zipkin 的客户端会在入口处为整条调用链路生成一个全局唯一的 trace id,并为这条链路中的每一次分布式调用生成一个 span id。

一个 trace 由一组 span 组成,可以看成是由 trace 为根节点,span 为若干个子节点的一棵树,如下图所示:

4. Zipkin 的工作流程

一个应用的代码发起 HTTP get 请求,经过 Trace 框架拦截,大致流程如下图所示:

1)把当前调用链的 Trace 信息,添加到 HTTP Header 里面;

2)记录当前调用的时间戳;

3)发送 HTTP 请求,把 trace 相关的 header 信息携带上;

4)调用结束之后,记录当前调用话费的时间;

5)把上面流程产生的信息,汇集成一个 span,再把这个 span 信息上传到 zipkin 的 Collector 模块。

TraceId spanId是怎么生成的

● traceId,用于标识某一次具体的请求ID。当用户的请求进入系统后,会在RPC调用网络的第一层生成一个全局唯一的traceId,并且会随着每一层的RPC调用,不断往后传递,这样的话通过traceId就可以把一次用户请求在系统中调用的路径串联起来。

● spanId,用于标识一次RPC调用在分布式请求中的位置。当用户的请求进入系统后,处在RPC调用网络的第一层A时spanId初始值是0,进入下一层RPC调用B的时候spanId是0.1,继续进入下一层RPC调用C时spanId是0.1.1,而与B处在同一层的RPC调用E的spanId是0.2,这样的话通过spanId就可以定位某一次RPC请求在系统调用中所处的位置,以及它的上下游依赖分别是谁。

● annotation,用于业务自定义埋点数据,可以是业务感兴趣的想上传到后端的数据,比如一次请求的用户UID。

上面这三段内容用通俗语言小结一下,traceId是用于串联某一次请求在系统中经过的所有路径,spanId是用于区分系统不同服务之间调用的先后关系,而annotation是用于业务自定义一些自己感兴趣的数据,在上传traceId和spanId这些基本信息之外,添加一些自己感兴趣的信息。

TraceId 生成规则
SOFATracer 通过 TraceId 来将一个请求在各个服务器上的调用日志串联起来,TraceId 一般由接收请求经过的第一个服务器产生。
产生规则是: 服务器 IP + ID 产生的时间 + 自增序列 + 当前进程号 ,比如:
0ad1348f1403169275002100356696
前 8 位 0ad1348f 即产生 TraceId 的机器的 IP,这是一个十六进制的数字,每两位代表 IP 中的一段,我们把这个数字,按每两位转成 10 进制即可得到常见的 IP 地址表示方式 10.209.52.143,您也可以根据这个规律来查找到请求经过的第一个服务器。
后面的 13 位 1403169275002 是产生 TraceId 的时间。之后的 4 位 1003 是一个自增的序列,从 1000 涨到 9000,到达 9000 后回到 1000 再开始往上涨。最后的 5 位 56696 是当前的进程 ID,为了防止单机多进程出现 TraceId 冲突的情况,所以在 TraceId 末尾添加了当前的进程 ID。
说明
TraceId 目前的生成的规则参考了阿里的鹰眼组件。

SpanId 生成规则
SOFATracer 中的 SpanId 代表本次调用在整个调用链路树中的位置。
假设一个 Web 系统 A 接收了一次用户请求,那么在这个系统的 SOFATracer MVC 日志中,记录下的 SpanId 是 0,代表是整个调用的根节点,如果 A 系统处理这次请求,需要通过 RPC 依次调用 B、C、D 三个系统,那么在 A 系统的 SOFATracer RPC 客户端日志中,SpanId 分别是 0.1,0.2 和 0.3,在 B、C、D 三个系统的 SOFATracer RPC 服务端日志中,SpanId 也分别是 0.1,0.2 和 0.3;如果 C 系统在处理请求的时候又调用了 E,F 两个系统,那么 C 系统中对应的 SOFATracer RPC 客户端日志是 0.2.1 和 0.2.2,E、F 两个系统对应的 SOFATracer RPC 服务端日志也是 0.2.1 和 0.2.2。
根据上面的描述可以知道,如果把一次调用中所有的 SpanId 收集起来,可以组成一棵完整的链路树。
假设一次分布式调用中产生的 TraceId 是 0a1234(实际不会这么短),那么根据上文 SpanId 的产生过程,如下图所示:

如何保证微服务之间接口的幂等性?

幂等性:

【接口的幂等性实际上就是接口可重复调用,在调用方多次调用的情况下,接口最终得到的结果是一致的

利用唯一事务ID:

为每个操作请求分配一个唯一的事务ID。服务端检查该ID,如果之前已经处理过,就直接返回原来的处理结果,否则进行处理并存储该ID与结果的关联。
乐观锁:

使用乐观锁可以在更新数据时检查数据版本。每次数据修改时,版本号增加。如果请求中的版本号与服务器上的不匹配,则意味着有其他操作已经修改了数据,当前操作将被拒绝。
Token机制:

在操作开始前,客户端请求一个操作令牌(token),并在随后的操作中使用该token。服务器对每个token只允许一次有效的操作,从而防止重复处理。
指纹机制:

根据请求的特征(如参数、时间戳等)生成请求指纹。服务端检查指纹是否已存在,存在则认为是重复请求。
幂等框架支持:

一些现代框架和组件(如消息队列、数据库等)提供了内建的支持来处理幂等性,例如Kafka的Exactly-once语义,或者数据库的unique constraint。

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

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

相关文章

招展工作的接近尾声“2024上海国际科技创新展会”即将盛大开幕

2024上海国际科技创新展会,即将于6月中旬在上海新国际博览中心盛大召开。随着招展工作的接近尾声,目前仍有少量余位可供各企业和机构预定。这一盛大的科技展会,将汇聚全球智能科技领域的精英,共同展示最新的科技成果,探…

c# - - - winform程序四个角添加圆角效果

winform 给窗体四个角添加圆角效果。 在窗体 Load 事件中添加如下代码: // 创建了一个圆角矩形的路径,并将其设置为控件的形状 System.Drawing.Drawing2D.GraphicsPath path new System.Drawing.Drawing2D.GraphicsPath(); int radius 30; path.AddAr…

将文本中的unicode字符替换成汉字

背景介绍 msql workbench导出数据库表的数据 导出的json数据 [{"english_id":1, "english_word":"ambition", "homophonic":"am-\u4ffa\uff0cbi-\u5fc5,tion-\u80dc\uff1a\u4ffa\u5fc5\u80dc", "chinese":&quo…

PWM 开发舵机SG90-硬件舵机实战

1.PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节…

Kafka分级存储概念(一)

Kafka分级存储及实现原理 概述 Kafka社区在3.6版本引入了一个十分重要的特性: 分级存储,本系列文章主要旨在介绍Kafka分级存储的设计理念、设计细节以及具体的代码实现 背景:为什么要有分级存储? 场景 作为一款具有高吞吐及高性能的消息中间件,Kafka被广泛应用在大数据、…

28 - 算术运算指令

---- 整理自B站UP主 踌躇月光 的视频 文章目录 1. ALU改进2. CPU 整体电路3. 程序4. 实验结果 1. ALU改进 此前的 ALU: 改进后的 ALU: 2. CPU 整体电路 3. 程序 # pin.pyMSR 1 MAR 2 MDR 3 RAM 4 IR 5 DST 6 SRC 7 A 8 B 9 C 10 D 11 DI 1…

Unity 性能优化之图片优化(八)

提示:仅供参考,有误之处,麻烦大佬指出,不胜感激! 文章目录 前言一、可以提前和美术商量的事1.避免内存浪费(UI图片,不是贴图)2.提升图片性能 二、图片优化1.图片Max Size修改&#x…

OpenCampass评测实战 作业

按照如下教程文档操作即可:https://aicarrier.feishu.cn/wiki/NxUOwnLuvi0clykyzj7ccSHPndb

基于52单片机的AS608指纹密码锁电路原理图+源程序+PCB实物制作

目录 1、前言 2、实物图 3、PCB图 4、原理图 5、程序 资料下载地址:基于52单片机的AS608指纹密码锁电路原理图源程序PCB实物制作 1、前言 这是一个基于AS608STC89C52单片机的指纹识别和键盘密码锁。 里面包括程序,原理图,pcb图和实…

拉普拉斯丨独家冠名2024年度ATPV技术分论坛,助力产业科技持续创新

为了进一步促进行业技术交流,推进光伏行业发展及标准建设的进程,针对高效电池,领跑组件,新产品认证及应用等技术专题及国内外光伏标准的最新进程,由中国绿色供应链联盟光伏专委会(ECOPV)指导的2…

Linux安装Python3.9环境

大家好,今天给大家分享一下在Linux系统中安装Python3环境,Linux系统中自带的Python2尽量不要删除,删除后可能会导致系统出现问题。 关于Linux常用命令,可以参考:作为测试人员的Linux常用命令 一、下载Python3安装包 …

笔试强训Day17 字符串 前缀和

BC45 小乐乐改数字 题目链接&#xff1a;小乐乐改数字_牛客题霸_牛客网 (nowcoder.com) 思路&#xff1a; 水题一道 注意前导0. AC code&#xff1a; #include <iostream> #include<string> using namespace std; string a,b; int main() {cin >> a;for…

【Linux系列】tail查询使用

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Springboot集成Mybatispuls操作mysql数据库-03

MyBatis-Plus&#xff08;简称MP&#xff09;是一个MyBatis的增强工具&#xff0c;在MyBatis的基础上只做增强而不做改变。它支持所有MyBatis原生的特性&#xff0c;因此引入MyBatis-Plus不会对现有的MyBatis构架产生任何影响。MyBatis-Plus旨在简化开发、提高效率&#xff0c;…

yum常用命令与lrzsz的在线安装

yum命令 yum&#xff08; Yellow dog Updater, Modified&#xff09;是一个在 Fedora 和 RedHat 以及 SUSE 中的 Shell 前端软件包管理器。 基于 RPM 包管理&#xff0c;能够从指定的服务器自动下载 RPM 包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装…

python数据分析所需要的语法基础

Python语言基础——语法基础 前言语法基础变量标识符数据类型输入与输出代码缩进与注释 总结 前言 对于学过C语言的人来说&#xff0c;python其实很简单。学过一种语言&#xff0c;学习另一种语言&#xff0c;很显然的能感觉到&#xff0c;语言大体上都是相通的。当然&#xf…

nacos开启登录开关启动报错“Unable to start embedded Tomcat”

nacos 版本&#xff1a;2.3.2 2.2.2版本之前的Nacos默认控制台&#xff0c;无论服务端是否开启鉴权&#xff0c;都会存在一个登录页&#xff1b;在之后的版本关闭了默认登录页面&#xff0c;无需登录直接进入控制台操作。在这里我们可以在官网可以看到相关介绍 而我现在所用的…

代码随想录-算法训练营day31【贪心算法01:理论基础、分发饼干、摆动序列、最大子序和】

代码随想录-035期-算法训练营【博客笔记汇总表】-CSDN博客 第八章 贪心算法 part01● 理论基础 ● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和 贪心算法其实就是没有什么规律可言&#xff0c;所以大家了解贪心算法 就了解它没有规律的本质就够了。 不用花心思去研究其…

软件测试与管理-白盒测试-基本路径测试法

知识点&#xff1a; 1.原理 是在程序控制流图的基础上&#xff0c;通过分析控制构造的环路复杂性&#xff0c;导出基本可执行路径的集合&#xff0c;然后根据可执行路径进行测试用例设计的方法。此方法设计出的测试用例需保证被测程序的每个可执行语句至少执行一次。 2.步骤 &a…

Netty 实现dubbo rpc

一、RPC 的基本介绍 RPC (Remote Procedure Call) 远程过程调用&#xff0c;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无需额外的为这个交互编程。也就是说可以达到两个或者多个应用程序部署在不同的服务器上&…