rpc

package
v1.21.6 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 9, 2023 License: MIT Imports: 5 Imported by: 0

Documentation

Overview

Package rpcは、オブジェクトのエクスポートされたメソッドに、ネットワークやその他のI/O接続を通じてアクセスする機能を提供します。サーバーはオブジェクトを登録し、オブジェクトのタイプ名に基づいてサービスとして表示されるようにします。登録後、オブジェクトのエクスポートされたメソッドはリモートからアクセス可能になります。サーバーは、異なるタイプの複数のオブジェクト(サービス)を登録することができますが、同じタイプの複数のオブジェクトを登録することはエラーです。

以下の条件を満たすメソッドのみがリモートアクセス可能になります。それ以外のメソッドは無視されます:

  • メソッドの型がエクスポートされていること。
  • メソッドがエクスポートされていること。
  • メソッドが2つの引数を持ち、両方の引数がエクスポートされている(または組み込み)型であること。
  • メソッドの2番目の引数がポインタであること。
  • メソッドが戻り値としてerror型を持つこと。

要するに、メソッドは次のようなスキーマである必要があります。

func (t *T) MethodName(argType T1, replyType *T2) error

ここで、T1とT2はencoding/gobでマーシャリングできる型です。 これらの要件は、異なるコーデックが使用されている場合でも適用されます。 (将来的には、カスタムコーデックに対してこれらの要件は緩和されるかもしれません。)

メソッドの最初の引数は呼び出し元から提供される引数を表し、 2番目の引数は呼び出し元に返される結果パラメータを表します。 メソッドの戻り値がnilでない場合、それはクライアントがerrors.Newによって作成されたかのようにクライアントが確認する文字列として送り返されます。 エラーが返された場合、応答パラメータはクライアントに送り返されません。

サーバーは、ServeConnを呼び出すことによって単一の接続上のリクエストを処理することができます。また、通常はネットワークリスナーを作成し、Acceptを呼び出すか、HTTPリスナーの場合はHandleHTTPとhttp.Serveを呼び出します。

サービスを使用するためには、クライアントは接続を確立し、その後、接続上でNewClientを呼び出します。ダイヤル(DialHTTP)という便利な関数は、生のネットワーク接続(HTTP接続)に対して両方の手順を実行します。結果として得られるClientオブジェクトには、サービスとメソッドを指定するための2つのメソッド、CallとGoがあり、引数を含むポインタと結果パラメータを受け取るポインタを指定します。

Callメソッドは、リモート呼び出しが完了するまで待機し、 Goメソッドは非同期に呼び出しを開始し、Call構造体のDoneチャネルを使用して完了をシグナルします。

明示的なコーデックが設定されていない場合、データの転送にはencoding/gobパッケージが使用されます。

以下にシンプルな例を示します。サーバーはArithタイプのオブジェクトをエクスポートしたい場合です。

package server

import "errors"

type Args struct {
	A, B int
}

type Quotient struct {
	Quo, Rem int
}

type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error {
	*reply = args.A * args.B
	return nil
}

func (t *Arith) Divide(args *Args, quo *Quotient) error {
	if args.B == 0 {
		return errors.New("divide by zero")
	}
	quo.Quo = args.A / args.B
	quo.Rem = args.A % args.B
	return nil
}

サーバーの呼び出し(HTTPサービスの場合):

arith := new(Arith)
rpc.Register(arith)
rpc.HandleHTTP()
l, err := net.Listen("tcp", ":1234")
if err != nil {
	log.Fatal("listen error:", err)
}
go http.Serve(l, nil)

この時点で、クライアントは"Arith"というサービスとそのメソッド"Arith.Multiply"、"Arith.Divide"を見ることができます。呼び出すためには、クライアントはまずサーバーにダイヤルします。

client, err := rpc.DialHTTP("tcp", serverAddress + ":1234")
if err != nil {
	log.Fatal("dialing:", err)
}

そして、リモート呼び出しを行うことができます。

// 同期呼び出し
args := &server.Args{7,8}
var reply int
err = client.Call("Arith.Multiply", args, &reply)
if err != nil {
	log.Fatal("arith error:", err)
}
fmt.Printf("Arith: %d*%d=%d", args.A, args.B, reply)

または

// 非同期呼び出し
quotient := new(Quotient)
divCall := client.Go("Arith.Divide", args, quotient, nil)
replyCall := <-divCall.Done	// divCallと等しい
// エラーをチェックし、出力などを行います。

サーバーの実装では、クライアントのためのシンプルで型セーフなラッパーを提供することがよくあります。

net/rpcパッケージは凍結されており、新しい機能は受け付けていません。

Index

Constants

View Source
const (
	// HandleHTTPで使用されるデフォルト値
	DefaultRPCPath   = "/_goRPC_"
	DefaultDebugPath = "/debug/rpc"
)

Variables

View Source
var DefaultServer = NewServer()

