Go - Micro微服務框架實踐 - API(十三)

API

Micro的api就是api網關

API參考了API網關模式為服務提供了一個單一的公共入口。基于服務發現,使得micro api可以提供具備http及動態路由的服務。

image

概覽

Micro的API基于HTTP協議。請求的API接口通過HTTP協議訪問,并且路由是基于服務發現機制向下轉發的。 Micro API在 go-micro之上開發,所以它集成了服務發現、負載均衡、編碼及基于RPC的通信。

因為micro api內部使用了go-micro,所以它自身也是可插拔的。 參考go-plugins了解對gRPC、kubernetes、etcd、nats、及rabbitmq等支持。另外,api也使用了go-api,這樣,接口handler也是可以配置的。

安裝

go get -u github.com/micro/micro

運行

# 默認的端口是8080
micro api

使用ACME協議

ACME( Automatic Certificate Management Environment)是由Let’s Encrypt制定的安全協議。

MICRO_ENABLE_ACME=true micro api

可以選擇是否配置白名單

MICRO_ENABLE_ACME=true \
MICRO_ACME_HOSTS=example.com,api.example.com \
micro api

設置TLS證書

API服務支持TLS證書

MICRO_ENABLE_TLS=true \
MICRO_TLS_CERT_FILE=/path/to/cert \
MICRO_TLS_KEY_FILE=/path/to/key \
micro api

設置命名空間

API使用帶分隔符的命名空間來在邏輯上區分后臺服務及公開的服務。命名空間及http請求路徑會用于解析服務名與方法,比如GET /foo HTTP/1.1會被路由到go.micro.api.foo服務上。

API默認的命名空間是go.micro.api,當然,也可以修改:

MICRO_NAMESPACE=com.example.api micro api

示例

我們演示一個3層的服務架構:

  • micro api: (localhost:8080) - http訪問入口
  • api service: (go.micro.api.greeter) - 對外暴露的API服務
  • backend service: (go.micro.srv.greeter) - 內網的后臺服務

完整示例可以參考:examples/greeter

運行示例

先決條件:我們使用Consul作為默認的服務發現,所以請先確定它已經安裝好了,并且已經運行,比如執行consul agent -dev這樣子方式運行。

# 下載示例
git clone https://github.com/micro/examples

# 運行服務
go run examples/greeter/srv/main.go

# 運行api
go run examples/greeter/api/api.go

# 啟動micro api
micro api

查詢

向micro api發起http請求

curl "http://localhost:8080/greeter/say/hello?name=John"

HTTP請求的路徑/greeter/say/hello會被路由到服務go.micro.api.greeter的方法Say.Hello上。

繞開api服務并且直接通過rpc調用:

curl -d 'service=go.micro.srv.greeter' \
     -d 'method=Say.Hello' \
     -d 'request={"name": "John"}' \
     http://localhost:8080/rpc

使用JSON的方式執行同一請求:

curl -H 'Content-Type: application/json' \
     -d '{"service": "go.micro.srv.greeter", "method": "Say.Hello", "request": {"name": "John"}}' \
     http://localhost:8080/rpc

API

micro api提供下面類型的http api接口

- /[service]/[method]   # HTTP路徑式的會被動態地定位到服務上
- /rpc          # 顯式使用后臺服務與方法名直接調用

請看下面的例子

Handlers

Handler負責持有并管理HTTP請求路由。

默認的handler使用從注冊中心獲取的端口元數據來決定指向服務的路由,如果路由不匹配,就會回退到使用”rpc” hander。在注冊時,可以通過go-api來配置路由。

API有如下方法可以配置請求handler:

  • api - 處理http請求,通過RPC來完全控制http的請求/響應。
  • rpc - 處理json及protobuf格式的POST請求,并轉向RPC。
  • proxy - 處理http請求并轉向反向代理。
  • event - 處理任意的http請求并向消息總線分發消息。
  • web - 包含web socket的http反向代理。

通過/rpc入口可以繞開handler處理器。

API Handler

API處理器接收任何的HTTP請求,并且向前轉發指定格式的RPC請求。

  • Content-Type: 支持任何類型
  • Body: 支持任何格式
  • Forward Format: 轉發格式,api.Request/api.Response
  • Path: 請求路徑,/[service]/[method]
  • Resolver: 請求解析器,路徑會被解析成服務與方法
  • Configure: 配置,在啟動時指定--handler=api或在啟動命令前指定環境變量MICRO_API_HANDLER=api

