【1】微服務架構-開源API網關Kong的部署與使用

前言:
html

     微服務架構是如今很火熱的技術話題,其本質是將龐大而複雜的系統,拆分紅微小的服務模塊,使服務之間實現解耦,可以實現各模塊的獨立開發、升級、部署。大大下降了系統的運維及開發難度。nginx

     然而因爲服務的拆分,客戶端可能同時須要和多個服務進行交互,隨着微服務規模的增大,這樣的交互模式在性能和管理上都有很大的不便。那麼基於微服務的客戶端如何可以更好的去訪問這些獨立的服務呢,這時咱們就須要一個統一的入口來向外提供服務。這就是咱們所說的API網關,git

    API Gateway是一個在客戶端和服務之間的中間人,客戶端不用直接訪問服務器,而是經過API Gateway來傳遞中間消息。API Gateway可以實現負載均衡、緩存、訪問控制、API 計費監控等等功能。下面爲網上關於API Gateway的圖。github

wKioL1gPT_2Sa2tJAAD5DUC0mDE366.png

    Kong 是由Mashape公司開發的一款API Gateway的軟件,Kong是基於nginx開發,用來接收客戶端的API請求,同時還須要一個數據庫來存儲操做數據。寫這篇文章時Kong的最新版是0.9.3,其支持數據庫爲PostgreSQL 9.4+ 和Cassandra 2.2.x .sql


一:安裝docker

  • centos數據庫

(1):安裝kongapache

$ sudo yum install epel-release
$ sudo yum install kong-0.9.3.*.noarch.rpm --nogpgcheck

or 後端

Download kong-0.9.3.el7.noarch.rpmcentos

$ wget kong-0.9.3.el7.noarch.rpm


(2):配置數據庫

kong支持 PostgreSQL 9.4+ 和Cassandra 2.2.x .

若是使用PostgreSQL數據庫,請建立用戶和對應的數據庫

$ CREATE USER kong; CREATE DATABASE kong OWNER kong;

(3):啓動

$ kong start
# Kong is running
$ curl 127.0.0.1:8001

Kong啓動後,會分別監聽8000端口和8001端口。8000端口是用來提供服務,8001是用來對API進行管理。



  • docker

(1):啓動數據庫

cassandra

$ docker run -d --name kong-database \
              -p 9042:9042 \
              cassandra:2.2

OR PostgreSQL

$ docker run -d --name kong-database \
              -p 5432:5432 \
              -e "POSTGRES_USER=kong" \
              -e "POSTGRES_DB=kong" \
              postgres:9.4

(2):啓動kong

$ docker run -d --name kong \
              --link kong-database:kong-database \
              -e "KONG_DATABASE=cassandra" \
              -e "KONG_CASSANDRA_CONTACT_POINTS=kong-database" \
              -e "KONG_PG_HOST=kong-database" \
              -p 8000:8000 \
              -p 8443:8443 \
              -p 8001:8001 \
              -p 7946:7946 \
              -p 7946:7946/udp \
              kong


附上docker-compose.yml

kong-database:
  p_w_picpath: postgres:9.4
  ports: 
  - 5432:5432/tcp
  environment:
  - POSTGRES_USER=kong 
  - POSTGRES_DB=kong
kong:
  p_w_picpath: kong
  links: 
  -  kong-database:kong-database
  environment:
  - KONG_DATABASE=postgres
  - KONG_CASSANDRA_CONTACT_POINTS=kong-database
  - KONG_PG_HOST=kong-database
  ports:
  - 8000:8000/tcp
  - 8443:8443/tcp
  - 8001:8001/tcp
  - 7946:7946/tcp
  - 7946:7946/udp



二:使用kong

(1):添加api到kong

$ curl -i -X POST \
--url http://localhost:8001/apis/ \
--data 'name=baidu' \
--data 'upstream_url=http://baidu.com/' \
--data 'request_host=baidu.com'
  • --url:8001端口是Kong的管理端口。

  • upstream_url:提供服務的後端url。

  • request_path:使用path參數時,加入該路徑的服務接口。

  • request_host 使用這個參數時,將加入該host的全部服務接口:


(2):查詢已經添加的API

$curl localhost:8001/apis/


