微服务API网关框架详解
一、单节点场景
网关的作用:
- 统一入口
- 安全:黑名单、权限身份认证
- 限流:实现微服务访问流量计算,基于流量计算分析进行限流,可以定义多种限流规则
- 缓存:数据缓存
- 日志:日志记录
- 监控:记录请求响应数据,api耗时分析,性能监控
- 重试:异常重试
- 熔断:降级
现有网关框架:
二、网关技术选型
微服务:dubbo,spring cloud
反向代理框架:nginx
kong、orange(nginx + lua)技术
lua脚本开发,游戏开发--lua脚本,
nginx, openresty升级版本的nginx,lua类库
---------------------------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------------------------
nginx + lua:黑/白名单、限流
zuul: 重试、熔断
nginx的安装:
三、正向代理和反向代理
正向代理:
用户知道网站C的地址,但是因为网络原因访问不了;但服务器A可以访问服务器C, 这样用户可以把服务器A设置为正向代理服务器。由服务器A去请求服务器C,然后服务器A把数据返回给用户;
反向代理:
用户需要访问一些服务器应用,但对方不想把服务器地址暴露给用户,这样可以确保安全。
那用户怎么访问呢?可以通过反向代理服务器,用户只需要知道反向代理服务器地址就可以 ,最后反向代理服务器去访问服务器的应用;
总结:
正向代理服务器和反向代理服务器的区别:
- 1. 正向代理:是需要在用户的电脑上,配置正向代理服务器的;而反向代理不需要,因为用户是直接访问的反向代理服务器
- 2. 应用场景:
正向代理的应用场景: 用户是知道目标服务器的地址,如:www.google.com,但是不能直接访问,那么就需要在用户电脑配置一个正向代理服务器,用户再次访问的地址:www.google.com;
反向代理的应用场景:用户本来就不知道目标服务器的地址;而是由平台方提供一个反向代理服务器的地址,用户直接访问反向代理服务器的地址就行;不管目标服务器有多少,用户不需要关心,只要访问反向代理服务器就ok;由反向代理服务器去解析访问目标服务器;
- 3. 反向代理:极大的保护了应用的安全性,而且此结构可以很好的搭建负载均衡;
四、nginx命令和信号控制:
4.1、nginx命令:
4.2、nginx检查配置文件
检查配置文件是否正确:
第一种: 进入nginx可执行程序的目录
# cd /usr/local/nginx/sbin/
# ./nginx -t
第二种:
# /usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
4.3、nginx的信号控制
Nginx支持2种进程模型:Single和Master-Worker
Single是单进程,一般不适用
Master-Worker是主进程和工作进程模型运行,主进程对工作进程管理。
Nginx允许我们通过信号来控制主进程,用信号的方式可以达到不影响现有连接的目的。
信号类型:
4.3.1、nginx平滑升级
1.平滑升级
2. 执行信号平滑升级
3.kill -WINCH 旧的主进程号
4. #kill -QUIT `cat /usr/local/nginx/logs/nginx.pid.oldbin` 优雅的关闭
给旧的主进程发送QUIT信号后,旧的主进程退出,并移除logs/nginx.pid.oldbin文件,nginx的升级完成;
查看一下升级后的版本:
./nginx -V
4.3.2 中途停止升级,回滚到旧的nginx
在步骤(3)时,如果想回到旧的nginx不再升级:
1. 给旧的主进程号发送HUP命令,此时nginx不重新读取配置文件的情况下,重新启动旧主进程的工作进程。
kill -HUP 9944 -- 旧主进程号
重启工作进程
2. 优雅的关闭新的主进程
kill -QUIT 10012 --新主进程号
五、nginx的配置文件
nginx.conf文件
-- 以什么样的用户权限去运行程序,nobody是个低权限用户,为了安全,下面注释掉
#user nobody;
-- worker的进程数(根据CPU的内核数设置,一般设置为CPU核数),nginx启动的时候会开两种进程,master进程用来管理调度,worker进程用来处理请求
worker_processes 1;
#查看CPU核数
#cat /proc/cpuinfo--全局错误日志输出(nginx的error_log类型如下:从左到右:debug最详细,crit最少)
#[ debug | info | notice | warn | error | crit ]
#例如:error_log logs/error.log crit;
#解释:日志文件存储在nginx安装目录下的 logs/error.log, 错误类型为 crit,也就是记录最少错误信息;#error_log logs/error.log;
#error_log logs/error.log notice;
--info 日志输出等级
#error_log logs/error.log info; --PID文件,记录当前启动的nginx的进程ID
#pid logs/nginx.pid; events {--单个worker进程最多开启的线程数(默认:1024),如1个word能同事允许多少连接,一个子进程最大允许连接1024个连接(优化设置应该等同于worker_rlimit_nofile设置值,表明一个线程处理一个http请求,同时可以处理一个文件数,各个模块之间协调合作不等待)worker_connections 1024;
}--设定http服务器,利用它的反向代理功能提供负载均衡支持
http {-- 默认打开的文件类型--设定mime类型,类型由mime.type文件定义include /etc/nginx/mime.types;default_type application/octet-stream;--设定日志格式#log_format main '$remote_addr - #remote_user [$time_local] "#request" '# '$status $body_bytes_sent "$http_referer" '# ' "$http_user_agent" "$http_x_forwarded_for" ';--对应上面的日志格式#access_log logs/access.log main;--开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统负载。注意:如果图片显示不正常,把这个改为offsendfile on;tcp_nopush on; --防止网络阻塞tcp_nodelay on; --防止网络阻塞--长链接超时时间(秒)#keepalive_timeout 0;keepalive_timeout 65;--开启gzip压缩#gzip on;#gzip_disable "MSIE [1-6]\."; --IE6及以下禁止压缩#gzip_min_length 1k; --最小压缩文件大小#gzip_buffers 4 16k; -- 压缩缓存区#gzip_http_version 1.0; -- 压缩版本(默认1.1,前端如果是squid2.5请使用1.0)#gzip_comp_level 2; --压缩等级#gzip_types text/plain application/x-#gzip_vary on; --给CDN和代理服务器使用,针对相同url,可以根据头信息返回压缩和非压缩副本#设定请求缓存client_header_buffer_size 1k; --上传文件大小限制large_clinet_header_buffers 4 4k; --设定请求缓存#设定负载均衡的服务器列表(可以配置多个)(不配置也可以)upstream mysvr {#weight参数表示权值,权值越高被分配到的几率越大server 92.168.8.1x:3128 weight=5;server 92.168.8.2x:80 weight=1;server 92.168.8.3x:80 weight=6;}upstream mysvr2 {#weight参数表示权值,权值越高被分配到的几率越大server 92.168.8.x:80 weight=1;server 92.168.8.x:80 weight=6;}--配置虚拟主机段server {--监听的端口listen 80;--访问的域名(域名可以有多个,用空格隔开)server_name localhost;--设置编码#charset koi8-r;--设定本虚拟主机的访问日志#access_log logs/localhost.access.log main;--路由(定位:把特殊的路径或文件再次定位)location / {--定义服务器的默认网站根目录位置root /root;--定义首页索引文件的名称index index.html index.html;--请求转向mysvr 定义的服务器列表proxy_pass http://mysvr;}# error_page 404 /404.html;# redirect server error pages to the static page /50x.html;#--定义错误提示页面error_page 500 502 503 504 /50x.htmllocation = /50x.html {root /root;}--本地动静分离反向代理配置(所有jsp的页面均交由tomcat或resin处理)location ~ .(jsp|jspx|do)?$ {proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://127.0.0.1:8080;}--静态文件,nginx自己处理location ~ ^/(images|javascript|js|css|flash|media|static)/ {root /var/www/virtual/htdocs;--过期30天,静态文件不怎么更新,过期可以设大一点,如果频繁更新,则可以设置的小一点expires 30d;}--设定查看Nginx状态的地址location /NginxStatus {stub_status on;access_log on;auth_basic "NginxStatus";auth_basic_user_file conf/htpasswd;--htpasswd文件的内容可以用apache提供的htppasswd工具来产生;}--禁止访问 .htxxx文件location ~ /\.ht {deny all;}# proxy the PHP scripts to Apache listening on 127.0.0.1:80## location ~ \.php${proxy_pass http://127.0.0.1;#}# proxy the PHP scripts to FastCGI server listening on 127.0.0.1:9090## location ~ \.php${# root html;# fastcgi_pass http://127.0.0.1:9000;# fastcgi_index index.php;# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;# include fastcgi_params;#}}server {}
}
六、nginx配置连接数
处理高并发等
worker_processes: 表示开启nginx的worker进程的个数,nginx启动会开两种进程,master进程用来管理调度,worker进程用来处理请求;
下面表示两种设置方法,比如:
注: 如果服务器CPU有限,
比如:2核CPU,开启2个进程,设置如下:
worker_processes 2
worker_cpu_affinity 01 10;
比如:2核CPU,开启4个进程,设置如下:
worker_processes 4
worker_cpu_affinity 0001 0010 0100 1000;
比如:8核CPU,开启4个进程,设置如下:
worker_processes 8
1个worker进程能够最大打开的文件数(线程数)worker_connections=65535(参考worker_rlimit_nofile)
--------------------------------------------------------------------------------------------------------------
#nginx作为http服务器
请求模型: client <----------> nginx
#max_clients = worker_processes * worker_connections/2
#nginx作为反向代理服务器的时候
请求模型: client <----------> nginx <-------------> web server
#max_clients = worker_processes * worker_connections/4
七、nginx的虚拟主机
原始客户端访问不同的网站,需要部署多台主机:
配置nginx虚拟主机后:
7.1 虚拟主机
虚拟主机使用的是特殊的软硬件技术,它把一台运行在因特网上的服务器主机分成一台台"虚拟"的主机,每台虚拟主机都可以是一个独立的网站,可以具有独立的域名,具有完整的Internet服务器功能(WWW、FTP、Email等),同一台主机上的虚拟主机之间是完全独立的。
从网站 访问者来看,每一台虚拟主机和一台独立的主机完全一样。利用虚拟主机,不用为每个要运行的网站提供一台单独的Nginx服务器或单独运行一组Nginx进程。虚拟主机提供了在同一台服务器、同一组Nginx进程上运行多个网站的功能;
7.2 配置虚拟主机
我们先配置在一个nginx中配置一个虚拟主机,编辑nginx.conf配置文件,在http模块中,配置server模块,一个server模块就针对一个虚拟主机;
我们模拟一个独立的网站,此网站域名访问www.server1.com;网站的根目录放到nginx目录下html/server1目录,我们创建一个首页index.html到server1中,编辑index.html
<!DOCTYPE html>
<html>
<head><title>server1 首页 </title>
</head>
<body><h1>server1 首页</h1>
</body>
</html>
下面我们回到nginx.conf配置文件中,配置server模块
#虚拟主机server1模板
server {#监听80端口listen 80;#虚拟主机名称,可以为域名或Ip地址server_name www.server1.com;charset utf-8;#默认请求路由location / {root html/server1;index index.html index.htm;}
}#虚拟主机server2模板
server {#监听80端口listen 80;#虚拟主机名称,可以为域名或Ip地址server_name www.server2.com;charset utf-8;#默认请求路由location / {root html/server2;index index.html index.htm;}
}
注:
1. nginx.conf 每次更新,都需要重启nginx
2. 配置server模块时,监听的端口 listen 和 server_name 组合起来是唯一的,如果server_name一样,那么listen监听的端口就不一样;
如端口一样,server_name就不一样;
虚拟主机的请求映射系统才能够判别;
访问server1的网址:
更新hosts文件:
添加server2的网址
访问server2的网址:
八、nginx日志以及切割
error_log logs/error.log :nginx启动时,监听nginx状态的输出日志
--全局错误日志输出(nginx的error_log类型如下:从左到右:debug最详细,crit最少)
#[ debug | info | notice | warn | error | crit ]
#例如:error_log logs/error.log crit;
#解释:日志文件存储在nginx安装目录下的 logs/error.log, 错误类型为 crit,也就是记录最少错误信息;#error_log logs/error.log;
http里面的access.log 负责输出客户访问网站服务器时的日志
--设定http服务器,利用它的反向代理功能提供负载均衡支持
http {-- 默认打开的文件类型--设定mime类型,类型由mime.type文件定义include /etc/nginx/mime.types;default_type application/octet-stream;--设定日志格式#log_format main '$remote_addr - #remote_user [$time_local] "#request" '# '$status $body_bytes_sent "$http_referer" '# '"$http_user_agent" "$http_x_forwarded_for" ';--对应上面的日志格式#access_log logs/access.log main;--开启高效文件传输模式,sendfile指令指定nginx是否调用sendfile函数来输出文件,对于普通应用设为on,如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络I/O处理速度,降低系统负载。注意:如果图片显示不正常,把这个改为offsendfile on;}
8.1 日志文件格式配置
$http_x_forwarded_for : 是反向代理服务器转发客户端地址的参数
假设将nginx服务器作为web服务器,位于负载均衡设备、Squid、Nginx,反向代理之后,不能获取到客户端的真实IP地址了;
原因:经过反向代理之后,由于在客户端和web服务器之间增加了中间层,因此web服务器无法直接拿到客户端的IP;
解决:通过$remote_addr变量拿到的将是反向代理服务器的IP地址,但是,反向代理服务器在转发请求的HTTP头信息中,可以增加X-Forward-For信息,用以记录原有的客户端IP地址和原来客户端请求的服务器地址;
这时候,要用log_format指令设置日志格式,让日志记录X-Forearded-For信息中的IP地址,即客户的真实IP
8.2 access_log 指令
语法:access_log path [format [buffer=size [flush=time] ] ]
access_log path format gzip[=level] [buffer = size] [flush = time]
access_log off;
默认值:access_log logs/access.log combined;
配置段:
- gzip 压缩等级
- buffer 设置内存缓存区大小
- flush 保存在缓存区中的最长时间
不记录日志:access_log off;
使用默认combined格式记录日志:access_log logs/access.log 或 access_log logs/access.log combined;
值得注意的是:Nginx进程设置的用户和组必须对日志路径有创建文件的权限,否则,会报错;
此外,对于每一条日志记录,都将是先打开文件,再写入日志,然后关闭。可以使用open_log_file_cache来设置日志文件缓存(默认是off);
8.3 日志文件切割
nginx日志默认情况下统一写入一个文件中,文件会变得越来越大,非常不方便查看分析。以日期来作为日志的切割是比较好的,通常我们是以每日来做统计的;
下面说一下nginx日志切割:
一般以日期作为名称来分割存储
access.log -------->access-2022-07-03.log -------->access-2022-07-04.log
通过mv命令,把当前log文件重命名
mv logs/access.log logs/access-2022-07-03.log
系统自动切割:
利用sh脚本的方式执行刚才的手动操作,在每天凌晨执行一个计划任务,调用sh脚本,就完成的系统自动切割日志文件
编写脚本:
九、nginx的location详解
9.1 语法规则:
构成:
指令 前缀 uri
location [=|~|~*|^~] /uri
9.2 location 区分普通匹配和正则匹配
location 作用于server模块,且支持多个location模块
server {....location /p {root html/p;index index.html index.htm;}location = /50x.html {root html;}location / {root html/server1;index index.html index.htm;}}
在多个location 情况下,是按照什么原则进行匹配的?
1. 匹配的原则:
2. 正则匹配:
为顺序匹配
3. 如果location有普通匹配也有正则匹配,那匹配的原则为:
例子:有如下匹配的规则:
4. 在实际场景中,通常至少有三个匹配规则定义,如下:
#直接匹配网站根,通过域名访问网站首页比较频繁,使用这个会加速处理。
这里是直接转发给后端应用服务器了,也可以是一个静态首页
十、nginx的负载均衡
当一台服务器单位时间内访问量很大的时候,服务器压力就会很大,当达到这台服务器的极限,就会奔溃,
怎么解决?
可以通过nginx的反向代理设置,添加几台同样功能的服务器,分担压力;
nginx实现负载均衡的原理:
用户首先访问到nginx服务器,然后nginx服务器再从应用服务器集群中选择压力比较小的服务器,然后将该访问请求引向该服务器。
如应用服务器集群中某一台服务器奔溃,那么从待选择服务器列表中将该服务器删除,也就是说一个服务器奔溃了,那么nginx服务器不会把请求引向到该服务器;
三种负载均衡方案:
#随机轮询
upstream mypro {server 192.168.5.140:8080;server 192.168.5.141:8080;
}#权重值
upstream mypro {server 192.168.5.140:8080 weight=5;server 192.168.5.141:8080 weight=10;
}ip_hash
upstream mypro {ip_hash;server 192.168.5.140:8080;server 192.168.5.141:8080;
}
十一、nginx 的echo模块安装
十二、openresty
12.1 openresty 背景
12.2 openresty 安装
1. 下载安装
#选择模块: ./configure -- help
2. 安装成功后,默认会在 /usr/local/openresty/
3. 设置环境变量
12.3 openresty 的hello world
1. ngx_lua模块的hello world
编辑nginx下conf配置文件nginx.conf
2. nginx的内部变量
结果:
十三、lua
13.1 lua介绍
13.2lua基本语法一
13.3 lua基本语法二
13.4 lua基本语法三
13.5 lua基本语法四
13.6 lua运算符
微服务API网关框架详解相关推荐
- vivo亿级微服务 API 网关架构实践
一.背景介绍 网关作为微服务生态中的重要一环,由于历史原因,中间件团队没有统一的微服务API网关,为此准备技术预研打造一个功能齐全.可用性高的业务网关. 二.技术选型 常见的开源网关按照语言分类有如下 ...
- 又肝了下微服务 API 网关“金刚”,也是蛮香的~
" 摘要: 原创出处 http://www.iocoder.cn/Kong/install/ 「芋道源码」欢迎转载,保留摘要,谢谢! 1. 概述 2. 快速安装 3. Kong 控制台 4. ...
- Kong 1.0 GA 版本正式发布,微服务 API 网关
Kong 1.0 GA 版本已正式发布,这是一款可扩展.快速且开源的微服务 API 网关,用于管理.保护与连接混合及云原生架构.Kong 运行于全部服务之前,并可以通过插件实现各种扩展,例如身份验证. ...
- vivo 微服务 API 网关架构实践
一.背景介绍 网关作为微服务生态中的重要一环,由于历史原因,中间件团队没有统一的微服务API网关,为此准备技术预研打造一个功能齐全.可用性高的业务网关. 二.技术选型 常见的开源网关按照语言分类有如下 ...
- api网关选型_微服务 API 网关 APISIX 发布 0.5 版本,达到可用状态
项目介绍 APISIX (https://github.com/iresty/apisix) 是一个云原生.高性能.可扩展的微服务 API 网关. APISIX 基于 OpenResty 和 etc ...
- 使用微服务/ API网关(如Solo Gloo)公开在AWS EKS中运行的微服务
因此,您决定在AWS中运行Kubernetes工作负载. 正如我们在设置AWS EKS 之前所看到的,需要很多耐心和头痛. 您也许可以使其正常运行. 对于其他用户,您应该从Weaveworks中 ek ...
- gloo pytorch_使用Solo Gloo等微服务/ API网关公开在AWS EKS中运行的微服务
gloo pytorch 因此,您决定在AWS中运行Kubernetes工作负载. 正如我们在设置AWS EKS 之前所看到的,需要很多耐心和头痛. 您可能可以使其正常运行. 对于其他用户,您应该从W ...
- 阿里P8架构师谈:从单体架构、到SOA、再到微服务的架构设计详解
本文涉及的内容以及知识点如下: 1.单体架构 2.单体架构的拆分 3.SOA与微服务的区别 4.微服务的优缺点 5.微服务的消息 6.服务集成 7.数据的去中心化 单体架构 Web应用程序发展的早期, ...
- 微服务 API 网关架构演进 Spring Cloud Gateway ShenYu APISIX
目录 后台服务网关 Spring Cloud Gateway 遇到问题 Apache ShenYu Higress fizz-gateway-community 企业案例 前台流量网关 APISIX ...
最新文章
- R语言绘制环形树状图
- 是程序员,就用python导出pdf
- C【C#公共帮助类】分页逻辑处理类
- 如何在geth中创建genesis.json_如何在Photoshop中应用“通道混合器”创建一个复古韵味色调...
- nor flash 和nand flash 的区别
- 把 SOAP 服务转化为 REST 服务(REST Service 的最佳实践,第 3 部分)
- spring启动过程之源码跟踪(小结bean的生命周期)--spring Debug
- java线程内存模型_深度解析Java多线程的内存模型
- 工作262:HBuilderX常见快捷键
- InputStream 类型
- python同时读取多个文件的同一行
- php -- 目录、路径、磁盘
- 编译原理 NFA确定化与DFA最小化
- 【FinalIK】Full Body Biped IK
- 最好的开源网络入侵检测工具
- 毕业设计-基于深度学习的视频目标检测
- 声纹采集器和声纹数据库在公安领域的应用
- 【C#】记录一次上位机软件界面闪退分析及解决方案
- 云帆加速:广电新媒体营收如何跑赢成本
- WEB前端开发工程师面试题