OpenResty從入門到開發一個網關服務(使用etcd做爲註冊中心)

原文鏈接:https://blog.fengjx.com/openr...html

簡介

OpenResty(也稱爲 ngx_openresty)是一個全功能的 Web 應用服務器。它打包了標準的 Nginx 核心,不少的經常使用的第三方模塊,以及它們的大多數依賴項。nginx

經過揉和衆多設計良好的 Nginx 模塊,OpenResty 有效地把 Nginx 服務器轉變爲一個強大的 Web 應用服務器,基於它開發人員可使用 Lua 編程語言對 Nginx 核心以及現有的各類 Nginx C 模塊進行腳本編程,構建出能夠處理一萬以上併發請求的極端高性能的 Web 應用。git

ngx_openresty 目前有兩大應用目標:github

  1. 通用目的的 web 應用服務器。在這個目標下,現有的 web 應用技術均可以算是和 OpenResty 或多或少有些相似,好比 Nodejs, PHP 等等。ngx_openresty 的性能(包括內存使用和 CPU 效率)算是最大的賣點之一。
  2. Nginx 的腳本擴展編程,用於構建靈活的 Web 應用網關和 Web 應用防火牆。有些相似的是 NetScaler。其優點在於 Lua 編程帶來的巨大靈活性。

引用自:OpenResty最佳實踐web

入門教程

目前已經有大佬寫了很完整的教程,沒有必要重複造輪子了,我以爲這兩個是最好的。更多openresty相關資料能夠看這裏https://blog.fengjx.com/aweso...編程

網關服務開發

總體架構

總體架構

服務啓動時,將本身的節點信息註冊到etcd,包括:服務名稱、ip、端口後端

網關服務從etcd監聽服務節點信息變動,並保存到緩存中,從客戶端請求的url中提取服務名稱,經過服務名稱查找節點信息,將請求轉發到後端服務api

關於etcd的使用,這裏再也不闡述

url規範緩存

  1. 對外api前綴:/open/api/service_name/**,後端服務路由:/open/api/**
  2. 對內api前綴:/inner/api/service_name/**,後端服務路由:/**

例如/open/api/user/fav會轉發到user服務的/open/api/fav接口;/inner/api/user/info會轉發到user服務的/info接口。經過url規範咱們就能很輕易的作api鑑權,而不須要將對外api和對內api部署成2個服務(固然也要考慮實際狀況,是否符合實際項目要求)。bash

源碼解析

github: https://github.com/tech-micro... (tag v0.1)

  • init_by_lua_file "lua/init.lua"

    初始化項目配置

  • init_worker_by_lua_file "lua/init_worker.lua"

    初始化服務發現組件,監聽服務節點變動信息

  • rewrite_by_lua_file 'lua/rewrite.lua'

    1. 生成requestId,方便鏈路跟蹤和問題排查
    2. 解析請求服務名稱
    3. 重寫後端請求url,去掉服務名
  • access_by_lua_file 'lua/gateway.lua'

    經過服務發現組件查詢服務節點信息

  • balancer_by_lua_file 'lua/server_rr.lua'

    經過查詢到的節點信息,輪訓其中一個節點,將請求轉發到後端服務

  • user.conf

    模擬用戶服務

  • auth.conf

    模擬登錄服務

運行測試

安裝openresty: http://openresty.org/cn/insta...

啓動服務

git clone git@github.com:tech-microworld/ws-cloud-gateway.git
cd ws-cloud-gateway
# 切換到 tag v0.1
git checkout -b v0.1 v0.1
# -g 'daemon off;是在前臺運行,若是想後臺運行能夠去掉
openresty -p `pwd` -c conf/nginx.conf -g 'daemon off;'

向etcd註冊節點信息,固然實際狀況是在服務啓動的時候自動註冊的,這裏爲了測試,手動模擬的服務註冊過程

# 註冊user服務
etcdctl put /micros/service/user/127.0.0.1:1024 1
etcdctl put /micros/service/user/127.0.0.1:1025 1

# 註冊auth服務
etcdctl put /micros/service/auth/127.0.0.1:1026 1
etcdctl put /micros/service/auth/127.0.0.1:1027 1

發送http請求

# 測試auth服務
curl http://localhost:10000/open/api/auth/login
curl http://localhost:10000/inner/api/auth/has-login

# 測試user服務
curl http://localhost:10000/inner/api/user/fav
curl http://localhost:10000/inner/api/user/info

todo

  • [x] 服務發現,動態路由
  • [x] 自動生成requestId,方便鏈路跟蹤
  • [ ] 動態ip防火牆
  • [ ] 限流器
  • [ ] 用戶登陸認證
  • [ ] 接口協議加解密
相關文章
相關標籤/搜索