(3):訪問API

$curl -i -X POST --url http://localhost:8000/ --header 10.100.55.1


(4):刪除API

根據API_NAME or API_ID來刪除指定api

$curl -i -X DELETE localhost:8001/apis/00f90ca9-cf2d-4830-c842-3b90f6cd08af
$curl -i -X DELETE localhost:8001/apis/test1


(5):添加實例

  • 實例1  (request_path限制path內的接口)

URL:

http://10.100.55.1/hello1/index.html

添加:

$curl -i -X POST --url http://localhost:8001/apis/ \
--data name=test1 \
--data 'upstream_url=http://10.100.55.1' \
--data 'request_path=/hello1/'

訪問接口:

$curl -i -X GET --url http://localhost:8000/hello1/

所謂的request_path,就是固定只能訪問hello1下的內容,若是該host的www目錄下還有hello二、hello三、那麼是不能經過網關去訪問這個目錄下的內容,例以下面是訪問不到的,由於沒有加入到Kong中。

$curl -i -X GET --url http://localhost:8000/hello2/



  • 實例2  (request_host能夠訪問host全部接口)

URL:

http://10.100.55.1

添加:

$ curl -i -X POST --url http://localhost:8001/apis/ \
--data name=test2 \
--data 'upstream_url=http://10.100.55.1' \
--data 'request_host=10.100.55.1'


訪問接口:

使用request_host後,該host全部api都加入到Kong中,下面的都可以經過網關訪問。

$curl -i -X GET --url http://localhost:8000/hello1  --header host:10.100.55.1 
$curl -i -X GET --url http://localhost:8000/hello2 --header host:10.100.55.1


  • 實例3 (request_host  port:8080)

URL:

http://10.100.55.2:8080

添加:

$curl -i -X POST --url http://localhost:8001/apis/ \
--data  name=test3  \
--data 'upstream_url=http://10.100.55.2:8080' \
--data 'request_host=10.100.55.2'

訪問接口:

$curl -i -X GET --url http://localhost:8000/ --header host:10.100.55.2


  • 實例4 (複雜url的添加和訪問)

URL: 

http://10.100.55.3:8000/opj/list?serviceId=box&c=nanjing

添加:

$ curl -i -X POST --url http://localhost:8001/apis/ --data 'name=test4' --data 'upstream_url=http://10.100.55.3:8000/' --data 'request_path=/opj/list'

訪問接口:

$ curl -i -X GET --url http://localhost:8000/opj/list?serviceId=box&c=nanjing




三:建立認證

(1)給API配置pulgin認證

1:添加api

$curl -i -X POST --url http://localhost:8001/apis/ --data 'name=test5' --data 'upstream_url=http://10.100.55.1/' --data 'request_host=10.100.55.1'
$curl -i -X GET --url http://localhost:8000/ --header host:10.100.55.1
訪問正常
Connect  Success...

2:添加plugin認證

$curl -i -X POST --url http://localhost:8001/apis/test5/plugins/ --data 'name=key-auth'
$curl -i -X GET --url http://localhost:8000/ --header host:10.100.55.1
訪問失敗
HTTP/1.1 401 Unauthorized
WWW-Authenticate: Key realm="kong"
Server: kong/0.9.3
{"message":"No API key found in headers or querystring"}


(2)添加用戶

1:建立用戶

$curl -i -X POST --url http://localhost:8001/consumers/ --data "username=heqin"
{"username":"heqin","created_at":1477382339000,"id":"8e6273c9-f332-4d68-b74c-73ae9f82f150"}

2:給用戶建立key

$curl -i -X POST --url http://localhost:8001/consumers/heqin/key-auth/ --data 'key=helloworld'
{"created_at":1477382483000,"consumer_id":"8e6273c9-f332-4d68-b74c-73ae9f82f150","key":"helloworld","id":"62c0d640-b1bd-4f3b-aa6e-ba3adaf8ec38"}

3:帶着key去訪問

$curl -i -X GET --url http://localhost:8000/  --header host:10.100.55.1 --header apikey:helloworld
訪問成功
Connect  Success...

經過上面的兩步,就能夠實現對API接口的權限控制。


未完待續。。。。。。。

相關文章
相關標籤/搜索