API网关

最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合Docker来快速搭建环境,基于别人的Dockerfile把整个实验跑通了,觉得还不错。想着好像CoreOS是专门为Docker服务的,还买了一本《CoreOS实践》花小半天时间看完了,CoreOS在集群环境下确实很牛,但是我的环境还是轻量级点,所以还是基于CentOS来做,就这样研究了两天时间,与大家分享一下,欢迎留言拍砖或交流!

问题

一般开发接口的时候各种语言都已经有很成熟的框架了,互联网领域用得最多的应该是RESTfull+JSON的模式,但是小型项目对接口基于没有安全方面、性能等的考虑, 之前写过一篇直接通过JS抓取数据的《玩爽了!直接在Chrome里抓取数据》,就算考虑的话实现起来也缺少简便的办法,时间上也不一定允许。

解决方案

随着微服务的流行,需要有一个类似于API网关的中间件来做API的管理工作,也就是API的实现方面更多的考虑业务逻辑,安全、性能、监控可以交由网关来做(如下图所示,下图根据Kong官方文档修改),这样既提高业务灵活性又不缺安全性。

环境搭建

开头已经说了环境会涉及到VirtualBox、Vagrant、Docker、Nginx、Lua、OpenRety、Orange,好在基本的坑都已经填完了。但你最好也有一些这方面的基础,由于实验步骤冗长难免有些地方没有记录到或者省略。(本文所有步骤基于MacOS环境)

Vagrant CentOS环境搭建

提前安装VirtualBox、Vagrant

vagrant init centos/7
vagrant up
vagrant ssh

编辑Vagrantfile,配置私有IP

config.vm.network "private_network", ip: "192.168.88.77"

安装Docker引擎

sudo yum update
sudo tee /etc/yum.repos.d/docker.repo <<-'EOF'
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
EOF sudo yum install docker-engine
sudo systemctl enable docker.service
sudo systemctl start docker
sudo docker run --rm hello-world

初始化和配置数据库Docker

这里我做了docker volume,还有设置你的mysql root密码,执行命令进入docker

sudo docker run --name platform-db -v /alidata/database:/var/lib/mysql/ -e MYSQL_ROOT_PASSWORD=your_root_password -p 3306:3306 mysql:5.7
sudo docker exec -it platform-db /bin/bash

创建数据库和用户

CREATE DATABASE orange;
CREATE USER 'orange'@'%' IDENTIFIED BY 'orange';
GRANT ALL PRIVILEGES ON orange.* TO 'orange'@'%';

执行数据库初始化脚本 ,初始化Orange数据库

初始化和配置Orange Docker

直接使用我发布的docker镜像 cbcye/orange5

sudo docker run -d --name orange \
--link platform-db:orange-database \
-p 7777:7777 \
-p 8888:8888 \
-p 9999:9999 \
--security-opt seccomp:unconfined \
cbcye/orange5

编辑配置文件

1
2
3
4
sudo docker exec -it platform-db /bin/bash
 
vi /usr/local/orange/orange.conf #修改数据库连接信息
vi /usr/local/orange/conf/nginx.conf  #配置upstream server,真实api server

重启orange

sudo docker stop orange
sudo docker start orange

Orange Gateway控制台

访问http://192.168.88.77:9999/ 用户名:admin 密码:orange_admin

至此环境搭建成功

配置与测试

启用并编辑API重写

将真实API地址/api/appdata 通过/appdata的方式暴露给外部请求

启用与配置限速规则

一分钟只允许2次请求

使用Postman进行测试

当请求超过限制的话则会提示HTTP错误,而真实的API Server不需要做任何操作

总结

如开头所说,API Gateway作为微服务重要的中间件,对原有API Server不需要改动或者改动很小就能实现,通用的功能也很容易整合,基于Nginx的OpenResty开发的Orange性能也能得到保障。因此很有必要使用API Gateway把开放的接口管理起来。欢迎留言拍砖或交流!

附实用技巧

#查看docker日志
sudo docker logs <container_name> #查看所有docker
sudo docker ps --all #删除 docker
sudo docker rm orange #Orange日志位置
/usr/local/orange/logs/

