tRPC安装使用【1 基础入门】

tRPC入门

全部代码(欢迎star😊):

  • https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-trpc/01-simple

概念

官网地址:https://trpc.group/zh/docs/languages/go/basics_tutorial/

  1. 定义:
    tRPC是基于插件化理念设计的一款支持多语言、高性能的RPC开发框架,整体设计遵循以下原则:
  • 简单:用户基于框架进行服务开发简单方便;
  • 高性能:框架具备高性能,能适用互联网海量访问场景;
  • 插件化:框架在架构设计和具体实现上进行分层和模块化,各个核心模块可拔插,并能够独立演进;
  1. 应用场景:
  • 搭建多个端口支持多个协议(一个端口只能对应一个协议)的服务(tRPC/HTTP(s)/gRPC等),并能同步/异步处理客户端请求;
  • 以同步、异步、单向的方式访问各种协议后端服务(tRPC/HTTP(s)/gRPC等),调用各种存储系统(redis等);
  • 流式RPC编程,目前支持tRPC流式、gRPC流式、HTTP流式等,实现类似Push、文件上传/下载、AI类等流式应用服务;
  • 插件化支持各种协议和对接服务治理系统,比如:开发自定义的协议、对接业务使用的各种名字服务/监控系统/调用链系统/配置系统/日志系统等,方便服务互通和服务运营
  1. 特点:
  • 跨语言:基于Protocol Buffers来实现跨语言之间的服务通信;
  • 多通信协议:支持多种通信协议,能够与不同框架进行互通(比如gRPC);
  • 流式rpc:支持流式RPC,更好地适用于大文件上传/下载、消息Push、AI类语音识别/视频理解等多种应用场景;
  • 丰富插件生态:提供大量对接业界微服务组件的插件(比如Consul/Promethues/OpenTelemetry等),方便用户构建适合自己的服务治理体系;
  • 可扩展性:基于框架插件化的设计,用户可以进行二次开发来扩展框架能力,比如:RPC请求参数校验、鉴权、请求录制等;
  • 流控和过载保护:提供多种应用场景下的流量控制和过载保护插件,防止服务因为访问突增造成过载而不可用;

安装tRPC

# 安装trpc
go install trpc.group/trpc-go/trpc-cmdline/trpc@latest

在这里插入图片描述

如果网络环境不好,可以尝试切换代理:

go env -w GOPROXY=https://goproxy.cn,direct
go env -w GOPROXY=https://goproxy.io,direct
go env -w GOPROXY=https://goproxy.baidu.com/ 
go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/

观察是否安装成功:

trpc version

#打印版本号就是成功了
trpc-group/trpc-cmdline version: v1.0.9

在这里插入图片描述

安装protoc

官网地址:https://github.com/protocolbuffers/protobuf/releases/

因为我是win64系统,所以直接选择win64.zip这个包即可:
在这里插入图片描述

下载之后配置环境变量。

  1. 解压后,拷贝protoc的bin目录路径,配置到windows环境变量:
    在这里插入图片描述
  2. 设置-关于-高级系统设置
    在这里插入图片描述
  3. 高级-环境变量
    在这里插入图片描述
  4. 系统变量-编辑-将拷贝的protoc bin路径添加到Path下:
    在这里插入图片描述

在这里插入图片描述

配置成功后,在终端输入下面命令,观察是否配置成功:

protoc --version

在这里插入图片描述

实战

全部代码(欢迎star😊):

  • https://github.com/ziyifast/ziyifast-code_instruction/tree/main/go-demo/go-trpc/01-simple

编写.proto文件

最终效果:
在这里插入图片描述

初始化go.mod文件:

go mod init github.com/go-demo/go-trpc

helloworld.proto:

syntax = "proto3";

package trpc.helloworld;
option go_package="github.com/go-demo/go-trpc/pb";

service Greeter {
  rpc Hello (HelloRequest) returns (HelloReply) {}
}

message HelloRequest {
  string msg = 1;
}

message HelloReply {
  string msg = 1;
}

执行trpc create命令生成pb、trpc等文件

进入helloworld.proto文件所在位置,执行如下命令:

trpc create -p helloworld.proto --rpconly --nogomod --mock=false

