牛丼一筋の心意気で学ぶ、Go言語とgRPCによる高速RPC通信


牛丼一筋の心意気で学ぶ、Go言語とgRPCによる高速RPC通信

grpc/grpc-go

2025-09-15

一言でいうと、「Go言語でサクッとマイクロサービスを構築するための、うまい、早い、安いRPCフレームワーク」です。

RPC(Remote Procedure Call)とは、ネットワーク越しに別々のプログラムの関数を呼び出す仕組みのこと。簡単に言えば、サーバーの機能(関数)を、クライアントからまるで自分のプログラム内の関数のように呼び出せるようにしてくれる技術です。

このRPCを、Googleが開発した新しい技術基盤であるgRPCを使って実現するのが、この grpc-go です。HTTP/2という最新の通信プロトコルをベースにしているため、従来のRPCよりも、高速かつ効率的な通信が可能です。

牛丼の三拍子に例えて、そのメリットを解説します。

型安全なAPI設計

gRPCでは、Protocol Buffers (通称Protobuf) という仕組みを使って、サーバーとクライアント間でやり取りするデータの型や、呼び出せる関数を厳密に定義します。

これにより、「この関数はどんな引数を必要とするのか」「戻り値の型は何か」が明確になり、APIの設計ミスや、プログラムのバグを減らすことができます。

まるで、お品書きがしっかりした牛丼屋さんに入ったような安心感ですね。

多言語対応

Protobufは、Go言語だけでなく、Java、Python、C++など、多くの言語に対応しています。

そのため、クライアントとサーバーで異なる言語を使って開発する、といったことが簡単にできます。

例えば、「WebフロントエンドはJavaScript、バックエンドはGo言語」という構成でも、スムーズに連携できます。

HTTP/2による高速通信

gRPCはHTTP/2をベースにしています。これによって、一つのTCP接続で複数のリクエストを同時に送受信したり、ヘッダーを圧縮したりすることができます。

従来のREST API (HTTP/1.1) に比べて、特に通信量が多いマイクロサービス間の通信で、圧倒的なパフォーマンスを発揮します。

まるで、注文したら瞬時に牛丼が出てくるような感覚です。

自動生成されるコード

Protobufで定義した内容をもとに、Go言語のクライアント・サーバーコードを自動生成してくれます。

自分でゴリゴリと通信処理を書く必要がないので、開発スピードが格段に上がります。

面倒なルーチンワークは機械に任せて、本質的なビジネスロジックの開発に集中できます。

軽量な通信プロトコル

Protobufは、JSONやXMLに比べて、送受信するデータサイズが非常に小さいです。

これは、特にクラウド環境など、通信量に応じて費用が発生するような環境で、コスト削減に繋がります。

ネットワーク帯域の節約にもなるので、サーバーやインフラのコストも抑えることができます。

では、実際に簡単な「Greeter」サービスのサンプルを一緒に作ってみましょう。

まず、protoc (Protocol Buffersコンパイラ) と、protoc-gen-go (Go言語用プラグイン) をインストールします。

# プロトコルバッファコンパイラのインストール(お使いのOSに合わせて)
# macOSの場合
brew install protobuf

# Go言語用プラグインのインストール
go install google.golang.org/protobuf/cmd/protoc-gen-go@latest
go install google.golang.org/grpc/cmd/protoc-gen-go-grpc@latest

protoというディレクトリを作成し、その中に greeter.proto というファイルを作成します。ここで、サービスとデータの型を定義します。

// proto/greeter.proto

syntax = "proto3";

option go_package = "./;greeter";

package greeter;

// サービスを定義
service Greeter {
  // RPCメソッドを定義
  rpc SayHello (HelloRequest) returns (HelloReply) {}
}

// リクエストのメッセージを定義
message HelloRequest {
  string name = 1;
}

// レスポンスのメッセージを定義
message HelloReply {
  string message = 1;
}

service Greeter で、Greeter というサービスを定義しています。

rpc SayHello で、SayHello というRPCメソッドを定義しています。

HelloRequestHelloReply で、それぞれリクエストとレスポンスのデータの型を定義しています。

greeter.proto をもとに、Go言語のコードを自動生成します。

protoc --go_out=./ --go_opt=paths=source_relative \
       --go-grpc_out=./ --go-grpc_opt=paths=source_relative \
       proto/greeter.proto

このコマンドを実行すると、greeter.pb.gogreeter_grpc.pb.go という2つのファイルが生成されます。これらは、自分で書く必要のない、Go言語でgRPCを扱うためのひな形コードです。

次に、生成されたコードを使ってサーバーを実装します。

// server/main.go

package main

import (
	"context"
	"log"
	"net"

	"google.golang.org/grpc"
	pb "your-module-name/greeter" // ここはご自身のモジュール名に合わせて変更してください
)

// serverはGreeterサービスを実装する構造体
type server struct {
	pb.UnimplementedGreeterServer
}

// SayHelloはgRPCのメソッドとして定義
func (s *server) SayHello(ctx context.Context, in *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Printf("Received: %v", in.GetName())
	return &pb.HelloReply{Message: "Hello " + in.GetName()}, nil
}

func main() {
	lis, err := net.Listen("tcp", ":50051")
	if err != nil {
		log.Fatalf("failed to listen: %v", err)
	}
	s := grpc.NewServer()
	pb.RegisterGreeterServer(s, &server{})
	log.Printf("server listening at %v", lis.Addr())
	if err := s.Serve(lis); err != nil {
		log.Fatalf("failed to serve: %v", err)
	}
}

最後に、サーバーに接続してRPCを呼び出すクライアントを作成します。

// client/main.go

package main

