[Go][RPC]微服務

小黑-avatar-img
發佈於後端
更新於 發佈於 閱讀時間約 6 分鐘

gRPC是一款跨平台、高性能的RPC框架,他可以在任何環境下執行,主要用於後端為服務開發。在用戶端應用程式中,可以像本地物件那樣呼叫遠端伺服器的方法,因此可以創建出分散式應用。


使用

./configure --prefix=/usr/local/protobuf


  • 編譯
make


  • 安裝
make install


  • 環境設定
cd~
vim .bash_profile

在bash_profile最後面增加

export PROTOBUF=/usr/local/protobuf

export PATH=$PROTOBUF/bin:$PATH

編輯完後

source .bash_profile


  • 檢查是否安裝成功
protoc --version


  • 安裝Go的protobuf套件
go get -u github.com/golang/protobuf/proto
go get -u github.com/golang/protobuf/protoc-gen-go
cp -r protoc-gen-go /usr/local/bin/


  • 建立proto檔案
//指定語法格式,注意proto3不再支援proto2的required和optional
syntax = "proto3";
//指定產生的programmer.pb.go的包名,防止命名衝突
package proto;

//service定義公開的服務
service ProgrammerService {
//rpc定義服務內的GetProgrammerInfo遠端呼叫
rpc GetProgrammerInfo (Request) returns (Response) {
}
}

//客戶端請求的資料格式
message Request {
// [修飾符] 類型 字段名 = 標識符;
string name = 1;
}

//服務端回應的資料格式
message Response {
int32 uid = 1;
string username = 2;
string job = 3;
//repeated修飾符表示欄位是可變數組,即slice類型
repeated string goodAt = 4;
}


  • 編譯proto檔案
protoc --go_out=plugins=grpc:. ./your_proto_file


服務端

package main

import (
"fmt"
"log"
"net"
//導入生成好的protobuf
pb "xxx"
"golang.org/x/net/context"
"google.golang.org/grpc"
)

//定義服務
type ProgrammerServiceServer struct{}

func (p *ProgrammerServiceServer) GetProgrammerInfo(ctx context.Context, req *pb.Request) (resp *pb.Response, err error) {
name := req.Name
if name == "xxx" {
resp = &pb.Response{
Uid: 6,
Username: name,
Job: "CTO",
GoodAt: []string{"Go","Java","PHP","Python"},
}

}
err = nil
return
}

func main() {
port := ":8078"
l, err := net.Listen("tcp", port)
if err != nil {
log.Fatalf("listen error: %v\n", err)
}
fmt.Printf("listen %s\n", port)
s := grpc.NewServer()
//將ProgrammerService註冊到gRPC
//注意第二個參數ProgrammerServiceServer是介面類型的變數
//需取地址傳參
pb.RegisterProgrammerServiceServer(s, &ProgrammerServiceServer{})
s.Serve(l)
}

啟動服務

go run grpc-server.go


用戶端

package main

import (
"fmt"
//導入生成好的protobuf
pb "xxx"
"golang.org/x/net/context"
"google.golang.org/grpc"
"log"
)

func main() {
conn, err := grpc.Dial(":8078", grpc.WithInsecure())
if err != nil {
log.Fatalf("dial error: %v\n", err)
}

defer conn.Close()

client := pb.NewProgrammerServiceClient(conn)

//呼叫服務
req := new(pb.Request)
req.Name = "shirdon"
resp, err := client.GetProgrammerInfo(context.Background(), req)
if err != nil {
log.Fatalf("resp error: %v\n", err)
}

fmt.Printf("Recevied: %v\n", resp)
}

啟動用戶

go run grpc-clien.go