在这里插入图片描述

执行成功:

在这里插入图片描述

// 安装依赖
go mod tidy

编写服务端:server/main.go&server/trpc_go.yaml

server/main.go:

服务端具体处理逻辑

package main

import (
	"context"
	"github.com/go-demo/go-trpc/pb"
	"trpc.group/trpc-go/trpc-go"
	"trpc.group/trpc-go/trpc-go/log"
)

func main() {
	//设置server配置文件路径,默认在./trpc_go.yaml
	trpc.ServerConfigPath = "E:\\Go\\GoPro\\src\\go_code\\ziyifast-code_instruction\\go-demo\\go-trpc\\server\\trpc_go.yaml"
	s := trpc.NewServer()
	pb.RegisterGreeterService(s, &Greeter{})
	if err := s.Serve(); err != nil {
		log.Error(err)
	}
}

type Greeter struct{}

// Hello API
// 1. 接受client请求并打印
// 2. 拼接Hello后作为响应返回给client
func (g Greeter) Hello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
	log.Infof("got hello request: %s", req.Msg)
	return &pb.HelloReply{Msg: "Hello " + req.Msg + "!"}, nil
}

trpc_go.yaml:

服务端配置文件

server:
  service:
    - name: trpc.helloworld
#      监听地址
      ip: 127.0.0.1
#      服务监听端口
      port: 8000

编写客户端:client/main.go

client/main.go

package main

import (
	"context"
	"github.com/go-demo/go-trpc/pb"

	"trpc.group/trpc-go/trpc-go/client"
	"trpc.group/trpc-go/trpc-go/log"
)

func main() {
	//创建客户端,并请求8080端口的服务
	c := pb.NewGreeterClientProxy(client.WithTarget("ip://127.0.0.1:8000"))
	//向服务端发送请求: world
	rsp, err := c.Hello(context.Background(), &pb.HelloRequest{Msg: "world"})
	if err != nil {
		log.Error(err)
	}
	//打印服务端返回结果
	log.Info(rsp.Msg)
}

运行

在这里插入图片描述

拓展: proto文件详细介绍

syntax:指定版本

​ syntax用于制定protoc的版本,proto2或proto3,新版本proto3中必填。

message:定义消息结构,字段规则、消息号、嵌套消息、服务定义

protobuf中定义一个消息类型式是通过关键字 message字段指定的。消息就是需要传输的数据格式的定义message关键字 类似于C++中的class,JAVA中的class,go中的struct。
在消息中承载的数据分别对应于每一个字段,其中每个字段都有一个名字和一种类型个proto文件中可以定义多个消息类型。

①字段规则:

  • required:消息体中必填字段,不设置会导致编码异常。在protobuf2中使用,在protobuf3中被删去
  • optional:消息体中可选字段。protobuf3没有了required,optional等说明关键字,都默认为optional
  • repeate:消息体中可重复字段,重复的值的顺序会被保留在go中重复的会被定义为切片。

②消息号:

  • 在消息体的定义中,每个字段都必须要有一个唯一的标识号,标识号是[1,2^29-1]范国内的一个整数

③嵌套消息:

可以在其他消息类型中定义、使用消息类型,在下面的例子中,person消息就定义在Personlnfo消息内如:

message PersonInfo{
	message Person{
		string name = 1;
		int32 height =2;
		repeated int32 weight = 3;
	}
	repeated Person info = 1;

}

如果要在它的父消息类型的外部重用这个消息类型,需要Personlnfo.Person的形式使用它,如:

message PersonMessage{
	PersonInfo.Person info = 1;
}

④服务定义

​ 如果想要将消息类型用在RPC系统中,可以在.proto文件中定义一个RPC服务接口,protocol buffer编译器将会根据所选择的不同语言生成服务接口代码及存根。

service $earchService{
# rpc 服务函数名 ()返回(返回参)
	rpc Search(SearchRequest) returns (SearchResponse)
}

参考文章:
https://trpc.group/zh/docs/what-is-trpc/introduction/
https://blog.youkuaiyun.com/weixin_52534218/article/details/134820179

