example/

directory
v1.2.0 Latest Latest
Warning

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

Go to latest
Published: Nov 25, 2025 License: MIT

README

example

hephfx/micro实战

gen code for Go

执行如下命令实现go代码生成

sh bin/go-generate.sh

一般来说,生成的pb代码,建议放在独立git仓库中,方便集中式管理和维护。

start running

  1. 先运行命令go run cmd/rpc/main.go启动服务端。
  2. 接着执行go run clients/go/main.go运行客户端。

grpc gateway

  1. 需要在proto文件添加如下核心配置
import "google/api/annotations.proto";

// Greeter service 定义开放调用的服务
service Greeter {
    rpc SayHello (HelloReq) returns (HelloReply){
        option (google.api.http) = {
            get: "/v1/say/{id}"
        };
    };
}
  1. 执行go run cmd/gateway/main.go即可(启动之前,需要先启动rpc服务端)。

grpc grpcurl tools

  1. 安装grpcurl工具
brew install grpcurl

如果你本地安装了golang,那可以直接运行如下命令,安装grpcurl工具

go install github.com/fullstorydev/grpcurl/cmd/grpcurl@latest
  1. 验证grpc service启动的效果
# 50051 是grpc微服务的端口
grpcurl -plaintext 127.0.0.1:50051 list

执行上面的命令,输出结果如下:

Hello.Greeter
grpc.reflection.v1.ServerReflection
grpc.reflection.v1alpha.ServerReflection
  1. 查看proto文件定义的所有方法
grpcurl -plaintext 127.0.0.1:50051 describe Hello.Greeter

输出结果如下:

Hello.Greeter is a service:
service Greeter {
  rpc SayHello ( .Hello.HelloReq ) returns ( .Hello.HelloReply ) {
    option (.google.api.http) = { get: "/v1/say/{name}" };
  }
}
  1. 查看请求参数定义
grpcurl -plaintext 127.0.0.1:50051 describe Hello.HelloReq

输出结果如下:

Hello.HelloReq is a message:
message HelloReq {
  string name = 1;
}
  1. 请求grpc方法
grpcurl -d '{"name":"daheige"}' -plaintext 127.0.0.1:50051 Hello.Greeter.SayHello

返回结果如下:

{
  "message": "hello,daheige"
}

gen and run nodejs code

  1. install grpc tools
sh bin/node-grpc-tools.sh
  1. gen nodejs code
sh bin/nodejs-gen.sh

输出结果如下:

Generating codes...

generating nodejs stubs...
generating nodejs code success

Generate codes successfully!
  1. install nodejs package
cd clients/nodejs && npm install
  1. run node client
node clients/nodejs/app.js

node-client-run.png

only start grpc server

// 创建grpc微服务实例
	s := micro.NewService(
		fmt.Sprintf("0.0.0.0:%d", grpcPort),
		
		micro.WithLogger(micro.LoggerFunc(log.Printf)),
		micro.WithShutdownTimeout(5*time.Second),
		micro.WithEnablePrometheus(), // prometheus interceptor

		micro.WithEnableRequestValidator(), // request validator interceptor
		// 使用自定义请求拦截器
		micro.WithUnaryInterceptor(interceptor.AccessLog),
		micro.WithShutdownFunc(func() {
			time.Sleep(3 * time.Second) // mock long operations
			log.Println("grpc server shutdown")
		}),
	)

start grpc and http gateway use one port

// ...
grpcPort := 50051
// 创建grpc微服务实例
s := micro.NewService(
    fmt.Sprintf("0.0.0.0:%d", grpcPort),
    
    // start grpc and http gateway use one address
    micro.WithEnableGRPCShareAddress(),
    micro.WithHandlerFromEndpoints(pb.RegisterGreeterHandlerFromEndpoint), // register http endpoint
    
    micro.WithLogger(micro.LoggerFunc(log.Printf)),
    micro.WithShutdownTimeout(5*time.Second),
    micro.WithEnablePrometheus(), // prometheus interceptor
    
    micro.WithEnableRequestValidator(), // request validator interceptor
	
    // 使用自定义请求拦截器
    micro.WithUnaryInterceptor(interceptor.AccessLog),
    micro.WithShutdownFunc(func() {
    time.Sleep(3 * time.Second) // mock long operations
    log.Println("grpc server shutdown")
    }),
)
// ...

请求接口如下:

curl 'http://localhost:50051/v1/say/daheige'

运行结果如下:

{"message":"hello,daheige"}

start grpc and http gateway use different address

// ...
grpcPort := 50051
// 创建grpc微服务实例
s := micro.NewService(
    fmt.Sprintf("0.0.0.0:%d", grpcPort),

    micro.WithGRPCHTTPAddress(fmt.Sprintf("0.0.0.0:%d", 8080)),
    micro.WithHandlerFromEndpoints(pb.RegisterGreeterHandlerFromEndpoint), // register http endpoint
    
    micro.WithLogger(micro.LoggerFunc(log.Printf)),
    micro.WithShutdownTimeout(5*time.Second),
    micro.WithEnablePrometheus(), // prometheus interceptor
    
    micro.WithEnableRequestValidator(), // request validator interceptor
	
    // 使用自定义请求拦截器
    micro.WithUnaryInterceptor(interceptor.AccessLog),
    micro.WithShutdownFunc(func() {
    time.Sleep(3 * time.Second) // mock long operations
    log.Println("grpc server shutdown")
    }),
)
// ...

Directories

Path Synopsis
clients
go command
go/pb
Package pb is a reverse proxy.
Package pb is a reverse proxy.
cmd
gateway command
rpc command
internal
Package pb is a reverse proxy.
Package pb is a reverse proxy.
tools
validator_gen command

Jump to

Keyboard shortcuts

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