最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

go實現(xiàn)grpc四種數(shù)據流模式

 更新時間:2022年04月13日 09:02:54   作者:Jeff的技術棧  
這篇文章主要為大家介紹了go實現(xiàn)grpc四種數(shù)據流模式,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪

1. 什么是數(shù)據流

grpc中的stream,srteam顧名思義就是一種流,可以源源不斷的推送數(shù)據,很適合傳輸一些大數(shù)據,或者服務端和客戶端長時間數(shù)據交互,比如客戶端可以向服務端訂閱一個數(shù)據,服務端就可以利用stream,源源不斷地推送數(shù)據。

底層還原成socket編程

2. grpc的四種數(shù)據流

1.簡單模式

2.服務端數(shù)據流模式(Server-side streaming RPC)

3.客戶端數(shù)據流模式(Client-side streaming RPC)

4.雙向數(shù)據流模式(Bidirectional streaming RPC)

2.1 簡單模式

  這種模式最為傳統(tǒng),即客戶端發(fā)起一次請求,服務端響應一個數(shù)據,這和大家平時熟悉的RPC沒有什么大的區(qū)別,上兩篇中介紹此模式。

2.2 服務端數(shù)據流模式

  這種模式是客戶端發(fā)起一次請求,服務端返回一段連續(xù)的數(shù)據流。典型的例子是客戶端向服務端發(fā)送一個股票代碼,服務端就把該股票的實時數(shù)據源源不斷的返回給客戶端

2.3 客戶端數(shù)據流模式

  與服務端數(shù)據流模式相反,這次是客戶端源源不斷的向服務端發(fā)送數(shù)據流,而在發(fā)送結束后,由服務端返回一個響應。典型的例子是物聯(lián)網終端向服務器報送數(shù)據。

2.4 雙向數(shù)據流

  顧名思義,這是客戶端和服務端都可以向對方發(fā)送數(shù)據流,這個時候雙方的數(shù)據可以同時互相發(fā)送,也就是可以實現(xiàn)實時交互。典型的例子是聊天機器人。

3. 上代碼

3.1 代碼目錄

3.2 編寫stream.proto文件

stream是常量,寫在哪一邊,哪一邊就是數(shù)據流

syntax = "proto3";
option go_package = "./;proto";
service Greeter {
    // 定義方法,stream是常量,流模式
    rpc ServerStream (StreamRequestData) returns (stream StreamResponseData);      //服務端流模式,拉消息
    rpc ClientStream (stream StreamRequestData) returns (StreamResponseData);      //客戶端流模式,推消息
    rpc AllStream (stream StreamRequestData) returns (stream StreamResponseData);  //雙向流模式,能推能拉
}
message StreamRequestData {
    string data = 1; //編號
}
message StreamResponseData {
    string data = 1; //編號
}

 生成go的protobuf文件命令:

cd到proto目錄下

命令:protoc -I . hello.proto   --go_out=plugins=grpc:.

3.3 編寫server文件

package main
import (
	"file_test/grpc_go_stream/proto"
	"fmt"
	"net"
	"sync"
	"time"
	"google.golang.org/grpc"
)
const port = 8082
type server struct{}
func (s *server) ServerStream(req *proto.StreamRequestData, res proto.Greeter_ServerStreamServer) error {
	i := 0
	for {
		i++
		//業(yè)務代碼
		_ = res.Send(&proto.StreamResponseData{
			Data: fmt.Sprintf("這是發(fā)給%s的數(shù)據流", req.Data),
		})
		time.Sleep(time.Second * 1)
		if i > 10 {
			break
		}
	}
	return nil
}
func (s *server) ClientStream(cliStr proto.Greeter_ClientStreamServer) error {
	for {
		//業(yè)務代碼
		res, err := cliStr.Recv()
		if err != nil {
			fmt.Println("本次客戶端流數(shù)據發(fā)送完了:",err)
			break
		}
		fmt.Println("客戶端發(fā)來消息:",res.Data)
	}
	return nil
}
func (s *server) AllStream(allStr proto.Greeter_AllStreamServer) error {
	wg:=sync.WaitGroup{}
	wg.Add(2)
	//接受客戶端消息的協(xié)程
	go func() {
		defer wg.Done()
		for  {
			//業(yè)務代碼
			res, err := allStr.Recv()
			if err != nil {
				fmt.Println("本次客戶端流數(shù)據發(fā)送完了:",err)
				break
			}
			fmt.Println("收到客戶端發(fā)來消息:",res.Data)
		}
	}()
	//發(fā)送消息給客戶端的協(xié)程
	go func() {
		defer wg.Done()
		i := 0
		for {
			i++
			//業(yè)務代碼
			_ = allStr.Send(&proto.StreamResponseData{
				Data: fmt.Sprintf("這是發(fā)給客戶端的數(shù)據流"),
			})
			time.Sleep(time.Second * 1)
			if i > 10 {
				break
			}
		}
	}()
	wg.Wait()
	return nil
}
// 啟動
func start() {
	// 1.實例化server
	g := grpc.NewServer()
	// 2.注冊邏輯到server中
	proto.RegisterGreeterServer(g, &server{})
	// 3.啟動server
	lis, err := net.Listen("tcp", "127.0.0.1:8082")
	if err != nil {
		panic("監(jiān)聽錯誤:" + err.Error())
	}
	err = g.Serve(lis)
	if err != nil {
		panic("啟動錯誤:" + err.Error())
	}
}
func main() {
	start()
}

3.4 編寫client文件

