# Micro Sidecar
Micro Sidecar是用于構建高度可用和容錯微服務的服務網格。
它與Netflix的[Prana](https://github.com/Netflix/Prana),Buoyant的RPC Proxy [Linkerd](https://linkerd.io/)或Lyft的[Envoy](https://www.envoyproxy.io/)類似。
Micro Sidecar采用[go-micro](https://github.com/micro/go-micro),具有相同的默認設置和可插拔性。

可以在[examples/sidecar](https://github.com/micro/examples/tree/master/sidecar)找到許多語言的用法示例。
## API
該sidecar具有以下HTTP API。
```
- /[service]/[method]
- /broker
- /registry
- /rpc
```
## 特征
sidecar具有go-micro的所有功能。這是最相關的。
- 服務發現
- 消息總線
- RPC和代理處理程序
- 負載平衡,重試,超時
- 健康檢測
- 統計界面
- 可通過go-micro插入
## 入門
### 安裝
```
go get github.com/micro/micro
```
### 依賴
Sidecar使用go-micro,這意味著它有一個默認依賴關系,用于服務發現的Consul。
```
brew install consul
consul agent -dev
```
### 運行
默認情況下,在端口8081上運行Micro Sidecar。
啟動Sidecar
```
micro sidecar
```
如果要在啟動時自動注冊應用程序,請指定應用程序服務名和地址。
```
micro sidecar --server_name=foo --server_address=127.0.0.1:9090
```
### 通過ACME使能加密
通過使用ACME提供安全服務
```
micro --enable_acme sidecar
```
可以指定一個主機白名單
```
micro --enable_acme --acme_hosts=example.com,proxy.example.com sidecar
```
### 提供TLS安全
Sidecar支持使用TLS證書安全地提供服務
```
micro --enable_tls --tls_cert_file=/path/to/cert --tls_key_file=/path/to/key sidecar
```
### 自動健康檢查
用“-healthcheck_url=”啟動微型邊車以啟用健康檢查器
它執行以下操作:
- 自動服務注冊
- 定期HTTP健康檢查
- 通過非200響應取消注冊
```
micro sidecar --server_name=foo --server_address=127.0.0.1:9090 \
--healthcheck_url=http://127.0.0.1:9090/health
```
## 注冊
### 注冊服務
```
// specify ttl as a param to expire the registration
// units ns|us|ms|s|m|h
// http://127.0.0.1:8081/registry?ttl=10s
curl -H 'Content-Type: application/json' http://127.0.0.1:8081/registry -d
{
"Name": "foo.bar",
"Nodes": [{
"Port": 9091,
"Address": "127.0.0.1",
"Id": "foo.bar-017da09a-734f-11e5-8136-68a86d0d36b6"
}]
}
```
### 取消注冊
```
curl -X "DELETE" -H 'Content-Type: application/json' http://127.0.0.1:8081/registry -d
{
"Name": "foo.bar",
"Nodes": [{
"Port": 9091,
"Address": "127.0.0.1",
"Id": "foo.bar-017da09a-734f-11e5-8136-68a86d0d36b6"
}]
}
```
### 查詢服務
```
curl http://127.0.0.1:8081/registry?service=go.micro.srv.example
{
"name":"go.micro.srv.example",
"nodes":[{
"id":"go.micro.srv.example-c5718d29-da2a-11e4-be11-68a86d0d36b6",
"address":"[::]","port":60728
}]
}
```
## Handlers
### RPC
使用json或protobuf查詢微服務。對后端的請求將使用go-micro RPC客戶端進行。
使用`/[service]/[method]`
所調用服務的默認名稱空間是`go.micro.srv`
```
curl -H 'Content-Type: application/json' -d '{"name": "John"}' http://127.0.0.1:8081/example/call
```
使用`/rpc`端口
```
curl -d 'service=go.micro.srv.example' \
-d 'method=Example.Call' \
-d 'request={"name": "John"}' http://127.0.0.1:8081/rpc
```
### Proxy
與api和web服務器一樣,sidecar可以提供完整的http代理。
在命令行上啟用代理處理程序。
```
micro sidecar --handler=proxy
```
URL路徑中的第一個元素將與名稱空間一起用作要路由到的服務。
## 請求映射
URL路徑映射與Micro API相同
URL的映射如下:
|Path|Service|Method|
|---|---|---|
|/foo/bar |go.micro.srv.foo| Foo.Bar|
|/foo/bar/baz |go.micro.srv.foo| Bar.Baz|
|/foo/bar/baz/cat|go.micro.srv.foo.bar|Baz.Cat|
版本化的API URL可以很容易地映射到服務名稱:
|Path|Service|Method|
|---|---|---|
|/foo/bar |go.micro.srv.foo |Foo.Bar|
|/v1/foo/bar |go.micro.srv.v1.foo|Foo.Bar|
|/v1/foo/bar/baz|go.micro.srv.v1.foo|Bar.Baz|
|/v2/foo/bar |go.micro.srv.v2.foo|Foo.Bar|
|/v2/foo/bar/baz|go.micro.srv.v2.foo|Bar.Baz|
## 事件
### 發布
```
curl -XPOST \
-H "Timestamp: 1499951537" \
-d "Hello World!" \
"http://localhost:8081/broker?topic=foo"
```
### 訂閱
```
conn, _, _ := websocket.DefaultDialer.Dial("ws://127.0.0.1:8081/broker?topic=foo", make(http.Header))
// optionally specify "queue=[queue name]" param to distribute traffic amongst subscribers
// websocket.DefaultDialer.Dial("ws://127.0.0.1:8081/broker?topic=foo&queue=group-1", make(http.Header))
for {
// Read message
_, p, err := conn.ReadMessage()
if err != nil {
return
}
// Unmarshal into broker.Message
var msg *broker.Message
json.Unmarshal(p, &msg)
// Print message body
fmt.Println(msg.Body)
}
```
## CLI代理
該sidecar還充當CLI訪問遠程環境的代理。
```
$ micro --proxy_address=127.0.0.1:8081 list services
go.micro.srv.greeter
```
## 統計儀表板
通過`--enable_stats`標志啟用統計信息顯示板。它將暴露在`/stats`上。
```
micro --enable_stats sidecar
```