DefaultServerは*Serverのデフォルトインスタンスです。

View Source
var ErrShutdown = errors.New("connection is shut down")

Functions

func Accept

func Accept(lis net.Listener)

Acceptはリスナー上で接続を受け付け、各受信された接続に対してDefaultServerにリクエストを処理します。 Acceptはブロックします。通常、呼び出し元はgo文でそれを呼び出します。

func HandleHTTP

func HandleHTTP()

HandleHTTPはRPCメッセージのためのHTTPハンドラをDefaultServerに登録し、DefaultRPCPathにデバッグハンドラを登録します。 通常はgoステートメントでhttp.Serve()を呼び出す必要があります。

func Register

func Register(rcvr any) error

RegisterはレシーバのメソッドをDefaultServerに登録します。

func RegisterName

func RegisterName(name string, rcvr any) error

RegisterNameは、レシーバの具体的な型ではなく、与えられた名前を型として使用します。Registerと同様の動作です。

func ServeCodec

func ServeCodec(codec ServerCodec)

ServeCodecはServeConnと似ていますが、指定されたコーデックを使用して リクエストをデコードし、レスポンスをエンコードします。

func ServeConn

func ServeConn(conn io.ReadWriteCloser)

ServeConnはデフォルトサーバーを単一の接続上で実行します。 ServeConnは、クライアントが切断するまで接続を処理するまでブロックします。 通常、呼び出し元はgo文でServeConnを呼び出します。 ServeConnは、接続上でgobワイヤーフォーマット(パッケージgobを参照)を使用します。 別のコーデックを使用するには、ServeCodecを使用してください。 同時アクセスに関する情報については、NewClientのコメントを参照してください。

func ServeRequest

func ServeRequest(codec ServerCodec) error

ServeRequest は ServeCodec に似ていますが、単一のリクエストを同期的に処理します。 処理が完了してもコーデックを閉じません。

Types

type Call

type Call struct {
	ServiceMethod string
	Args          any
	Reply         any
	Error         error
	Done          chan *Call
}

CallはアクティブなRPCを表します。

type Client

type Client struct {
	// contains filtered or unexported fields
}

ClientはRPCクライアントを表します。 単一のクライアントに関連付けられている複数の保留中の呼び出しがあり、 クライアントは同時に複数のゴルーチンによって使用される場合があります。

func Dial

func Dial(network, address string) (*Client, error)

Dialは指定されたネットワークアドレスのRPCサーバに接続します。

func DialHTTP

func DialHTTP(network, address string) (*Client, error)

DialHTTPは、デフォルトのHTTP RPCパスで待ち受けている、指定されたネットワークアドレスのHTTP RPCサーバーに接続します。

func DialHTTPPath

func DialHTTPPath(network, address, path string) (*Client, error)

DialHTTPPathは指定したネットワークアドレスとパスでHTTP RPCサーバに接続します。

func NewClient

func NewClient(conn io.ReadWriteCloser) *Client

NewClientは、接続先のサービスセットに対するリクエストを処理するための新しいクライアントを返します。 接続の書き込み側にはバッファが追加されるため、ヘッダとペイロードがまとめて送信されます。

接続の読み込み側と書き込み側はそれぞれ独立してシリアライズされるため、相互ロックは必要ありません。ただし、各半分は同時にアクセスされる可能性があるため、connの実装は同時読み取りや同時書き込みに対して保護する必要があります。

func NewClientWithCodec

func NewClientWithCodec(codec ClientCodec) *Client

NewClientWithCodecは、指定されたコーデックを使用してリクエストをエンコードし、レスポンスをデコードするNewClientと同様です。

func (*Client) Call

func (client *Client) Call(serviceMethod string, args any, reply any) error

Callは指定された関数を呼び出し、その完了を待ち、エラー状態を返します。

func (*Client) Close

func (client *Client) Close() error

Closeは基礎となるコーデックのCloseメソッドを呼び出します。接続がすでに シャットダウン中の場合、ErrShutdownが返されます。

func (*Client) Go

func (client *Client) Go(serviceMethod string, args any, reply any, done chan *Call) *Call

Go invokes the function asynchronously. It returns the Call structure representing the invocation. The done channel will signal when the call is complete by returning the same Call object. If done is nil, Go will allocate a new channel. If non-nil, done must be buffered or Go will deliberately crash.

type ClientCodec

type ClientCodec interface {
	WriteRequest(*Request, any) error
	ReadResponseHeader(*Response) error
	ReadResponseBody(any) error

	Close() error
}

ClientCodecは、RPCセッションのクライアント側において、RPCリクエストの書き込みとRPCレスポンスの読み取りを実装します。 クライアントはWriteRequestを呼び出して接続にリクエストを書き込み、 ReadResponseHeaderとReadResponseBodyをペアで呼び出してレスポンスを読み込みます。 接続が終了したら、クライアントはCloseを呼び出します。 ReadResponseBodyは、nilの引数で呼び出されることがあり、レスポンスの本文を読み取り、その後破棄するように強制することができます。 同時アクセスに関する情報については、NewClientのコメントを参照してください。

