国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 RPC 服務(wù)

這篇具有很好參考價(jià)值的文章主要介紹了Golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 RPC 服務(wù)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

分享一個(gè)簡(jiǎn)單的 rpc 服務(wù)框架

一、服務(wù)端實(shí)現(xiàn)

package main

import (
	"log"
	"net"
	"net/rpc"
)

const HelloServiceName = "main.HelloService"

type HelloServiceInterface interface {
	Hello(request string, replay *string) error
}

func RegisterHelloService(svc HelloServiceInterface) error {
	//todo 其中 rpc.Register 函數(shù)調(diào)用會(huì)將對(duì)象類(lèi)型中所有滿(mǎn)足 RPC 規(guī)則的對(duì)象方法注冊(cè)為 RPC 函數(shù),所有注冊(cè)的方法會(huì)放在 “HelloService” 服務(wù)空間之下。
	return rpc.RegisterName(HelloServiceName, svc)
}

type HelloService struct{}

//todo RPC方法需要滿(mǎn)足的規(guī)則:只能有兩個(gè)可序列化的參數(shù),第二個(gè)參數(shù)表reply是指針類(lèi)型,函數(shù)返回error類(lèi)型,函數(shù)需要大寫(xiě)進(jìn)行公開(kāi)

func (p *HelloService) Hello(request string, reply *string) error {
	*reply = "hello:" + request
	return nil
}

func main() {
	//rpc.RegisterName("HelloService", new(HelloService))
	RegisterHelloService(new(HelloService))

	//todo 然后我們建立一個(gè)唯一的 TCP 連接,并且通過(guò) rpc.ServeConn 函數(shù)在該 TCP 連接上為對(duì)方提供 RPC 服務(wù)。
	listener, err := net.Listen("tcp", ":1234")
	if err != nil {
		log.Fatal("ListenTCP error:", err)
	}

	for {
		conn, err := listener.Accept()
		if err != nil {
			log.Fatal("Accept error:", err)
		}

		//todo 啟動(dòng)協(xié)程去處理每個(gè)tcp請(qǐng)求
		go rpc.ServeConn(conn)
	}
}

二、客戶(hù)端實(shí)現(xiàn)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-846509.html

package main

import (
	"fmt"
	"log"
	"net/rpc"
)

const HelloServiceName = "main.HelloService"

type HelloServiceInterface interface {
	Hello(request string, replay *string) error
}

type HelloServiceClient struct {
	*rpc.Client
}

// todo 在編譯階段檢查 HelloServiceClient 類(lèi)型是否實(shí)現(xiàn)了 HelloServiceInterface 接口。
// TODO 這里將 nil 轉(zhuǎn)換為 *HelloServiceClient 類(lèi)型并賦值給 _(匿名變量),編譯器會(huì)自動(dòng)檢查 HelloServiceClient 是否實(shí)現(xiàn)了接口 HelloServiceInterface 中聲明的所有方法。
// TODO 如果 HelloServiceClient 沒(méi)有實(shí)現(xiàn)接口中的所有方法,這段代碼會(huì)導(dǎo)致編譯失敗,從而在編碼階段就能發(fā)現(xiàn)潛在的問(wèn)題。
var _ HelloServiceInterface = (*HelloServiceClient)(nil)

func DialHelloService(network, address string) (*HelloServiceClient, error) {
	c, err := rpc.Dial(network, address)
	if err != nil {
		return nil, err
	}

	return &HelloServiceClient{Client: c}, nil
}

func (p *HelloServiceClient) Hello(request string, reply *string) error {
	return p.Client.Call(HelloServiceName+".Hello", request, reply)
}

func main() {
	client, err := DialHelloService("tcp", "localhost:1234")

	if err != nil {
		log.Fatal("dialing:", err)
	}

	var reply string
	err = client.Hello("world", &reply)

	if err != nil {
		log.Fatal(err)
	}

	fmt.Println(reply)
}

到了這里,關(guān)于Golang 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的 RPC 服務(wù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • golang網(wǎng)絡(luò)編程學(xué)習(xí)-1rpc

    golang網(wǎng)絡(luò)編程學(xué)習(xí)-1rpc

    網(wǎng)絡(luò)編程主要的內(nèi)容是: 1.TCP網(wǎng)絡(luò)編程 2.http服務(wù) 3.rpc服務(wù) 4.websocket服務(wù) ? RPC 框架----- 遠(yuǎn)程過(guò)程調(diào)用協(xié)議RPC(Remote Procedure Call Protocol)-----允許像調(diào)用本地服務(wù)一樣調(diào)用遠(yuǎn)程服務(wù)。 RPC是指遠(yuǎn)程過(guò)程調(diào)用,也就是說(shuō)兩臺(tái)服務(wù)器A,B,一個(gè)應(yīng)用部署在A服務(wù)器上,想要調(diào)用B服務(wù)器上

    2024年02月16日
    瀏覽(20)
  • php-golang-rpc使用roadrunner-server/goridge/v3/pkg/rpc和php的spiral/goridge3.2實(shí)踐

    package main import ( ? ? \\\"fmt\\\" ? ? \\\"net\\\" ? ? \\\"net/rpc\\\" ? ? goridgeRpc \\\"github.com/roadrunner-server/goridge/v3/pkg/rpc\\\" ) type App struct{} func (s *App) Hi(name string, r *string) error { ? ? *r = fmt.Sprintf(\\\"Hello, %s!\\\", name) ? ? return nil } func main() { ? ? ln, err := net.Listen(\\\"tcp\\\", \\\":6001\\\") ? ? if err != nil { ? ? ? ? panic(er

    2024年02月15日
    瀏覽(21)
  • php-golang-rpc jsonrpc和php客戶(hù)端tivoka/tivoka包實(shí)踐

    php-golang-rpc jsonrpc和php客戶(hù)端tivoka/tivoka包實(shí)踐

    golang 代碼: package main import ( ? ? \\\"fmt\\\" ? ? \\\"net\\\" ? ? \\\"net/rpc\\\" ? ? \\\"net/rpc/jsonrpc\\\" ) type App struct{} type Res struct { ? ? Code int ? ?`json:\\\"code\\\"` ? ? Msg ?string `json:\\\"msg\\\"` ? ? Data any ? ?`json:\\\"data\\\"` } func (*App) Hi(mp map[string]any, res *Res) error { ? ? res.Code = 200 ? ? res.Msg = \\\"成功\\\" ? ? var rmp = mak

    2024年02月15日
    瀏覽(24)
  • php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka實(shí)踐

    php-golang-jsonrpc2.0 rpc-codec/jsonrpc2和tivoka/tivoka實(shí)踐

    golang代碼: package main import ( ? ? \\\"context\\\" ? ? \\\"net\\\" ? ? \\\"net/rpc\\\" ? ? \\\"github.com/powerman/rpc-codec/jsonrpc2\\\" ) type App struct{} type Res struct { ? ? Code int ? ?`json:\\\"code\\\"` ? ? Msg ?string `json:\\\"msg\\\"` ? ? Data any ? ?`json:\\\"data\\\"` } func (*App) Hi(mp map[string]any, res *Res) error { ? ? res.Code = 200 ? ? res.Msg = \\\"成

    2024年02月15日
    瀏覽(23)
  • Golang實(shí)現(xiàn)簡(jiǎn)單WebSocket服務(wù)

    我們每天接觸到各類(lèi)應(yīng)用,如社交、在線(xiàn)文檔、直播等,后端都需要使用WebSocket技術(shù)提供實(shí)時(shí)通信能力。本文介紹如何使用Golang實(shí)現(xiàn)實(shí)時(shí)后端WebSocket服務(wù),首先使用Gin框架搭建http服務(wù),然后使用 gorilla/websocket 庫(kù)實(shí)現(xiàn)簡(jiǎn)單后端WebSocket服務(wù),示例實(shí)現(xiàn)從0到1的過(guò)程,適合初學(xué)者快

    2024年02月16日
    瀏覽(21)
  • 【Dubbo3云原生微服務(wù)開(kāi)發(fā)實(shí)戰(zhàn)】「Dubbo前奏導(dǎo)學(xué)」 RPC服務(wù)的底層原理和實(shí)現(xiàn)

    【Dubbo3云原生微服務(wù)開(kāi)發(fā)實(shí)戰(zhàn)】「Dubbo前奏導(dǎo)學(xué)」 RPC服務(wù)的底層原理和實(shí)現(xiàn)

    Dubbo是一款高效而強(qiáng)大的RPC服務(wù)框架,它旨在解決微服務(wù)架構(gòu)下的服務(wù)監(jiān)控和通信問(wèn)題。該框架提供了Java、Golang等多語(yǔ)言的SDK,使得使用者可以輕松構(gòu)建和開(kāi)發(fā)微服務(wù)。Dubbo具備遠(yuǎn)程地址發(fā)現(xiàn)和通信能力,可通過(guò)Dubbo獨(dú)有的身臨其境的服務(wù)治理特驗(yàn)為主導(dǎo),以提高開(kāi)發(fā)人員的功

    2024年02月05日
    瀏覽(21)
  • Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架

    Rust微服務(wù)殺手級(jí)應(yīng)用終于來(lái)了!一個(gè)最像RPC框架的Rust-RPC框架

    https://github.com/kwsc98/krpc-rust 剛剛學(xué)習(xí)Rust語(yǔ)言或者沒(méi)怎么了解Rust-RPC框架的同學(xué),可能以為又是一個(gè)標(biāo)題黨了,但實(shí)際上了解過(guò)這部分的同學(xué)都知道,目前來(lái)說(shuō)主流的Rust-RPC框架和實(shí)際定義的RPC框架還是有著很大的差別。我們先看一下隔壁Java是如何實(shí)現(xiàn)的,就拿本項(xiàng)目Java版本

    2024年01月23日
    瀏覽(54)
  • Rpc服務(wù)消費(fèi)者(Rpc服務(wù)調(diào)用者)實(shí)現(xiàn)思路

    前面幾節(jié)說(shuō)到Rpc消費(fèi)者主要通過(guò)UserServiceRPc_Stub這個(gè)protobuf幫我們生成的類(lèi)來(lái)實(shí)現(xiàn),上代碼回顧一下 UserServiceRpc_Stub可以看做是一個(gè)給用戶(hù)提供rpc遠(yuǎn)程調(diào)用的代理類(lèi),這里面有rpcclient和rpcserver約定好的遠(yuǎn)程方法Login,Login方法是調(diào)用了一個(gè)channel_的callMethod方法,那么聯(lián)想到其他服

    2024年02月14日
    瀏覽(19)
  • C++ 簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊

    C++ 簡(jiǎn)單實(shí)現(xiàn)RPC網(wǎng)絡(luò)通訊

    ? ? ? ? RPC是遠(yuǎn)程調(diào)用系統(tǒng)簡(jiǎn)稱(chēng),它允許程序調(diào)用運(yùn)行在另一臺(tái)計(jì)算機(jī)上的過(guò)程,就像調(diào)用本地的過(guò)程一樣。RPC 實(shí)現(xiàn)了網(wǎng)絡(luò)編程的“過(guò)程調(diào)用”模型,讓程序員可以像調(diào)用本地函數(shù)一樣調(diào)用遠(yuǎn)程函數(shù)。最近在做的也是遠(yuǎn)程調(diào)用過(guò)程,所以通過(guò)重新梳理RPC來(lái)整理總結(jié)一下。 ?

    2023年04月08日
    瀏覽(30)
  • 從零開(kāi)始實(shí)現(xiàn)一個(gè)RPC框架(五)

    這是系列最后一篇文章了,最后我們來(lái)為我們的rpc框架實(shí)現(xiàn)一個(gè)http gateway。這個(gè)功能實(shí)際上受到了rpcx的啟發(fā),基于這種方式實(shí)現(xiàn)一個(gè)簡(jiǎn)單的類(lèi)似service mesh中的sidecar。 http gateway可以接收來(lái)自客戶(hù)端的http請(qǐng)求并將其轉(zhuǎn)換為rpc請(qǐng)求然后交給服務(wù)端處理,再將服務(wù)端處理過(guò)后的結(jié)果

    2024年04月12日
    瀏覽(30)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包