## 日志處理
作為一款微服務框架,通過 GRPC 進行方法調用是業界的標配,Orange 框架目前已經支持 GRPC 服務。
框架內置GRPC服務有如下特點:
- 無需使用者配置額外的 proto 文件;
- 對現有編寫模式無感知,通過配置即可將 HTTP 服務對應的方法復刻到 GRPC;
- 對與客戶端調用也使用 Orange 框架的應用通過內置 GRPC 客戶端將和 HTTP 請求一樣快速方便的接入 GRPC
## 原理簡述
Orange 框架已經內置了一個通用的 proto 文件,通過該 proto 文件可以滿足我們大部分的使用需求,proto 文件詳見 [gitee.com/zhucheer/orange/blob/master/grpc/orange.proto](https://gitee.com/zhucheer/orange/blob/master/grpc/orange.proto)。
我們在使用 GRPC 服務時都是直接使用該 proto 文件生成的方法進行操作,該文件中定義了一個和 HTTP 請求類似的結構,只包含 `RequestDo` 一個方法,通過該方法傳遞請求和返回,平滑的將 HTTP 方法復刻到 GRPC,示意圖如下。

## 服務注冊
啟動 GRPC 服務之前需要注冊對應的 GRPC 方法,方法注冊只需要在路由中定義 GRPC 或 ALL 路由綁定即可,和現有 HTTP 開發模式一樣。
下面兩種路由綁定方法都能注冊到 GRPC 服務。
定義GRPC請求 `groupName.GRPC("/test", controller.Test)`
定義所有請求 `groupName.ALL("/test", controller.Test)`
## 服務啟動
服務啟動沒有任何改變,配置指定 GPRC 服務端口即可。
設置 GRPC 端口方法一:
修改配置文件 `app.grpcPort : 8089`
設置 GRPC 端口方法而:
啟動程序添加命令行參數 `--grpc=8089`
配置參數優先級:
命令行參數 > 配置文件
## 客戶端調用
服務啟動后我們就能通過框架內置的通用方法調用 GRPC 服務了,因內置的 proto 和 pb 文件已經生成好,使用框架內置方法也無需過多了解 proto 使用細節,對剛接入 GRPC 的同學非常友好。
依賴包:`"gitee.com/zhucheer/orange/grpc"`
實例化客戶端:`grpc.NewClient()`
鏈式操作設置客戶端地址:`SetSrvAddr("127.0.0.1:8089")`
設置超時時間: `SetTimeout(1)`
請求 GPRC 服務指定綁定的地址:`RunGRPC("/")` ,其中參數就是服務端再路由注冊時填的路徑。
```
// 引入包
import (
"gitee.com/zhucheer/orange/grpc"
)
// 指定 GRPC 服務地址和端口
resp, err := grpc.NewClient("127.0.0.1:8089").SetTimeout(1).RunGRPC("/")
```
## 完整的示例
該示例將服務端客戶端分別放著兩個方法里面,啟動后通過 訪問`http://127.0.0.1:8088/rpctest ` 后程序回調用自身的 GRPC 服務對應路徑為 "/" 的方法,輸出 `Hello world!`。
``` golang
package main
import (
"gitee.com/zhucheer/orange/app"
"gitee.com/zhucheer/orange/grpc"
)
func main() {
router := &Route{}
app.AppStart(router)
}
type Route struct {
}
func (s *Route) ServeMux() {
app.NewRouter("").GRPC("/", func(ctx *app.Context) error {
return ctx.ToString("Hello world!")
})
app.NewRouter("").GET("/rpctest", func(ctx *app.Context) error {
resp, err := grpc.NewClient().SetSrvAddr("127.0.0.1:8089").SetTimeout(1).RunGRPC("/")
if err != nil{
return ctx.ToString("grpc get respones:" + err.Error())
}
return ctx.ToString("grpc get respones:" + resp.String())
})
}
func (s *Route) Register() {
}
```
服務啟動:
```shell
## 開啟go mod
$ go mod init
## 先更新框架到master
$ go get gitee.com/zhucheer/orange@master
## 啟動服務配置 GRPC 端口
go run main.go --grpc=8989
```