type Request

type Request struct {
	ServiceMethod string
	Seq           uint64
	// contains filtered or unexported fields
}

RequestはRPC呼び出しの前に書かれるヘッダーです。内部で使用されますが、ネットワークトラフィックを分析する際などデバッグの支援のためにここで記述されています。

type Response

type Response struct {
	ServiceMethod string
	Seq           uint64
	Error         string
	// contains filtered or unexported fields
}

Responseは、すべてのRPCの戻り値の前に書かれるヘッダです。内部で使用されますが、ネットワークトラフィックを分析する際など、デバッグの支援としてここで文書化されています。

type Server

type Server struct {
	// contains filtered or unexported fields
}

ServerはRPCサーバーを表します。

func NewServer

func NewServer() *Server

NewServerは新しいServerを返します。

func (*Server) Accept

func (server *Server) Accept(lis net.Listener)

Acceptはリスナー上で接続を受け入れ、各受信接続のリクエストを処理します。 Acceptはリスナーがnon-nilのエラーを返すまでブロックされます。通常、呼び出し元はgoステートメントでAcceptを呼び出します。

func (*Server) HandleHTTP

func (server *Server) HandleHTTP(rpcPath, debugPath string)

HandleHTTPはrpcPathでRPCメッセージのためのHTTPハンドラを登録し、debugPathではデバッグハンドラを登録します。 通常はGoステートメント内でhttp.Serve()を呼び出す必要があります。

func (*Server) Register

func (server *Server) Register(rcvr any) error

Registerは、以下の条件を満たすレシーバーのメソッドのセットをサーバーに公開します:

  • エクスポートされた型のエクスポートされたメソッド
  • 2つの引数、両方がエクスポートされた型
  • 2番目の引数がポインタであること
  • エラー型の1つの戻り値

レシーバーがエクスポートされた型でないか、適切なメソッドがない場合は、エラーを返します。また、エラーをパッケージlogを使用してログに記録します。 クライアントは "Type.Method" の形式の文字列を使用して各メソッドにアクセスします。ここで、Typeはレシーバーの具体的な型です。

func (*Server) RegisterName

func (server *Server) RegisterName(name string, rcvr any) error

RegisterNameは、レシーバの具体的な型の代わりに、指定された名前を使用して型を登録します。

func (*Server) ServeCodec

func (server *Server) ServeCodec(codec ServerCodec)

ServeCodecは、指定されたコーデックを使用してリクエストをデコードし、レスポンスをエンコードするためにServeConnと似ています。

func (*Server) ServeConn

func (server *Server) ServeConn(conn io.ReadWriteCloser)

ServeConnは単一の接続上でサーバーを実行します。 ServeConnはクライアントが切断するまで接続をサーブし続け、ブロックします。 通常、呼び出し元はgo文でServeConnを呼び出します。 ServeConnは接続上でgobワイヤフォーマット(package gobを参照)を使用します。 別のコーデックを使用するには、ServeCodecを使用してください。 同時アクセスに関する情報については、NewClientのコメントを参照してください。

func (*Server) ServeHTTP

func (server *Server) ServeHTTP(w http.ResponseWriter, req *http.Request)

ServeHTTPはRPCリクエストに答えるためのhttp.Handlerを実装します。

func (*Server) ServeRequest

func (server *Server) ServeRequest(codec ServerCodec) error

ServeRequestはServeCodecと似ていますが、1つのリクエストを同期的に処理します。 完了時にコーデックを閉じません。

type ServerCodec

type ServerCodec interface {
	ReadRequestHeader(*Request) error
	ReadRequestBody(any) error
	WriteResponse(*Response, any) error

	// Close can be called multiple times and must be idempotent.
	Close() error
}

ServerCodecはRPCセッションのサーバー側でのRPCリクエストの読み取りとRPCレスポンスの書き込みを実装します。 サーバーはReadRequestHeaderとReadRequestBodyをペアで呼び出して接続からリクエストを読み取り、WriteResponseを呼び出してレスポンスを書き込みます。 サーバーは接続が終了したらCloseを呼び出します。ReadRequestBodyはnilの引数で呼び出されることがあり、リクエストの本文を読み取って破棄するためのものです。 同時アクセスに関する情報については、NewClientのコメントを参照してください。

type ServerError

type ServerError string

ServerErrorは、RPC接続のリモート側から返されたエラーを表します。

func (ServerError) Error

func (e ServerError) Error() string

Directories

Path Synopsis
Package jsonrpc はRPCパッケージのためのJSON-RPC 1.0のClientCodecとServerCodecを実装します。
Package jsonrpc はRPCパッケージのためのJSON-RPC 1.0のClientCodecとServerCodecを実装します。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL