code block怎样实现图形界面_微服务入门:Openresty实现API网关

8875e10243cce3e52ab7e993fa858184.png

概念介绍

如果大家清楚“网关”这个概念,那就很容易理解“API网关“,即所有API的入口。 从面向对象设计的角度看,它与外观模式类似,封装了系统内部架构。在单体应用架构中,没有「 API网关 」的概念,每个项目都会用到filter/过滤器之类的东西,filter的作用就是把项目中的一些非业务逻辑的功能抽离出来独立处理,避免与业务逻辑混在一起增加代码复杂度。比如 鉴权认证功能、Session处理、安全检查、日志处理等等。

如果采用微服务架构,那一个项目中微服务节点很多,如果让每一个节点都去处理上面这些 “鉴权认证功能、Session处理、安全检查、日志处理等” 会多出很多冗余的代码,也会给增加业务代码的复杂度,因此就需要有一个API网关把这些公共的功能独立出来成为一个服务来统一的处理这些事情。

c2a17f142b67a58edf49b02f6c39d6eb.png

主要功能

API网关就像是微服务的一扇门,是连通外部客户端与内部微服务之间的一个桥梁。

其主要功能有:

  • 路由转发 API网关是内部微服务的对外唯一入口,所以外面全部的请求都会先发到API网上,然后由API网关来根据不同的请求去路由到不同的微服务节点上。
  • 负载均衡 API网关收到外部请求之后,可以根据内部微服务每个实例的负荷情况进行动态的负载均衡调节。一旦内部的某个微服务实例负载很高,甚至是不能及时响应,则API网关就通过负载均衡策略减少或停止向这个实例转发请求。当所有的内部微服务实例都处理不过来的时候,API网关还可以采用限流或熔断的形式阻止外部请求,以保障整个系统的可用性。
  • 安全认证 API网关就像是微服务的大门守卫,每一个请求进来之后,都必须先在API网关上进行安全验证或身份验证,验证通过后才转发给后面的服务。
  • 日志记录 所有的请求都需要走API网关,那么就可以在API网关上统一集中的记录下这些行为日志。
  • 数据转换 因为API网关对外是面向多种不同的客户端,不同的客户端所传输的数据类型可能是不一样的。因此API网关还需要具备数据转换的功能,将不同客户端传输进来的数据转换成同一种类型再转发给内部微服务上,这样,兼容了这些请求的多样性,保证了微服务的灵活性。

OpenResty

API网关最主要的功能实现就是请求拦截,在网络请求的整个生命阶段加入各种filter/过滤器, OpenResty提供了这样的功能。

OpenResty® 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关

OpenResty 处理一个请求,它的处理流程请参考下图(从 Request start 开始):

ab5fc3609eb04fd93342c6a63f652cb4.png

依据OpenResty的请求处理流程,和各种第三方模块,就可以在流程节点中加入我们的API网关逻辑代码。例如,对API请求数量进行统计:

lua_package_path "module/lua-resty-hmac/lib/?.lua;module/lua-resty-redis/lib/?.lua;module/lua-resty-mysql/lib/?.lua;module/lua-resty-jwt/lib/?.lua;;";server { listen 80; server_name gw.gitlib.cn; access_log /var/log/nginx/gw.gitlib.cn.access.log access; # lua_code_cache off; set $redis_host "192.168.1.106"; set $redis_port "6379"; set $redis_incrkey "api:access:num"; access_by_lua_file gateway/intercept.lua; # 对所有请求进行拦截处理 location = /num {  content_by_lua_block { local _redis = require "resty.redis" local redis = _redis:new() redis:set_timeout(1000)  local ok, err = redis:connect(ngx.var.redis_host, ngx.var.redis_port) if not ok then ngx.say("failed to connect: 

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

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

相关文章

linux mei swap,Linux swapoff命令

Linux swapoff命令Linux swapoff命令用于关闭系统交换区(swap area)。swapoff实际上为swapon的符号连接,可用来关闭系统的交换区。语法swapoff [设备]参数:-a 将/etc/fstab文件中所有设置为swap的设备关闭-h 帮助信息-V 版本信息实例显示分区信息:# sfdi…

vue lang_推荐一个基于Vue 的 H5 快速开发模板

关注 Vue社区,回复“加群”加入我们一起学习,天天进步praisejuejin.im/post/5e612534e51d4527017971a2模板基于 vue-cli4 和 Vant-ui 搭建,进行大型 H5 项目开发最佳实践方案,让我们来一探究竟模板地址 (github.com/push-over/vue…

c语言判断字符是汉字,c语言里面判断字符是否为汉字

这是跟汉字的存储方式有关,西文字符用ASCII码的话,一个字节可以表示一个字符,而汉字用的是双字节表示一个汉字。那么,为了在机器内部区分ASCII码和汉字机内码,就规定汉字的两个字节的最高为都为1.例如:汉字…

springboot urlresource_Spring Boot上传文件+部署到Tomcat

1 概述Spring Boot上传文件,根据官方uploadfile示例修改的,可以打成war放到服务器上(笔者使用的是Tomcat).主要步骤是创建异常类,属性类,接口类与控制器类,最后进行少量修改打包部署到服务器上.2 环境win10Tomcat 9.0.30IDEA 2019.03Spring boot 2.2.2 RELEASE3 新建工程选择sp…

alc236黑苹果驱动_台式机黑苹果独显驱动

黑苹果安装离不开黑苹果驱动程序,常见的有网卡驱动、显卡驱动、声卡驱动、还有其他的一些常用的驱动程序,这里我们单独讲一下黑苹果上驱动英伟达GTX的独显驱动,即我们平常说的N卡,如果文章中介绍的有错误,或者您还有其…

c语言课设报告时钟vc环境,C语言课程设计报告模拟时钟转动程序.doc

C语言课程设计报告模拟时钟转动程序PAGE课程设计报告题 目课 程 名 称 结构化程序设计课程设计院 部 名 称专 业班 级学 生 姓 名 王蕾学 号课程设计地点课程设计学时指 导 教 师金陵科技学院教务处制目 录TOC \o "1-3" \h \z \u HYPERLINK \l "_Toc282443576&q…

c语言break在if中用法,break可用于什么语句 break语句可用于for语句和if语句中 对吗...

c语言中break语句的作用C语言中,break都可以用在什么地方?用到每一个语...break 一般是针对一个循环或者switch中的case,表示跳出当前的循环或选择,即在一个单层循环中,可以通过break 来跳出循环,在switch 中的case通过…

python简单实用案例_Python 21 Django 实用小案例1

8 9 10 {% csrf_token %}11 用户名:12 密码:13 验证码:14 15 16 17

c语言的一段程序,C语言第一个程序(入门)

1.文件类型(基本)c语言源文件 为.c 文件扩展名,例如 main.c 编译后将得到 a.out 文件 运行会得到 我们程序执行的结果2.hello world (第一个程序)#include --------------------> 引入标准库的信息main () { …

matlab table中的文字转string_MATLAB_GUI_教程(2)pushbutton

目录前言上期教程按钮介绍按钮(pushbutton)如何在窗口中创建一个按钮常用属性常用属性练习回调函数的编写规则设置回调函数:定义(编写)回调函数:NoteGUI中各个回调函数之间数据的传递setappdatagetappdata方法按钮的回调函数前言上期教程按钮介绍这个按钮…

c语言数码管的动态显示时间,8位数码管动态显示时间,可调节,调节的数闪烁显示...

原标题:8位数码管动态显示时间,可调节,调节的数闪烁显示// 时间,可调节,//调节时间时,调节的数闪烁显示;//比较两种闪烁的方法;#include#define uint unsigned int#define uchar uns…

python中类和对象_Python里的类和对象简介

---恢复内容开始--- Python里的类 对象属性方法; 对象的属性主要是指主要的特征和参量,而方法主要是指函数; 类是一个具有一定特征和方法的集合,而对象是类的一个;类和对象的关系就如同模具和用这个模具制作出的物品之…

r语言 fread函数参数_R语言 第4章 初级绘图(6)

分析数据间的关系散点矩阵图如果数据框是多维数据,那么plot函数将绘制出两两之间散点图组合成为散点矩阵图(matrix of scatterplots)。散点矩阵图将多个散点图组合起来,以便可以同时浏览多个二元变量关系,一定程度上克服了在平面上展示高维数…

android 渠道打包工具,Android渠道打包技术小结

导读本文对比了渠道4种渠道打包方式:与iOS的单一渠道(AppStore)不同,Android平台在国内的渠道多入牛毛。以我们的App为例,就有27个普通渠道(应用宝,百度,360这种)和更多的推广专用渠道。我们打包技术也经过了若干次的改进。1.利用…

机械臂中的四元素转为旋转矩阵_雅克比矩阵(上)雅克比推导

1、前言 回顾前面几期的内容,在第一期中介绍了机器人的正/逆运动学建模,正运动学解决的问题是如何从关节空间的关节变量描述操作空间的位姿,反之则是逆运动学的内容。将操作空间和关节的空间的关系用以下关系式进行表达。机器人正/逆运动…

DS1819 对应版本的FFMPEG_OpenCV开发笔记(七十):红胖子带你傻瓜式编译VS2017x64版本的openCV4...

若该文为原创文章,转载请注明出处本文章博客地址:https://blog.csdn.net/qq21497936/article/details/107837715各位读者,知识无穷而人力有穷,要么改需求,要么找专业人士,要么自己研究红胖子(红模仿)的博文…

用Android打出马奔跑的动画,一款非常好用的动画库Lottie

简介Lottie是Android和iOS的移动图书馆,用于解析Adobe After Effects动画,并以Bodymovin作为json导出,并在手机和网络上本机呈现。该项目在GitHub已经获得三个端累计3万的star。在Lottie社区提供了更多的动画下载。如果你是一个设计师还可以将…

全站仪和手机连接软件_全站仪各方面应用的原理、操作及计算,看这篇就对了!...

来源:豆丁施工版权归原作者所有全站仪是什么?全站仪,即全站型电子速测仪。它是随着计算机和电子测距技术的发展,近代电子科技与光学经纬仪结合的新一代既能测角又能测距的仪器,它是在电子经纬仪的基础上增加了电子测距…

python字典取值_python 字典中取值的两种方法小结

如下所示: a{name:tony,sex:male} 获得name的值的方式有两种 print a[name],type(a[name]) print a.get(name),type(a.get(name)) 发现这两个结果完全一致,并没有任何的差异。 怎么选择这两个不同的字典取值方式呢? 如果字典已知,…

android录屏软件冲突,关于Android同时录制多个录像的问题

最近碰到一个一点头绪都没有的BUG,在MTK6737M方案上,同时进行广角摄像头和OTG摄像头录像导致的应用crash,而且出现概率也非常没有规律,日志只有非常少的一点NativeCrash日志:*** *** *** *** *** *** *** *** *** *** *** *** ***…