5. RPC 패키지 사용
RPC 사용
패키지 rpc는 네트워크를 통해 대상에 접근하는 출력 방법을 제공합니다.서버가 대상을 등록해서 서비스로 노출시키면 서비스의 이름은 대상의 유형명입니다.등록하면 대상의 내보내기 방법이 원격으로 접근할 수 있습니다.서비스 측은 여러 종류의 대상(서비스)을 등록할 수 있지만 같은 유형의 여러 대상을 등록하는 것은 잘못된 것이다.
다음과 같은 표준을 충족시키는 방법만 원격 접근에 사용할 수 있고 나머지 방법은 무시될 수 있다. a, 방법은 내보내는 b, 방법은 두 가지 파라미터가 있는데 모두 내보내는 유형이나 내장 유형 c이다. 방법의 두 번째 파라미터는 바늘 d이고 방법은 하나의 error 인터페이스 유형의 반환값 e이며 등록 유형도 다음과 같다.
func (t *T) MethodName(argType T1, replyType *T2) error
1. 일반 RPC 유형
서비스 측 사례:
client, err := rpc.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing:", err)
}
var reply string
err = client.Call("HelloService.Hello", "hello", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
클라이언트 케이스:
type HelloService struct {}
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
func main () {
rpc.RegisterName("HelloService", new(HelloService))
listener, err := net.Listen("tcp", ":1234")
if err != nil {
log.Fatal("ListenTCP error:", err)
}
rpc.Accept(listener)
rpc.HandleHTTP()
}
2, RPC 사용 최적화
RPC와 관련된 응용에서 개발자로서 일반적으로 세 가지 역할이 있다. a, 서버가 RPC 방법을 실현하는 개발자 b, 클라이언트가 RPC 방법을 호출하는 인원 c, 서버와 클라이언트 RPC 인터페이스 규범을 제정하는 디자이너
이제 RPC 코드를 재구성합니다. 2.1. RPC의 인터페이스 규범, 우리는 RPC 서비스의 인터페이스 규범을 세 가지 부분으로 나눈다. a, 서비스 서비스의 이름 b, 서비스 서비스가 실현하고자 하는 상세한 방법 목록 c, 이 유형의 서비스 서비스를 명확하게 등록하는 함수 사례는 다음과 같다.
// , , RPC 【 RPC , Go 】
const HelloServiceName = "path/to/pkg.HelloService"
// Service
type HelloServiceInterface = interface {
Hello(request string, reply *string) error
}
// Service
func RegisterHelloService(svc HelloServiceInterface) error {
return rpc.RegisterName(HelloServiceName, svc)
}
인터페이스 사양이 정해지면 사양에 따라 RPC를 개발할 수 있습니다. 클라이언트 사용자가 RPC 함수를 쉽게 호출할 수 있도록 인터페이스 사양 섹션에 클라이언트에 대한 간단한 패키지를 추가할 수 있습니다.
type HelloServiceClient struct {
*rpc.Client
}
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)
}
서비스 서버 코드 사례:
type HelloService struct {}
func (p *HelloService) Hello(request string, reply *string) error {
*reply = "hello:" + request
return nil
}
func main() {
RegisterHelloService(new(HelloService))
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)
}
go rpc.ServeConn(conn)
}
}
클라이언트 코드 사례:
func main() {
client, err := DialHelloService("tcp", "localhost:1234")
if err != nil {
log.Fatal("dialing:", err)
}
var reply string
err = client.Hello("hello", &reply)
if err != nil {
log.Fatal(err)
}
}
3. 다국어 RPC
표준 라이브러리의 RPC는 기본적으로 Go 언어 특유의 gob 인코딩을 사용하기 때문에 다른 언어에서 Go 언어로 이루어진 RPC 서비스를 호출하는 것은 비교적 어려울 것이다.인터넷의 마이크로 서비스 시대에 모든 RPC와 서비스 사용자는 서로 다른 프로그래밍 언어를 사용할 수 있기 때문에 크로스 언어는 인터넷 시대의 RPC의 가장 중요한 조건이다.RPC의 프레임워크 디자인 덕분에 Go 언어의 RPC도 사실상 크로스 언어 지원을 실현하기 쉽다.
Go 언어의 RPC 프레임워크는 두 가지 특색 있는 디자인이 있다. 하나는 RPC 데이터를 포장할 때 플러그인을 통해 사용자 정의 인코딩과 디코딩을 실현할 수 있다.다른 하나는 RPC가 추상적인 io에 세워진 것이다.ReadWriteCloser 인터페이스 위에 있는 RPC를 서로 다른 통신 프로토콜 위에 설치할 수 있습니다.여기에서 우리는 공식적으로 자체적으로 가지고 있는 넷/rpc/jsonrpc를 통해 크로스 언어의 PPC를 확장하려고 시도할 것이다.
RPC 서비스:
func main() {
rpc.RegisterName("HelloService", new(HelloService))
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)
}
go rpc.ServeCodec(jsonrpc.NewServerCodec(conn))
}
}
RPC 클라이언트:
func main() {
conn, err := net.Dial("tcp", "localhost:1234")
if err != nil {
log.Fatal("net.Dial:", err)
}
client := rpc.NewClientWithCodec(jsonrpc.NewClientCodec(conn))
var reply string
err = client.Call("HelloService.Hello", "hello", &reply)
if err != nil {
log.Fatal(err)
}
fmt.Println(reply)
}
4. Http의 RPC
Go 언어의 RPC 프레임워크는 Http 프로토콜에서 RPC 서비스를 지원합니다.그러나 프레임워크의 http 서비스 역시 내장된 gob 프로토콜을 사용하고 다른 프로토콜을 사용하는 인터페이스를 제공하지 않아 다른 언어에서 접근할 수 없습니다.앞의 예에서 우리는 TCP 프로토콜 위에서 jsonrpc 서비스를 실행하고 nc 명령행 도구를 통해 RPC 방법을 호출하는 데 성공했다.현재 http 프로토콜에서 jsonrpc 서비스를 제공하려고 시도합니다
func main() {
rpc.RegisterName("HelloService", new(HelloService))
http.HandleFunc("/jsonrpc", func(w http.ResponseWriter, r *http.Request) {
var conn io.ReadWriteCloser = struct {
io.Writer
io.ReadCloser
}{
ReadCloser: r.Body,
Writer: w,
}
rpc.ServeRequest(jsonrpc.NewServerCodec(conn))
})
http.ListenAndServe(":1234", nil)
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.