zoukankan      html  css  js  c++  java
  • API网关

    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/
    复制代码

     

  • 相关阅读:
    2.WindowsServer2012R2装完的一些友好化设置
    架构畅想:如果以你所会去进行架构,会到哪一步?
    如何导出已有的谷歌插件,又如何把导出的插件安装到360浏览器中,又如何对插件小修小改?
    SQL:指定名称查不到数据的衍伸~空格 换行符 回车符的批量处理
    SVN:服务器资源删掉,本地添加时和删掉的名字同名出现One or more files are in a conflicted state.
    我为NET狂-----大前端专帖
    逆天通用水印扩展篇~新增剪贴板系列的功能和手动配置,卸除原基础不常用的功能
    万恶的剪贴板==》为存储而生
    转帖:DotNet 资源大全中文版
    在不动用sp_configure的情况下,如何 =》去掉列的自增长,并保留原数据
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/6058155.html
Copyright © 2011-2022 走看看