[コード記事]独自のgolangフレームワークを一から段階的に構築します(6)

基本的に、この基本的なフレームワークを取得した後、必要な変更を加えることができます。たとえば、キュ​​ープラグインを追加する場合は、対応するディレクトリで変更できますが、より一般的なものにしたいと思います。この記事では、WebSocketサービスを開始し、構成ファイルをyaml形式に変更します。

構成を変更する

構成をjsonからyamlに変更する理由はいくつかあります。

  1. jsonは主に情報送信に使用され、yamlは構成ファイル形式としての使用に適していますが、2つの目的は異なります。
  2. yaml形式はjsonよりも明確に見えます。
  3. 構成を理解しやすくするために、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に注目してください。メッセージを残してください。

画像

元の記事を20件公開 Likes0 訪問数765

おすすめ

転載: blog.csdn.net/qq_31362439/article/details/104324603