avatar-img
8會員
123內容數
嗨,我是一名程式設計師,會在這分享開發與學習紀錄。
留言0
查看全部
avatar-img
發表第一個留言支持創作者!
小黑與程式的邂逅 的其他內容
package main import ( "fmt" "net" "time" ) var ConnSlice map[net.Conn]*Heartbeat type Heartbeat struct { endTime int64 //結束時間 } func main() {
package main import ( "bufio" "fmt" "net" "os" "time" ) func main() { //指定協定 tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8086") if
Gorm是Go當中一款ORM函數褲,有以下特點: 支持連結 支援鉤子函數Hook 支援預先載入 支援交易 支援複合主鍵 支援SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u github.com/jinzhu/gor
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
package main import ( "fmt" "net" "time" ) var ConnSlice map[net.Conn]*Heartbeat type Heartbeat struct { endTime int64 //結束時間 } func main() {
package main import ( "bufio" "fmt" "net" "os" "time" ) func main() { //指定協定 tcpAddr, err := net.ResolveTCPAddr("tcp4", "127.0.0.1:8086") if
Gorm是Go當中一款ORM函數褲,有以下特點: 支持連結 支援鉤子函數Hook 支援預先載入 支援交易 支援複合主鍵 支援SQL生成器 支援資料庫自動遷移 支援自訂日誌 可擴充性 所有功能都被測試覆蓋 安裝 go get -u github.com/jinzhu/gor
下載 go get github.com/gomodule/redigo 連接 package main import ( "fmt" "github.com/gomodule/redigo/redis" ) func main() { c, err := redis.Dial(
Redis被稱為「資料結構伺服器」,因為其中的值(Value)可以是字串(String)、雜湊(Hash)、清單(List)、集合(Set)和有序集合(Sorted Set)等類型。 安裝 下載 wget https://download.redis.io/release/redis-6.
下載驅動 go get -u github.com/go-sql-driver/mysql 連接資料庫 package main import ( "database/sql" "fmt" _ "github.com/go-sql-driver/mysql" ) var db *
你可能也想看
Google News 追蹤
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
Google Gemini 2.0 的超擬真人語音功能引發震撼,其 Native Audio OUTPUT 技術能模擬各種情緒、語速與停頓,應用層面廣泛,但同時也帶來行銷操控的隱憂。本文探討 Gemini 2.0 的優缺點、應用瓶頸與未來發展,並提醒企業主管及使用者需謹慎評估風險。
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
探索由小芝風花主演的感人日劇《GO HOME 警視廳身份不明者諮詢室》,溫情推理揭開死者身份之謎,每集都是一次觸動人心的旅程。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
隨著企業在數位轉型過程中,愈來愈依賴多雲端架構,對雲端安全性和合規性的需求變得前所未有的重要。 雲原生應用程式保護平台(CNAPP)提供了一套全面的解決方案,讓企業能夠有效地管理多雲端環境中的安全性和合規性。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為
Thumbnail
嘿,大家新年快樂~ 新年大家都在做什麼呢? 跨年夜的我趕工製作某個外包設計案,在工作告一段落時趕上倒數。 然後和兩個小孩過了一個忙亂的元旦。在深夜時刻,看到朋友傳來的解籤網站,興致勃勃熬夜體驗了一下,覺得非常好玩,或許有人玩過了,但還是想寫上來分享紀錄一下~
Thumbnail
Google Gemini 2.0 的超擬真人語音功能引發震撼,其 Native Audio OUTPUT 技術能模擬各種情緒、語速與停頓,應用層面廣泛,但同時也帶來行銷操控的隱憂。本文探討 Gemini 2.0 的優缺點、應用瓶頸與未來發展,並提醒企業主管及使用者需謹慎評估風險。
2024年底,回顧了過去兩年。 那天在山上跟竹說:不知道為什麼,我覺得這兩年對我來說是生命的一格刻度。 2023、2024這兩年發生了很多事,大三大四對很多人來說都是轉變的時間點,我也不例外。和小時候比起來,更多陌生未知的痛苦,但也有更多不可計量的快樂體驗。擁有更多更多的朋友,卻比過去知道如何與
跟著意志與心之所向行事,向來都是困難的。會考慮太多世俗的眼光,旁人的意見,所以保持安靜是必要的。不需要向其他人解釋與說明,自己想要達成的事,只需要自己努力便是。安靜地看著,用著力氣做著自己的事就好。有許多事,不需要明白地說明,因為能懂的只有自己。工作,家人,情人,都好。彷彿只有自己的時候,才能想透徹
Thumbnail
探索由小芝風花主演的感人日劇《GO HOME 警視廳身份不明者諮詢室》,溫情推理揭開死者身份之謎,每集都是一次觸動人心的旅程。
Thumbnail
在這篇教學文章中,我們將展示如何使用 Node.js 建立一個簡單的伺服器,並解決常見的跨來源資源共享(CORS)問題,確保伺服器能夠接收並處理來自不同來源的資料。
Thumbnail
隨著企業在數位轉型過程中,愈來愈依賴多雲端架構,對雲端安全性和合規性的需求變得前所未有的重要。 雲原生應用程式保護平台(CNAPP)提供了一套全面的解決方案,讓企業能夠有效地管理多雲端環境中的安全性和合規性。
Thumbnail
※ 什麼是Web API API 就是後端開出來讓前端來用的介面,讓前端與後端可以溝通。 API流程: 終端使用者用任何一種裝置進入瀏覽器。 瀏覽器透過 API 向後端發出請求,請求查詢或修改資料。 後端透過 API 收到前端的請求後,取得資料並回應給前端。 前端渲染畫面,終端使用者
Thumbnail
GOB Go官方有提供net/rpc的RPC套件。此套件提供GOB的編/解碼,且支援TCP或HTTP傳輸方式。它可以在伺服器端註冊多個不同類型物件。 遠端存取的要求條件 方法的類型可輸出 方法的本體可輸出 方法必須要有兩個參數是輸出或內建 方法的第二個參數是指標型 方法的返回類型為