RPC Handler

RPC處理器接收json或protobuf格式的HTTP POST請求,然后向前轉成RPC請求。

  • Content-Type: application/json or application/protobuf
  • Body: JSON 或者 Protobuf
  • Forward Format: json-rpc或者proto-rpc,與Content-Type有關
  • Path: /[service]/[method]
  • Resolver: 請求解析器,路徑會被解析成服務與方法
  • Configure: 配置,在啟動時指定--handler=rpc或在啟動命令前指定環境變量MICRO_API_HANDLER=rpc
  • 如果沒有設置時,RPC Handler就是默認的handler,

Proxy Handler

代理Handler其實是內置在服務發現中的反向代理服務。

  • Content-Type: 支持任何類型
  • Body: 支持任何格式
  • Forward Format: HTTP反向代理
  • Path: /[service]
  • Resolver: 請求解析器,路徑會被解析成服務名
  • Configure: 配置,在啟動時指定--handler=proxy或在啟動命令前指定環境變量MICRO_API_HANDLER=proxy
  • REST can be implemented behind the API as microservices(不太好理解,待翻譯)

Event Handler

事件處理器使用go-micro的broker代理接收http請求并把請求作為消息傳到消息總線上。

  • Content-Type: 支持任何類型
  • Body: 支持任何格式
  • Forward Format: 請求格式得是 go-api/proto.Event
  • Path: 請求路徑,/[topic]/[event]
  • Resolver: 請求解析器,路徑會被解析成topic(主題,相當于事件分類)與事件(event)名。
  • Configure: 配置,在啟動時指定--handler=event或在啟動命令前指定環境變量MICRO_API_HANDLER=event

Web Handler

Web處理器是,它是內置在服務發現中的HTTP反向代理服務,支持web socket。

  • Content-Type: 支持任何類型
  • Body: 支持任何格式
  • Forward Format: HTTP反向代理,包括web socket
  • Path: /[service]
  • Resolver: 請求解析器,路徑會被解析成服務名
  • Configure: 配置,在啟動時指定--handler=web或在啟動命令前指定環境變量MICRO_API_HANDLER=web

RPC endpoint

/rpc端點允許繞過主handler,然后與任何服務直接會話。

  • 請求參數
    • service - 指定服務名
    • method - 指定方法名
    • request - 請求body體
    • address - 可選,指定特定的目標主機地址

示例:

curl -d 'service=go.micro.srv.greeter' \
     -d 'method=Say.Hello' \
     -d 'request={"name": "Bob"}' \
     http://localhost:8080/rpc

更多信息查看可運行的示例:github.com/micro/examples/api

Resolver

解析器,Micro使用命名空間與HTTP請求路徑來動態路由到具體的服務。

API命名的空間是go.micro.api。可以通過指令--namespace或者環境變量MICRO_NAMESPACE=設置命名空間。

下面說一下解析器是如何使用的:

RPC Resolver

RPC解析器示例中的RPC服務有名稱與方法,分別是go.micro.api.greeterGreeter.Hello

URL會被解析成以下幾部分:

路徑 服務 方法
/foo/bar go.micro.api.foo Foo.Bar
/foo/bar/baz go.micro.api.foo Bar.Baz
/foo/bar/baz/cat go.micro.api.foo.bar Baz.Cat

帶版本號的API URL也可以很容易定位到具體的服務:

Path Service Method
/foo/bar go.micro.api.foo Foo.Bar
/v1/foo/bar go.micro.api.v1.foo Foo.Bar
/v1/foo/bar/baz go.micro.api.v1.foo Bar.Baz
/v2/foo/bar go.micro.api.v2.foo Foo.Bar
/v2/foo/bar/baz go.micro.api.v2.foo Bar.Baz

Proxy Resolver

代理解析器只處理服務名,所以處理方案和RPC解析器有點不太一樣。

URL會被解析成以下幾部分:

路徑 服務 方法
/foo go.micro.api.foo /foo
/foo/bar go.micro.api.foo /foo/bar
/greeter go.micro.api.greeter /greeter
/greeter/:name go.micro.api.greeter /greeter/:name
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,702評論 6 534
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,615評論 3 419
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,606評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,044評論 1 314
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,826評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,227評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,307評論 3 442
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,447評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,992評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,807評論 3 355
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,001評論 1 370
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,550評論 5 361
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,243評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,667評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,930評論 1 287
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,709評論 3 393
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,996評論 2 374

推薦閱讀更多精彩內容