import (
	"context"
	"log"
	"os"
	"time"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
	pb "your-module-name/greeter" // ここはご自身のモジュール名に合わせて変更してください
)

func main() {
	conn, err := grpc.Dial(":50051", grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatalf("did not connect: %v", err)
	}
	defer conn.Close()
	c := pb.NewGreeterClient(conn)

	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
	defer cancel()
	
	r, err := c.SayHello(ctx, &pb.HelloRequest{Name: "Goopher"})
	if err != nil {
		log.Fatalf("could not greet: %v", err)
	}
	log.Printf("Greeting: %s", r.GetMessage())
}

grpc-go は、Go言語を使ってマイクロサービスを構築する上で、うまい、早い、安いという三拍子が揃った非常に強力なツールです。

うまい
Protobufによる厳密な型定義で、設計の美しさとメンテナンス性を向上。

早い
HTTP/2とコード自動生成で、パフォーマンスと開発スピードを両立。

安い
軽量なプロトコルで、通信コストを削減。


grpc/grpc-go




妹が教える!エンジニアのためのOllama活用術

ねえねえ、最近流行りの「Ollama」って知ってる?お兄ちゃんの好きそうな、めちゃくちゃ便利なツールなんだよ!Ollamaはね、お兄ちゃんのパソコンで、いろんなAIモデルを簡単に動かせるようにしてくれるすごーいツールなんだ!今までだと、AIモデルを使おうと思ったら、いろいろ難しそうな設定をしなきゃいけなかったり、パソコンの性能が足りなかったりしたんだけど、Ollamaを使えば、そんな心配はほとんどいらなくなるんだって!


Go言語でCLIを楽しく!Bubble Tea入門

やぁ、ソフトウェアエンジニアの皆さん!今日は、Go言語を使ったCLI開発を劇的に楽しくしてくれるフレームワーク「Bubble Tea」について、飲み比べコント風にご紹介しますね。このお酒、見た目は素朴な「ターミナル画面」なんだけど、一口飲むと「わ、これすごい!」ってなるんですよ。


ソフトウェアエンジニア必見!Cobraで実現するプロ級Go CLIツール

「コマンドの解析が面倒だ…」 「ヘルプメッセージをいちいち書くのが大変…」 「サブコマンドをうまく管理できない…」もう大丈夫です!そんな悩みとは今日でサヨナラ。 今回は、あなたの開発を劇的にラクにする、魔法のツール「Cobra」をご紹介します!


Go言語エンジニアのためのWhatsApp連携術:whatsmeow徹底解説

whatsmeow は、Go言語(Golang)で書かれた、WhatsApp Web のマルチデバイス API を扱うためのライブラリです。「マルチデバイス API」というのがポイントで、スマートフォンがオフラインでも機能する、新しいWhatsAppの仕組みに対応しています。つまり、これを使えば、プログラムからWhatsAppのメッセージを送受信したり、アカウント情報を管理したりといった操作が可能になります。


【脱Electron】Go製TUIクライアント「Discordo」が開発環境を最適化する理由

Discordoは、Discordのクライアントをターミナル上(TUI Terminal User Interface)で動作させるための軽量かつセキュアなソフトウェアです。言語・環境 Go言語 (Golang) で書かれており、Linux環境での利用が想定されています。


【爆速】autobrr/qui で実現する、qBittorrent 複数管理の極上体験

autobrr/qui を一言で表すなら、まさに「職人が注いだ、雑味のない生ビール」のようなツールです。余計なものを削ぎ落とし、必要な機能だけを最高速で提供してくれます。エンジニア的な視点で見ると、このツールがいかに洗練されているかが分かります。


【エンジニア向け】Infisicalで秘密情報も体重もスマートに管理!

ダイエット中のエンジニアさん、お疲れ様です!食事制限、運動、そしてコード. .. 毎日やることがいっぱいですよね。でも、ちょっと待ってください!あなたのコードの中にも、ひっそりと隠れている「秘密」はありませんか?そう、APIキーとかデータベースのパスワードとか


Dockerだけじゃない!Moby Projectで自作コンテナ環境を構築する

Moby Project ってのはな、一言で言うと「コンテナをベースにしたシステムを作るための、オープンソースのツールキット」だ。例えるなら、俺たちが事件現場で使う道具一式、例えば手錠とか懐中電灯とか、そういうのを全部まとめて提供してくれるようなもんだな。


GOWA参上!WhatsApp自動化で開発効率を爆上げだ!

悪の組織に立ち向かう戦隊ヒーローのように、私たちソフトウェアエンジニアも日夜、様々な課題と戦っています。その中でも「WhatsAppの自動化」は、多くの人が直面する難題の一つでした。しかし、GOWAという強力な味方が現れました!GOWAは、Go言語で開発されたWhatsApp REST APIです。簡単に言うと、あなたのプログラムからWhatsAppを操作できるようにするツールですね。これまでのWhatsApp自動化は、ブラウザを操作したり、非公式なライブラリを使ったりと、不安定なものが多かったんです。でもGOWAは、公式のWhatsApp Webマルチデバイス機能に対応しているので、安定性が格段に向上しました!


メディアサーバーの決定版!bluenviron/mediamtxで君のプロジェクトにモジョを注入!

オースティン・パワーズだぜ!今回は君たちソフトウェアエンジニアの悩みを解決する、とびっきりクールなツールを紹介するぜ!その名も「bluenviron/mediamtx」!君たちのプロジェクトに、こう、なんていうか…「映像と音声のセクシーな魔法」をかけることができるんだ!この「mediamtx」は、まるで僕のモジョみたいに、あらゆる種類のメディアストリームを自由自在に操れる、まさに究極のメディアサーバー&プロキシなんだ!