API网关的更多相关文章

  1. 用API网关把API管起来

    最开始只是想找个API网关防止API被恶意请求,找了一圈发现基于Nginx的OpenResty(Lua语言)扩展模块Orange挺好(也找了Kong,但是感觉复杂了点没用),还偷懒用Vagrant结合 ...

  2. Tyk API网关介绍及安装说明

    Tyk API网关介绍及安装说明 Tyk是一个开源的轻量级API网关程序. 什么是API网关 API网关是一个各类不同API的前置服务器.API网关封装了系统内部架构,对外提供统一服务.此外还可以实现 ...

  3. 使用API网关构建微服务

    使用传统的异步回调方法编写API组合代码会让你迅速坠入回调地狱.代码会变得混乱.难以理解且容易出错.一个更好的方法是使用响应式方法以一种声明式样式编写API网关代码.响应式抽象概念的例子有Scala中 ...

  4. baas & API 网关

    最近一段时间一直在做API 网关的工作.清晰看到当前云下Baas将会是主要方向,而API网关会是一把利剑. 本人正在规划API网关,有兴趣的可以一起探讨:hotwheels_bo@163.com

  5. 理解WEB API网关

    *:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...

  6. Net分布式系统之六:微服务之API网关

    本人建立了个人技术.工作经验的分享微信号,计划后续公众号同步更新分享,比在此更多具体.欢迎有兴趣的同学一起加入相互学习.基于上篇微服务架构分享,今天分享其中一个重要的基础组件“API网关”. 一.引言 ...

  7. 基于.NET CORE微服务框架 -Api网关服务管理

    1.前言 经过10多天的努力,surging 网关已经有了大致的雏形,后面还会持续更新完善,请大家持续关注研发的动态 最近也更新了surging新的版本 更新内容: 1. 扩展Zookeeper封装2 ...

  8. 使用 Node.js 搭建一个 API 网关

    原文地址:Building an API Gateway using Node.js 外部客户端访问微服务架构中的服务时,服务端会对认证和传输有一些常见的要求.API 网关提供共享层来处理服务协议之间 ...

  9. 微服务架构下的API网关

    顾名思义,是出现在系统边界上的一个面向API的.串行集中式的强管控服务,这里的边界是企业IT系统的边界,主要起到隔离外部访问与内部系统的作用.在微服务概念的流行之前,API网关的实体就已经诞生了,例如 ...

随机推荐

  1. WGS84坐标系下,经纬度如何换算成米

    参考博客:显示瓦片地图  http://www.cnblogs.com/rhinoxy/p/4995731.html 注意:这里的计算方法精度相差比较大,不满足精确计算的需要. 需要理解的GIS概念: ...

  2. 全新jquery多点滑动幻灯片——全屏动画animateSlide

    首页banner的酷炫效果多来自全屏大图的幻灯片动画,下面提供一种完美兼容的jquery动画特效:全新jquery多点滑动幻灯片——全屏动画animateSlide(代码完全原创). 直接上代码,把h ...

  3. 前台传到servlet的乱码问题要怎么处理

  4. list笔记总结

    1.list是一个复合的复制函数,可以将一个数组一次赋给多个变量.我们常用以下语句遍历一个数组. $arr = array('东','男','西','北'); while(list($k,$v)=ea ...

  5. PHP面向对象之将数据库的查询结果序列化成json格式

    <?php class link_mysql{ private $host,$uid,$pwd,$db,$link,$res; function link_mysql($_host,$_uid, ...

  6. MapView

    有两种方式可以将 MapView 添加到应用当中:一个是 XML 方式,另一个是硬编码方式:一般多采用 XML方式,方便调整布局及其属性相关设置. 1.1XML方式 <com.esri.andr ...

  7. OC7_代理的基本概念

    // // Cat.h // OC7_代理的基本概念 // // Created by zhangxueming on 15/6/24. // Copyright (c) 2015年 zhangxue ...

  8. python基础:搜索路径

    如何将写好的脚本或者是模块加入python的搜索路径? >>>import sys >>> sys.path ['', '/Library/Frameworks/P ...

  9. 解析Path方法备忘

    public static String parseDataPath(String dataPath){ StringBuilder parseBld = new StringBuilder(); L ...

  10. 嵌入式 linux 移植修改后的libjpeg 实现内存中解码

    1.修改libjpeg源码,使之实现内存解码. 修改libjpeg中读取或者输出jpeg文件的函数接口文件jdatadst.c和jdatasrc.c见下面这篇帖子. http://blog.163.c ...