现在越来越多的技术团队开始尝试采纳微服务架构进行产品开发。而基于微服务架构后后端服务通常而言是动态的,为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度,这边文章我们就来聊聊API Gateway的那些事。
"#"为什么需要API Gateway
"#"简化客户端调用复杂度
在微服务架构模式下后端服务的实例数一般是动态的,对于客户端而言如何发现这些动态改变的服务实例的访问地址信息?因此在基于微服务的项目中为了简化前端的调用逻辑,通常会引入API Gateway作为轻量级网关,同时API Gateway中也会实现相关的认证逻辑从而简化内部服务之间相互调用的复杂度。
"#"数据裁剪以及聚合
通常而言多余不同的客户端对于显示时对于数据的需求是不一致的,比如手机端或者Web端又或者在低延迟的网络环境或者高延迟的网络环境。
因此为了优化客户端的使用体验,API Gateway可以对通用性的响应数据进行裁剪以适应不同客户端的使用需求。同时还可以将多个API调用逻辑进行聚合,从而减少客户端的请求数,优化客户端用户体验
"#"多渠道支持
当然我们还可以针对不同的渠道和客户端提供不同的API Gateway,对于该模式的使用由另外一个大家熟知的方式叫Backend for front-end, 在Backend for front-end模式当中,我们可以针对不同的客户端分别创建其BFF
"#"遗留系统的微服务化改造
对于系统系统而言进行微服务改造通常是由于原有的系统存在或多或少的问题,比如技术债务,代码质量,可维护性,可扩展性等等。API Gateway的模式同样适用于这一类遗留系统的改造,通过微服务化的改造逐步实现对原有系统中的问题的修复,从而提升对于原有业务响应力的提升。通过引入抽象层,逐步使用新的实现替换旧的实现。
"#"使用Zuul实现API网关
Spring Cloud的Zuul组件提供了轻量级网关的功能支持,通过定义路由规则可以快速实现一个轻量级的API网关
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
zuul:
ignoredPatterns: auth
sensitive-headers: "*"
ignoreLocalService: true
retryable: false
host:
max-total-connections: 500
routes:
service01:
pateh: **
serviceId: service01
stripPrefix: true
thirdpart:
pateh: **
url: http://thirdpart.api.com
|
同时除了通过serviceId关联已经注册到Consul的服务实例以外,我们也可以通过zuul直接定义实现对已有服务的直接集成。
这里我们就不过多介绍Zuul的细节,在实际使用中我们会发现直接使用Zuul会存在诸多问题,包括:
- 性能问题:当存在大量请求超时后会造成Zuul阻塞,目前只能通过横向扩展Zuul实例实现对高并发的支持;
- WebSocket的支持问题: Zuul中并不直接提供对WebSocket的支持,需要添加额外的过滤器实现对WebSocket的支持;
为了解决以上问题,可以通过在Zuul前端部署Nginx实现对Zuul实例的反向代理,同时适当的通过添加Cache以及请求压缩减少对后端Zuul实例的压力。
"#"实现Nginx的动态代理
通过Nginx我们可以实现对多实例Zuul的请求代理,同时通过添加适当的缓存以及请求压缩配置可以提升前端UI的请求响应时间。这里需要解决的问题是Nginx如何动态发现Zuul实例信息并且将请求转发到Zuul当中。
consul-template可以帮助我们解决以上问题,consul-template是一个命令行工具,结合consul实现配置文件的动态生成并且支持在配置文件发生变化后触发用户自定义命令。
我们使用了如下的Dockerfile用于构建我们的Nginx服务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
FROM nginx:1.11.10
ADD consul-template /usr/local/bin
RUN mkdir /etc/consul-templates
# 模板文件
ADD nginx.tpl /etc/consul-templates/nginx.tpl
ENV CT_FILE /etc/consul-templates/nginx.tpl
ENV NX_FILE /etc/nginx/conf.d/default.conf # 目标文件
ENV SERVICE identity # 注册在Consul的服务名
COPY dist /usr/share/nginx/html
RUN mkdir -p /data/cache
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf \
& CONSUL_TEMPLATE_LOG=debug \
consul-template -consul-addr=$CONSUL -template "$CT_FILE:$NX_FILE:/usr/sbin/nginx -s reload";
|
Nginx配置模板文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
upstream api_server {
least_conn;
{{range service "identity"}}
server {{.Address}}:{{.Port}};
{{else}}server 127.0.0.1:9191;{{end}}
}
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /api {
proxy_pass http://api_server;
}
}
|
其中
1
2
3
4
5
6
|
upstream api_server {
least_conn;
{{range service "identity"}}
server {{.Address}}:{{.Port}};
{{else}}server 127.0.0.1:9191;{{end}}
}
|
会根据当前consul中注册的所有identity服务实例进行模板渲染,并且当配置文件内容发生变化后调用nginx -s reload重新加载Nginx配置从而实现对于后端服务实例的动态代理。
1
2
3
|
CMD /usr/sbin/nginx -c /etc/nginx/nginx.conf \
& CONSUL_TEMPLATE_LOG=debug \
consul-template -consul-addr=$CONSUL -template "$CT_FILE:$NX_FILE:/usr/sbin/nginx -s reload";
|
"#"其它的一些优化建议
启用Nginx的Gzip可以对服务器端响应内容进行压缩从而减少一定的客户端响应时间
1
2
3
4
5
|
gzip on;
gzip_min_length 1k;
gzip_buffers 4 32k;
gzip_types text/plain application/x-javascript application/javascript text/xml text/css;
gzip_vary on;
|
缓存图片以及其它静态资源可以减少对Zuul实例的请求量
1
2
3
4
5
6
7
8
9
10
11
12
13
|
proxy_buffering on;
proxy_cache_valid any 10m;
proxy_cache_path /data/cache levels=1:2 keys_zone=my-cache:8m max_size=1000m inactive=600m;
proxy_temp_path /data/temp;
proxy_buffer_size 4k;
proxy_buffers 100 8k;
location ~* (images) {
proxy_pass http://api_server;
# cache setting
proxy_cache my-cache;
proxy_cache_valid 200;
}
|
如果需要通过Nginx实现对Websocket的代理可以添加一下配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
location /sockjs {
proxy_pass http://api_server;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# WebSocket support (nginx 1.4)
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_connect_timeout 90;
proxy_send_timeout 90;
proxy_read_timeout 90;
# !!!Support Spring Boot
proxy_pass_header X-XSRF-TOKEN;
proxy_set_header Origin "http://localhost:4000";
}
|
http://yunlzheng.github.io/2017/03/14/the-things-about-api-gateway/
相关推荐
APIOAK分布式API网关 v0.6.2.zip
了解AWS Lambda和API网关以从概念上了解Jets至关重要。 Jets会将您的代码映射到Lambda函数和API网关资源。 AWS Lambda是功能即服务。 它使您可以上载和运行功能,而不必担心基础架构。 API网关是Lambda的路由层。 ...
服务管理模块(包含注册中心,服务网关,服务监控,调用链追踪等) , jbone系统 系统管理模块,通用权限管理等 , jbone系统管理员 系统管理后台 , jbone-fs 文件系统,用于存储和管理文件,图片等 , jbone-...
玩弄Python,Pandas,Lambdas,s3和Dynamodb 学习资料 python: : 熊猫: : boto3概述: : JiASzk_bH5M ...带有lambda的api网关 设置api网关的陷阱: : 在python 进行测试 使用moto 测试lambda 档案
magento-扩展支付网关 Instapago Banesco 的 Magento 扩展。 特征购买和预授权支持多店铺支持多个 Instapago API 密钥
在线资料Sa-Token 介绍Sa-Token是一个轻量级Java权限认证框架,主要解决:登录认证、权限认证、Session会话、单点登录、OAuth2.0、微服务网关鉴权 等一系列权限相关问题框架集成简单、开箱即用、API设计清爽,通过Sa...
你必须有一个 RChain 节点在本地或远程运行,并公开常规 API,并且还要运行一个 redis 服务器。 生成证书.crt和私钥.key (见下文)。 您必须复制任何.env.*.example文件中的值,并将其重命名为.env以便读取环境...
API实体假请求Ribbon para balancea carnamento de carga Servidor Eureka para registro dosmicrosserviços API网关自动生成Hystrix paratolerânciaa falhas OAuth和JWT自动保留Git中央服务器配置文件Geraçã...
秘密会议 语境智能室 创意间距 CCR 的愿景是在电子设备和人类活动之间创建... 也可以根据房间的需要手动调整数据,例如通过使用 Telkom API 的 SMS 网关输入设备代码、房间、密码和用户名并结合个人信息来手动关闭儿童
从配置文件中获取的API,从配置文件中获取的API以及基于对象的API。 Este proyecto Djangoestarádividido en应用程序(subsistemas y proyecto base),donde cualquier应用程序podráser reemplazada ...
注意:取消注释php.ini中的extension = php_soap.dll和extension = php_openssl.dll ,因为PHP API的SoapClient类用于与网关的连接。 要从旧版本安装,必须先卸载旧版本,然后再安装新版本。 回去开始 环境 ...
服务器网关 结构模型 积木 专案 用户数 会话存储 API处理程序 部署,构建和续订证书脚本 技术决策摘要 我们使用React.js来制作我们的应用程序,因为它允许交互和重新渲染许多单独的部分。 React.js允许我们将应用...
通过私人短信网关发送短信的演示应用程序。 在硬模式下工作了3天,以完成这个未完成和未打磨的android应用。 简而言之,它将POST发送到私有api。 因此,以防万一您耗尽了SMS资源,请使用此应用发送更多信息。 ...
通过SOAP / RPC网关对Magento的集成。 node-magentojs流星实现[ ] 如何安装 mrt add aaronthorp:magentojs 如何使用 var magento = MagentoJS({ host: 'www.magentosite.com', port: 80, path: '/index....
基于阿里巴巴 spring-cloud-alibaba 的微服务架构技术栈:注册与配置中心 - nacos服务限流与降级 - sentinel网关服务 - spring-cloud-gateway缓存 - jetCache目录:├─hutu-auth 鉴权中心│ ├─hutu-common 公共...
瓜达卢佩的枪! 这是Pete的Pet教程的入门项目。任务简单搜索和分页在导航栏中添加搜索栏以搜索宠物。 分页结果。验证方式添加验证以防止不...全文搜索在多个条件下进行模糊和全文搜索响应JSON 使您的项目成为完整的API
皮特的宠物商店! 这是Pete的Pet教程的入门项目。 任务 简单搜索和分页 在导航栏中添加搜索栏以搜索宠物。 分页结果。 验证方式 添加验证以防止不卫生的数据进入您的数据库。... 使您的项目成为完整的API
8、修正“编码_Utf8到Unicode”频繁操作导致内存泄漏的BUG,感谢易友【◆野蛮vE儿】反馈。 9、修正“目录_是否存在”,当存在无反缀文件时返回真的BUG,感谢易友【@飞灵】反馈。 10、新增“系统_信息框Ex”定时信息...