<abbr id="ciwa6"><option id="ciwa6"></option></abbr>
  • <sup id="ciwa6"><kbd id="ciwa6"></kbd></sup>
    <small id="ciwa6"></small>
  • 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

    400-811-9990
    手機(jī)站
    千鋒教育

    千鋒學(xué)習(xí)站 | 隨時隨地免費學(xué)

    千鋒教育

    掃一掃進(jìn)入千鋒手機(jī)站

    領(lǐng)取全套視頻
    千鋒教育

    關(guān)注千鋒學(xué)習(xí)站小程序
    隨時隨地免費學(xué)習(xí)課程

    上海
    • 北京
    • 鄭州
    • 武漢
    • 成都
    • 西安
    • 沈陽
    • 廣州
    • 南京
    • 深圳
    • 大連
    • 青島
    • 杭州
    • 重慶
    當(dāng)前位置:成都千鋒IT培訓(xùn)  >  技術(shù)干貨  >  golang實現(xiàn)微服務(wù)架構(gòu)使用grpc和protobuf

    golang實現(xiàn)微服務(wù)架構(gòu)使用grpc和protobuf

    來源:千鋒教育
    發(fā)布人:xqq
    時間: 2023-12-23 22:39:13

    Golang實現(xiàn)微服務(wù)架構(gòu):使用gRPC和Protobuf

    在現(xiàn)代軟件開發(fā)中,微服務(wù)架構(gòu)已經(jīng)成為了一種流行的設(shè)計思想。在這種架構(gòu)下,應(yīng)用程序被劃分為獨立的服務(wù),并可以運行在不同的環(huán)境中。每個服務(wù)都可以單獨擴(kuò)展并獨立部署,同時可以通過API進(jìn)行交互。在這篇文章中,我們將討論如何使用Golang實現(xiàn)微服務(wù)架構(gòu),并使用gRPC和Protobuf進(jìn)行服務(wù)之間的通信。

    gRPC是Google開源的高性能、輕量級的RPC框架。它是基于HTTP2協(xié)議實現(xiàn)的,使用二進(jìn)制傳輸,可以非??焖俚貍鬏敂?shù)據(jù)。在gRPC中,可以使用Protocol Buffers(Protobuf)作為數(shù)據(jù)傳輸格式。Protobuf是Google開源的一種序列化數(shù)據(jù)結(jié)構(gòu)的協(xié)議。它可以將結(jié)構(gòu)化數(shù)據(jù)序列化為二進(jìn)制格式,以便在各種應(yīng)用程序之間進(jìn)行傳輸。

    在下面的代碼演示中,我們將實現(xiàn)一個簡單的微服務(wù)架構(gòu),例如適用于在線商店的應(yīng)用程序。我們將創(chuàng)建兩個服務(wù),一個是商品服務(wù),另一個是購物車服務(wù)。商品服務(wù)將返回在店鋪中所有的商品信息,購物車服務(wù)將向某個用戶的購物車中添加或刪除商品。

    首先,我們需要定義Protobuf文件以確保數(shù)據(jù)在服務(wù)之間被正確傳輸。創(chuàng)建一個名為“shop.proto”的文件,并在其中添加以下代碼:

    syntax = "proto3";package shop;service ProductService{    rpc GetAllProducts(GetAllProductsRequest) returns (GetAllProductsResponse) {}}service CartService{    rpc AddToCart(AddToCartRequest) returns (AddToCartResponse) {}    rpc RemoveFromCart(RemoveFromCartRequest) returns (RemoveFromCartResponse) {}}message Product{    int32 id = 1;    string name = 2;    float price = 3;}message GetAllProductsRequest {}message GetAllProductsResponse{    repeated Product products = 1;}message AddToCartRequest{    int32 userId = 1;    int32 productId = 2;}message AddToCartResponse{}message RemoveFromCartRequest{    int32 userId = 1;    int32 productId = 2;}message RemoveFromCartResponse{}

    在上面的代碼中,我們定義了兩個服務(wù):ProductService和CartService。 ProductService有一個名為“GetAllProducts”的方法,該方法返回所有的商品信息。 CartService有兩個方法:AddToCart和RemoveFromCart,這兩個方法用于增刪用戶購物車中的商品。我們還定義了一個名為“Product”的消息類型,其中包含商品的名稱、價格和ID等信息。

    接下來,我們需要使用Protobuf工具生成Golang代碼。執(zhí)行以下命令:

    protoc --go_out=plugins=grpc:. *.proto

    這將在當(dāng)前目錄下生成與shop.proto相應(yīng)的Golang文件,其中包含Protobuf消息類型和gRPC服務(wù)的定義。

    接下來,我們將實現(xiàn)兩個服務(wù)的Golang代碼。 在product.go中,添加以下代碼:

    type server struct {}func (s *server) GetAllProducts(ctx context.Context, req *shop.GetAllProductsRequest) (*shop.GetAllProductsResponse, error) {    products := *shop.Product{        {Id: 1, Name: "Product A", Price: 100.0},        {Id: 2, Name: "Product B", Price: 200.0},        {Id: 3, Name: "Product C", Price: 300.0},    }    res := &shop.GetAllProductsResponse{Products: products}    return res, nil}func main() {    lis, err := net.Listen("tcp", ":8080")    if err != nil {        log.Fatalf("failed to listen: %v", err)    }    s := grpc.NewServer()    shop.RegisterProductServiceServer(s, &server{})    if err := s.Serve(lis); err != nil {        log.Fatalf("failed to serve: %v", err)    }}

    在上面的代碼中,我們首先定義了一個名為“server”的結(jié)構(gòu)體。接下來,在結(jié)構(gòu)體中定義了ProductService服務(wù)中的GetAllProducts方法。在該方法中,我們將返回帶有三個商品信息的響應(yīng)。

    在main函數(shù)中,我們首先使用net.Listen函數(shù)監(jiān)聽端口8080。接下來,我們將創(chuàng)建一個新的gRPC服務(wù)器,并將產(chǎn)品服務(wù)注冊到該服務(wù)器上。最后,我們使用gRPC服務(wù)器的Serve方法監(jiān)聽來自客戶端請求。

    在另一個名為cart.go的文件中,添加以下代碼:

    type server struct {}func (s *server) AddToCart(ctx context.Context, req *shop.AddToCartRequest) (*shop.AddToCartResponse, error) {    fmt.Printf("User %d adds product %d to cart.\n", req.UserId, req.ProductId)    return &shop.AddToCartResponse{}, nil}func (s *server) RemoveFromCart(ctx context.Context, req *shop.RemoveFromCartRequest) (*shop.RemoveFromCartResponse, error) {    fmt.Printf("User %d removes product %d from cart.\n", req.UserId, req.ProductId)    return &shop.RemoveFromCartResponse{}, nil}func main() {    lis, err := net.Listen("tcp", ":9090")    if err != nil {        log.Fatalf("failed to listen: %v", err)    }    s := grpc.NewServer()    shop.RegisterCartServiceServer(s, &server{})    if err := s.Serve(lis); err != nil {        log.Fatalf("failed to serve: %v", err)    }}

    在上面的代碼中,我們首先定義了一個名為“server”的結(jié)構(gòu)體。接下來,在結(jié)構(gòu)體中定義了 CartService 服務(wù)中的AddToCart和RemoveFromCart方法。我們還在控制臺中打印了每個方法的輸入?yún)?shù)。

    在main函數(shù)中,我們首先使用net.Listen函數(shù)監(jiān)聽端口9090。接下來,我們將創(chuàng)建一個新的gRPC服務(wù)器,并將購物車服務(wù)注冊到該服務(wù)器上。最后,我們使用gRPC服務(wù)器的Serve方法監(jiān)聽來自客戶端請求。

    現(xiàn)在,我們已經(jīng)完成了兩個服務(wù)的代碼實現(xiàn)。接下來,我們將編寫一個小的客戶端程序,以測試這兩個服務(wù)。在main.go中,添加以下代碼:

    func main() {    conn1, err := grpc.Dial("localhost:8080", grpc.WithInsecure())    if err != nil {        log.Fatalf("failed to dial: %v", err)    }    defer conn1.Close()    c1 := shop.NewProductServiceClient(conn1)    conn2, err := grpc.Dial("localhost:9090", grpc.WithInsecure())    if err != nil {        log.Fatalf("failed to dial: %v", err)    }    defer conn2.Close()    c2 := shop.NewCartServiceClient(conn2)    res1, err := c1.GetAllProducts(context.Background(), &shop.GetAllProductsRequest{})    if err != nil {        log.Fatalf("failed to get all products: %v", err)    }    fmt.Printf("All products: %+v\n", res1.Products)    _, err = c2.AddToCart(context.Background(), &shop.AddToCartRequest{UserId: 1, ProductId: 2})    if err != nil {        log.Fatalf("failed to add to cart: %v", err)    }    _, err = c2.RemoveFromCart(context.Background(), &shop.RemoveFromCartRequest{UserId: 1, ProductId: 2})    if err != nil {        log.Fatalf("failed to remove from cart: %v", err)    }}

    在上面的代碼中,我們首先使用grpc.Dial函數(shù)分別連接到產(chǎn)品服務(wù)和購物車服務(wù)。接下來,我們將創(chuàng)建一個新的客戶端,并使用它來調(diào)用GetAllProducts、AddToCart和RemoveFromCart方法。最后,我們在控制臺中打印了所有商品的信息。

    啟動所有服務(wù)后,運行main.go。您將看到以下輸出:

    All products: User 1 adds product 2 to cart.User 1 removes product 2 from cart.

    以上就是如何使用Golang實現(xiàn)微服務(wù)架構(gòu)并使用gRPC和Protobuf進(jìn)行服務(wù)之間的通信的完整演示。在實際開發(fā)中,可能存在更加復(fù)雜的情況,例如服務(wù)發(fā)現(xiàn)、負(fù)載均衡和安全性等問題。但是,gRPC和Protobuf提供了非常強(qiáng)大的工具,可以輕松地解決許多問題。

    聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。

    猜你喜歡LIKE

    Go語言網(wǎng)絡(luò)編程如何開發(fā)高性能TCP/UDP通信應(yīng)用程序

    2023-12-23

    Golang編程實戰(zhàn)使用beego框架構(gòu)建一個實時性應(yīng)用

    2023-12-23

    Go語言初學(xué)者必看如何使用Goland完成基礎(chǔ)語法學(xué)習(xí)!

    2023-12-23

    最新文章NEW

    golang實現(xiàn)微服務(wù)架構(gòu)使用grpc和protobuf

    2023-12-23

    Golang中的數(shù)據(jù)庫操作使用ORM框架和原生SQL語句

    2023-12-23

    Golang的內(nèi)存管理如何有效地使用內(nèi)存并避免內(nèi)存泄漏?

    2023-12-23

    相關(guān)推薦HOT

    更多>>

    快速通道 更多>>

    最新開班信息 更多>>

    網(wǎng)友熱搜 更多>>