package main
import (
	"context"
	"file_test/grpc_go_stream/proto"
	"fmt"
	"sync"
	"time"

	"google.golang.org/grpc"
)
var rpc proto.GreeterClient
func serverStreamDemo()  {
	//服務端流模式
	res,err:=rpc.ServerStream(context.Background(),&proto.StreamRequestData{Data: "jeff"})
	if err != nil {
		panic("rpc請求錯誤:"+err.Error())
	}
	for  {
		data,err:=res.Recv() //
		if err != nil {
			fmt.Println("客戶端發(fā)送完了:",err)
			return
		}
		fmt.Println("客戶端返回數(shù)據流值:",data.Data)
	}
}
func clientStreamDemo()  {
	//客戶端流模式
	cliStr, err := rpc.ClientStream(context.Background())
	if err != nil {
		panic("rpc請求錯誤:" + err.Error())
	}
	i := 0
	for {
		i++
		_ = cliStr.Send(&proto.StreamRequestData{
			Data: "jeff",
		})
		time.Sleep(time.Second * 1)
		if i > 10 {
			break
		}
	}
}
func clientAndServerStreamDemo()  {
	//雙向流模式
	allStr, _ := rpc.AllStream(context.Background())
	wg := sync.WaitGroup{}
	wg.Add(1)
	//接受服務端消息的協(xié)程
	go func() {
		defer wg.Done()
		for {
			//業(yè)務代碼
			res, err := allStr.Recv()
			if err != nil {
				fmt.Println("本次服務端流數(shù)據發(fā)送完了:", err)
				break
			}
			fmt.Println("收到服務端發(fā)來消息:", res.Data)
		}
	}()
	//發(fā)送消息給服務端的協(xié)程
	go func() {
		defer wg.Done()
		i := 0
		for {
			i++
			//業(yè)務代碼
			_ = allStr.Send(&proto.StreamRequestData{
				Data: fmt.Sprintf("這是發(fā)給服務端的數(shù)據流"),
			})
			time.Sleep(time.Second * 1)
			if i > 10 {
				break
			}
		}
	}()
	wg.Wait()
}
// 啟動
func start() {
	conn, err := grpc.Dial("127.0.0.1:8082", grpc.WithInsecure())
	if err != nil {
		panic("rpc連接錯誤:" + err.Error())
	}
	defer conn.Close()
	rpc = proto.NewGreeterClient(conn) //初始化
	serverStreamDemo() //服務端流模式
	clientStreamDemo()  //客戶端流模式
	clientAndServerStreamDemo() // 雙向流模式
}
func main() {
	start()
}

以上就是go實現(xiàn)grpc四種數(shù)據流模式的詳細內容,更多關于go實現(xiàn)grpc流模式的資料請關注腳本之家其它相關文章!

相關文章

  • 淺談Golang 嵌套 interface 的賦值問題

    淺談Golang 嵌套 interface 的賦值問題

    這篇文章主要介紹了淺談Golang 嵌套 interface 的賦值問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • LRU?LFU?TinyLFU緩存算法實例詳解

    LRU?LFU?TinyLFU緩存算法實例詳解

    這篇文章主要為大家介紹了LRU?LFU?TinyLFU緩存算法實例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • go 原生http web 服務跨域restful api的寫法介紹

    go 原生http web 服務跨域restful api的寫法介紹

    這篇文章主要介紹了go 原生http web 服務跨域restful api的寫法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-04-04
  • GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    GoLand 2020.3 正式發(fā)布有不少新功能(支持泛型)

    這是 2020 年第 3 個版本,也是最后一個版本,你還將發(fā)現(xiàn)許多新的代碼編輯功能,具體內容詳情跟隨小編看看有哪些新特性
    2020-12-12
  • Golang使用泛型對數(shù)組進行去重的實現(xiàn)

    Golang使用泛型對數(shù)組進行去重的實現(xiàn)

    本文主要介紹了Golang使用泛型對數(shù)組進行去重的實現(xiàn),通過使用類型參數(shù)T和類型約束any,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2025-02-02
  • Go模板template用法詳解

    Go模板template用法詳解

    這篇文章主要介紹了Go標準庫template模板用法詳解;包括GO模板注釋,作用域,語法,函數(shù)等知識,需要的朋友可以參考下
    2022-04-04
  • 淺談golang的http cookie用法

    淺談golang的http cookie用法

    本篇文章主要介紹了golang的http cookie用法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-01-01
  • golang?用msgpack高效序列化的案例

    golang?用msgpack高效序列化的案例

    msgpack是一個非常受歡迎的Go序列化庫,具有很好的跨語言支持,這篇文章主要介紹了golang?用msgpack高效序列化的相關知識,需要的朋友可以參考下
    2023-05-05
  • golang http 連接超時和傳輸超時的例子

    golang http 連接超時和傳輸超時的例子

    今天小編就為大家分享一篇golang http 連接超時和傳輸超時的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07
  • Go進行接口組合的解決方案

    Go進行接口組合的解決方案

    在 Go 語言中,接口組合是一種強大的特性,它允許將多個接口組合成一個新的接口,從而提供更靈活和可擴展的代碼設計,本文給大家介紹了Go如何進行接口組合,需要的朋友可以參考下
    2024-06-06

最新評論

大竹县| 新竹县| 商南县| 石嘴山市| 鹤峰县| 东乌珠穆沁旗| 墨竹工卡县| 昌乐县| 堆龙德庆县| 依兰县| 肃南| 禄劝| 缙云县| 辉南县| 思南县| 玉田县| 海林市| 罗田县| 民丰县| 普宁市| 镇远县| 綦江县| 鄱阳县| 通山县| 呼图壁县| 黄石市| 龙海市| 曲周县| 满洲里市| 理塘县| 保定市| 泰宁县| 陆良县| 贺州市| 武胜县| 衡阳县| 墨竹工卡县| 法库县| 阿合奇县| 丹凤县| 云林县|