### trpc 在 Java 中的使用场景与适用情况分析 #### 1. trpc 的 Java 支持概述 trpc 是一个高性能、可扩展的分布式 RPC 框架,适用于构建微服务架构中的服务间通信[^4]。尽管 trpc 最初可能以 C++ 和 Go 语言为主开发,但其多语言支持特性也使得 Java 成为其重要的目标语言之一。通过 trpc,Java 开发者可以实现高效的服务间调用,并利用框架提供的负载均衡、链路追踪等功能。 #### 2. 使用场景分析 以下是 trpc 在 Java 中的主要使用场景: - **微服务架构中的服务间通信** 在微服务架构中,服务间的高效通信是关键需求。trpc 提供了基于 HTTP/2 的协议支持以及高效的序列化机制(如 Protobuf),能够显著提升服务间通信的性能和可靠性。 - **高并发环境下的性能优化** 对于需要处理高并发请求的应用场景,trpc 的线程池管理和异步调用机制可以帮助开发者更好地优化系统性能。例如,在电商或金融领域,trpc 可以用于支付网关、订单服务等核心模块之间的通信。 - **跨语言服务集成** 当系统中存在多种编程语言时,trpc 的多语言支持特性显得尤为重要。Java 服务可以通过 trpc 与其他语言(如 C++ 或 Go)编写的服务无缝交互,从而降低系统复杂度[^3]。 #### 3. 案例分析 以下是一个典型的 trpc 在 Java 中的应用案例: ##### 场景描述 假设有一个电商平台,包含用户服务、商品服务和订单服务三个模块。这些模块分别由不同的团队维护,且部分模块使用 Java 编写,而其他模块可能使用 C++ 或 Go。为了实现模块间的高效通信,平台决定采用 trpc 作为统一的 RPC 框架。 ##### 解决方案 1. **定义服务接口** 使用 Protobuf 定义服务接口文件 `service.proto`,并生成对应的 Java 代码。 ```proto syntax = "proto3"; package example; service UserService { rpc GetUser (UserRequest) returns (UserResponse); } message UserRequest { int32 id = 1; } message UserResponse { string name = 1; string email = 2; } ``` 2. **实现服务端逻辑** 在 Java 中实现 `UserService` 接口。 ```java import example.UserServiceGrpc; import example.UserServiceOuterClass; public class UserServiceImpl extends UserServiceGrpc.UserServiceImplBase { @Override public void getUser(UserServiceOuterClass.UserRequest request, io.grpc.stub.StreamObserver<UserServiceOuterClass.UserResponse> responseObserver) { String name = "John Doe"; String email = "john.doe@example.com"; UserServiceOuterClass.UserResponse response = UserServiceOuterClass.UserResponse.newBuilder() .setName(name) .setEmail(email) .build(); responseObserver.onNext(response); responseObserver.onCompleted(); } } ``` 3. **配置客户端调用** 在订单服务中调用用户服务。 ```java import example.UserServiceGrpc; import example.UserServiceOuterClass; public class OrderService { public static void main(String[] args) { ManagedChannel channel = ManagedChannelBuilder.forAddress("localhost", 8080) .usePlaintext() .build(); UserServiceGrpc.UserServiceBlockingStub stub = UserServiceGrpc.newBlockingStub(channel); UserServiceOuterClass.UserRequest request = UserServiceOuterClass.UserRequest.newBuilder() .setId(123) .build(); UserServiceOuterClass.UserResponse response = stub.getUser(request); System.out.println("User Name: " + response.getName()); System.out.println("User Email: " + response.getEmail()); channel.shutdown(); } } ``` #### 4. 优势总结 - **高性能**:通过优化网络传输和序列化过程,trpc 能够在高并发场景下保持稳定的性能表现。 - **易用性**:支持 Protobuf 等常见序列化协议,降低了开发者的学习成本[^5]。 - **灵活性**:提供了丰富的插件机制,便于根据实际需求扩展功能[^6]。 #### 5. 注意事项 - **依赖管理**:在引入 trpc 时,需确保所有相关依赖已正确配置,避免版本冲突问题[^7]。 - **错误处理**:建议为每个服务接口设计详细的错误码体系,以便于定位和排查问题[^8]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值