概念介绍

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

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

主要功能

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 开始):

依据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: 

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

  1. C++轻量级微服务_微服务技术栈:API网关中心,落地实现方案

    一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用: 简单说一下外观模式,网关和这个模式很像,但是比外观模式 ...

  2. code block怎样实现图形界面_纯CSS实现图片百叶窗展示效果

    主要思路:其实这个百叶窗还是利用了一种障眼法,我们看上去是鼠标移动上去之后,图片展开了,其实这些图片在原地根本没有动,只不过是我们把这些图片放在了一个列表里,相互叠加,鼠标移动的同时改变列表的宽度. ...

  3. 微服务架构之「 API网关 」

    点击上方"方志朋",选择"置顶公众号" 技术文章第一时间送达! 在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注 ...

  4. yii2 请求外部api_微服务架构之「 API网关 」

    作者:奎哥来自公众号:不止思考 在微服务架构的系列文章中,前面已经通过文章<架构设计之「服务注册 」>介绍过了服务注册的原理和应用,今天这篇文章我们来聊一聊「 API网关 」. 「 API ...

  5. 微服务:简述微服务架构中的API网关

    微服务:简述微服务架构中的API网关 API网关是任何微服务架构的重要组成部分.有了它我们可以在一个独立的模块上方便的处理一些非业务逻辑,可以让微服务本身专注在自身特定的功能上,使得每个微服务的开发更 ...

  6. 微服务技术栈:API网关中心,落地实现方案

    本文源码:GitHub·点这里 || GitEE·点这里 一.服务网关简介 1.外观模式 客户端与各个业务子系统的通信必须通过一个统一的外观对象进行,外观模式提供一个高层次的接口,使得子系统更易于使用 ...

  7. 微服务配置中心是干啥的_微服务入门到精通-分布式配置中心(续)

    本文接之前的<Spring Cloud构建微服务架构(四)分布式配置中心>,继续来说说Spring Cloud Config的使用. 先来回顾一下,在前文中我们完成了什么: 构建了conf ...

  8. 基于.NET CORE微服务框架 -谈谈surging API网关

    1.前言 对于最近surging更新的API 网关大家也有所关注,也收到了不少反馈提出是否能介绍下Api网关,那么我们将在此篇文章中谈谈surging Api 网关 开源地址:https://gith ...

  9. 谈谈微服务设计中的API网关模式

    来源:架构头条(ID: ArchFront) 原文:http://dwz.date/crrw 根据 Gartner 对微服务的定义:"微服务是范围狭窄.封装紧密.松散耦合.可独立部署且可独立 ...

最新文章

  1. 最新版IDEA常用配置指南,打造你的最酷IDE
  2. 使用WDS安装Windows8.1
  3. 解决git clone慢问题
  4. Mariadb dockerfile测试
  5. 【MongoDB】docker mongo 数据备份
  6. seata+nacos出现can not register RM,err:can not connect to services-server
  7. leetcode 207. Course Schedule | 207. 课程表(Java)
  8. linux 硬盘空间监控,Linux服务器硬盘空间监控
  9. php laravel设置创建目录的权限,在Laravel5中正确设置文件权限的方法
  10. 13个绚丽的Jquery 界面设计
  11. 【搬运】 Cadence orcad常用库olb介绍
  12. 《马云点评创业》读书笔记
  13. android wifi已停用,为什么手机连接wifi时总显示已停用
  14. 【转自心声】华为眼中管理者的18种惰怠行为
  15. R语言报错:Error in data[[rowvar]] : attempt to select less than one element in get1index
  16. 蓝桥杯web:3.【功能实现】封装函数实现个人所得税计算器
  17. WDC2106 iOS10新特性及开发者要注意什么
  18. Android 系统开机logo的修改
  19. 什么是Nodejs?
  20. 【转】知识图谱上推荐推理的模仿学习框架

热门文章

  1. vim 高亮显示php代码
  2. 利用Visio 2007图形化项目进度和项目跟踪
  3. [ASP.NET 控件实作 Day12] 继承 TBActiveX 重新改写 TBMediaPlayer 控件
  4. tcl学习---windows下安装及运行环境
  5. python中isinstance(3、object)_python中isinstance函数判断各种类型的小细节
  6. 乐学python_铁乐学python_day01-作业
  7. eclipse svn不能忽略文件及文件夹,ignore设置无效 ?
  8. virtualbox 命令
  9. [转载] 【Java】将一个字符串的字符排序,按ASCII表的顺序从小到大
  10. 为什么ConcurrentHashMap不允许插入null值?