微服务,ApiGateway 与 Kong

一. 微服务html

二. Api Gateway前端

三. Kong 的使用nginx


一. 微服务数据库

        对于一些传统的 大型项目,传统的方式会有一些缺陷,好比说 新人熟悉系统成本高(由于整个系统做为一个总体,彼此会有必定的牵连),项目重apache

启时间长,重构困难(对于一个新技术的引入,可能须要对整个项目推到重来),不易于更换新的技术,而且整个项目会慢慢变成巨无霸。后端

        因此说就会有微服务这种概念,一个服务实现一个不一样的特性或者功能。每个独立的微服务都是一个小型应用。一些微服务可能会暴露一些api 给api

其余的一些微服务或者是客户。以下图1(把各个业务拆分):安全

图1

        对于微服务,目前 像Netflix ,亚马逊,ebay 等都有应用。网络

        固然,微服务也有必定的缺陷,好比说 每一个服务(每一个应用) 若是都有一个 数据库的话,那么如何维持 数据库事务。再好比说,服务之间的调用可负载均衡

能会因为 网络的缘由变得不可达,那么 代码中要额外增长 请求失败的代码。


二. Api Gateway

        api gateway 即 api 网关。全部的请求首先会通过这个网关。这有点相似于前端控制器模式,也有点相似于 Facade模式。以下图2所示:


图2

        因为全部的请求会先通过这个 api 网关,因此 能够在 这里作 权限控制,安全,负载均衡,请求分发,监控等等

        那么,为何要用 这个 api gateway 这个东西,主要缘由在于 一个客户能够直接请求每个服务。每个服务都有一个 url。这些url 会和 负载均

衡设备相映射。为了获得产品信息,客户须要发不少的 request 请求。这样就不是很好。另一个问题就是 可能协议不一样,不必定是 http,好比说可能

因为防火墙或者什么的限制,可能须要用到其余的协议。再另外,之后重构的时候可能要拆分接口,或者合并接口,因为客户端和 API 直接打交道,因此

比较难。

        因此说,如上 图1 加入了 api gateway 就能够变为 以下图3所示:

图3

        固然,任何技术都有缺陷, api gateway 也是同样,好比说 容易成为性能瓶颈。


三. Kong 的使用

        Kong 是一个现成 的 api gateway 的解决方案,它在 nginx 上进行了开发。

        api gateway 的实现方式有不少种,好比说 JVM 上能够用基于NIO 的框架好比Netty,Vertx,Spring Reactor,JOSS Undertow。如今一个比较流程的没有基于 JVM 的就是 NodeJs。其余的还有 Nginx Plus。

        如下介绍 Kong 的使用。

  • 3.1 安装 Kong

  • 3.2 加入 API

3.1 安装 Kong

    参考:https://getkong.org/install/ ,里面写得比较详细了,可是要预先安装一个 Cassandra 数据库(介绍:http://cassandra.apache.org/。安装以后,Kong 项目会监控两个端口,一个是 8000,一个是 8001。 8000端口是能够给用户访问,就是说用户发送请求先到 Kong 项目的 8000 端口,然

后Kong 项目帮你转到你的后端应用api。 8001 端口是管理端口,好比说,管理员能够经过 8001端口来获得你加入过的 api。


3.2 加入 API

        参考文档:https://getkong.org/docs/0.5.x/admin-api/ , 里面介绍了 api 的管理,包括 增删查改。下面介绍我第一次 使用时 还有有些不清楚的点:

3.2.1  列出 所加过的 api

curl localhost:8001/apis/


3.2.2 加入 api

单个加入:

curl -i -X POST --url http://localhost:8001/apis/ --data 'upstream_url=http://camp.uats.cc' --data 'request_path=login'

上面这段命令表示:

  • --url:http://localhost:8001/apis/ 固定的,加入 api 就得写这个,表示给 kong管理。

  • upstream_url:表示咱们的网站。至关于一个请求前缀。

  • request_path:就是具体咱们的 api。

   利用request_host 部署所有的 api:

curl -i -X POST --url http://localhost:8001/apis/ --data 'upstream_url=http://183.131.76.124:4100/' --data         'request_host=183.131.76.122'

3.2.3 删除 api

curl -i -X DELETE localhost:8001/apis/00f90ca9-cf2d-4830-c842-3b90f6cd08af
后面 这个串表示 加入的api的 id。

四. 参考:

1. API Gateway 模式: http://microservices.io/patterns/apigateway.html

2. Nginx: https://www.nginx.com/blog/introduction-to-microservices/

3. Kong 项目官网:https://getkong.org/