基本的に、この基本的なフレームワークを取得した後、必要な変更を加えることができます。たとえば、キュープラグインを追加する場合は、対応するディレクトリで変更できますが、より一般的なものにしたいと思います。この記事では、WebSocketサービスを開始し、構成ファイルをyaml形式に変更します。
構成を変更する
構成をjsonからyamlに変更する理由はいくつかあります。
- jsonは主に情報送信に使用され、yamlは構成ファイル形式としての使用に適していますが、2つの目的は異なります。
- yaml形式はjsonよりも明確に見えます。
- 構成を理解しやすくするために、yamlファイルにコメントを追加できます。
ここでは、yamlファイルの解析に使用されるパッケージは「gopkg.in/yaml.v2」です。例はgithubにあり、このプロジェクトへのリンクは記事の最後にあります。
フレームワークにWebSocketサービスを追加する
このプロジェクトがいくつかの基本的な機能をできる限りカバーできることを願っています。そのため、Websocketインターフェースを追加して、自分のやり方を確認しました。
前述したように、このプロジェクトの特定の処理ロジックはプロセス/コントローラーの下で実行され、インターフェースレベルはhttpおよびrpcディレクトリの下に分散されます。このフレームワークにwebsocketを追加する前に、まず知っておく必要があります。websocketはプロトコルであり、httpでアップグレードするプロトコルであるため、以前にhttpサービスを開いたときのようにポートを直接リッスンしませんが、サーバーとクライアント間の接続を実現するためのインターフェースを介して、サービスのインターフェースを開きます。これを明確にした後、コードを実現する方法を見てみましょう。
まず、ルートを追加します。
engine.GET("/ws", Ws)
次に、ルートが指すハンドラーWを実装します。
func Ws(ctx *gin.Context) {
ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
if err != nil {
return
}
defer ws.Close()
for {
//读取数据
mt, message, err := ws.ReadMessage()
if err != nil {
break
}
if string(message) == "ping" {
message = []byte("pong")
}
if string(message) == "server_time" {
resp, _, _ := controller.GetServerTime()
serverTime := strconv.FormatInt(resp.ServerTime, 10)
message = []byte(serverTime)
}
//写入数据
err = ws.WriteMessage(mt, message)
if err != nil {
break
}
}
}
この文のコードに注意してください:
ws, err := upGrader.Upgrade(ctx.Writer, ctx.Request, nil)
前述したように、websocketはプロトコルであり、httpの上にあるプロトコルであるため、httpを「アップグレード」します。forループもコードで使用されます。これは、httpモニタリングとよく似ています。統一するために、controller.GetServerTime()を呼び出してシステム時間を取得します。これにより、httpインターフェースとwsインターフェースが統合され、実際のロジックはコントローラー内にあります。
次に、テストするクライアントを記述します。
func TestWs(t *testing.T) {
var dialer *websocket.Dialer
conn, _, err := dialer.Dial("ws://127.0.0.1:8080/ws", nil)
if err != nil {
fmt.Println(err)
return
}
go timeWriter(conn)
for {
_, message, err := conn.ReadMessage()
if err != nil {
fmt.Println("read:", err)
return
}
fmt.Printf("received: %s\n", message)
}
}
func timeWriter(conn *websocket.Conn) {
for {
time.Sleep(time.Second * 2)
conn.WriteMessage(websocket.TextMessage, []byte(time.Now().Format("2006-01-02 15:04:05")))
conn.WriteMessage(websocket.TextMessage, []byte("ping"))
conn.WriteMessage(websocket.TextMessage, []byte("server_time"))
}
}
これまでのところ、このフレームワークにwebsocket関数を追加し、構成ファイルの形式をjsonからyamlに変更しました。
完全なコードについては、https://github.com/TomatoMr/awesomeframeworkを参照してください。
私の公開番号であるonepunchgoに注目してください。メッセージを残してください。