前言

我在使用proto时,定义了一个k8s xx方法,这个方法名称原本是小写,编译出来后,再pb文件中却是大写!

导致实现接口时,你会发现IDEA提示你 确实 实现了该接口。但是,实际上你用HTTP去访问这个接口,它就会报错,告诉你rpc方法不存在。

正文

proto文件定义如下:

syntax = "proto3";package test;option go_package = "./test";import "google/api/annotations.proto";
import "protoc-gen-swagger/options/annotations.proto";
import "validate/validate.proto";service Test{rpc GetK8sPod(RequestPod) returns(ResponsePod){option (google.api.http) = {get: "/getPod"};option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {description : "根据条件查询pod,并返回查询结果"summary : "查询pod"};}
}message RequestPod{option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {json_schema : {title : "RequestPod"description : "查询pod请求"required: []}};string name = 1[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "name",description: "名字"}];string namespace = 2[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "namespace",description: "名空间"}];}message ResponsePod{option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {json_schema : {title : "ResponsePod"description : "返回pod查询结果"required: []}};string data = 1[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "data",description: "数据"}];}

可以看到接口名称是“GetK8sPod” ,请注意此时的”k8s“的“s”是小写,当你编译后,生成出来的pb文件中,接口的名称却是大写的”K8S“,如下:

// Code generated by protoc-gen-micro. DO NOT EDIT.
// source: test.protopackage protoimport (fmt "fmt"_ "github.com/envoyproxy/protoc-gen-validate/validate"_ "github.com/grpc-ecosystem/grpc-gateway/protoc-gen-swagger/options"_ "google.golang.org/genproto/googleapis/api/annotations"proto "google.golang.org/protobuf/proto"math "math"
)import (context "context"api "go-micro.dev/v4/api"client "go-micro.dev/v4/client"server "go-micro.dev/v4/server"
)// Reference imports to suppress errors if they are not otherwise used.
var _ = proto.Marshal
var _ = fmt.Errorf
var _ = math.Inf// Reference imports to suppress errors if they are not otherwise used.
var _ api.Endpoint
var _ context.Context
var _ client.Option
var _ server.Option// Api Endpoints for Test servicefunc NewTestEndpoints() []*api.Endpoint {return []*api.Endpoint{{Name:    "Test.GetK8sPod",Path:    []string{"/getPod"},Method:  []string{"GET"},Handler: "rpc",},}
}// Client API for Test servicetype TestService interface {GetK8SPod(ctx context.Context, in *RequestPod, opts ...client.CallOption) (*ResponsePod, error)
}type testService struct {c    client.Clientname string
}func NewTestService(name string, c client.Client) TestService {return &testService{c:    c,name: name,}
}func (c *testService) GetK8SPod(ctx context.Context, in *RequestPod, opts ...client.CallOption) (*ResponsePod, error) {req := c.c.NewRequest(c.name, "Test.GetK8sPod", in)out := new(ResponsePod)err := c.c.Call(ctx, req, out, opts...)if err != nil {return nil, err}return out, nil
}// Server API for Test servicetype TestHandler interface {GetK8SPod(context.Context, *RequestPod, *ResponsePod) error
}func RegisterTestHandler(s server.Server, hdlr TestHandler, opts ...server.HandlerOption) error {type test interface {GetK8SPod(ctx context.Context, in *RequestPod, out *ResponsePod) error}type Test struct {test}h := &testHandler{hdlr}opts = append(opts, api.WithEndpoint(&api.Endpoint{Name:    "Test.GetK8sPod",Path:    []string{"/getPod"},Method:  []string{"GET"},Handler: "rpc",}))return s.Handle(s.NewHandler(&Test{h}, opts...))
}type testHandler struct {TestHandler
}func (h *testHandler) GetK8SPod(ctx context.Context, in *RequestPod, out *ResponsePod) error {return h.TestHandler.GetK8SPod(ctx, in, out)
}

我们可以看到“TestHandler”中的接口名称为“GetK8SPod”,这个“S”神奇的变为了大写的。所以,在编译proto文件时,可能某一些单词会被编译成大写的,大家在写接口的时候,多多防范一下,免得被坑。

接着,我们实现一下“TestHandler”中的所有接口,并写一个main实例,使用postman测试一下"/getPod"接口,看看是不是与上述 结论一致。

实现handler,代码如下:

package handlerimport (pb "test/proto""context"
)type test struct {
}func New() *test {return new(test)
}func (t *test) GetK8SPod(ctx context.Context, req *pb.RequestPod, rsp *pb.ResponsePod) error {rsp.Data = "hello"return nil
}

main.go,代码如下:

package mainimport ("context""fmt""log""net""net/http""time""test/handler"pb "test/proto"grpccli "github.com/go-micro/plugins/v4/client/grpc"grpcsvr "github.com/go-micro/plugins/v4/server/grpc""github.com/grpc-ecosystem/grpc-gateway/v2/runtime""github.com/pkg/errors""go-micro.dev/v4""google.golang.org/grpc"
)func program1() {svr := micro.NewService(micro.Server(grpcsvr.NewServer(),),micro.Client(grpccli.NewClient(),),micro.Name("test"),micro.Version("latest"),micro.Address(net.JoinHostPort("127.0.0.1", "8081")),)if err := pb.RegisterTestHandler(svr.Server(), handler.New()); err != nil {return}grpcDialOpts := []grpc.DialOption{grpc.WithInsecure()}grpcMux := runtime.NewServeMux(runtime.WithMarshalerOption(runtime.MIMEWildcard, &runtime.JSONPb{}))if err := pb.RegisterTestGwFromEndpoint(context.Background(), grpcMux,net.JoinHostPort("127.0.0.1", "8081"), grpcDialOpts); err != nil {log.Fatalln(errors.Wrapf(err, "register http gateway failed"))}httpServer := &http.Server{Handler: grpcMux,Addr:    net.JoinHostPort("127.0.0.1", "8080"),}errStop := make(chan error, 1)go func() {errStop <- httpServer.ListenAndServe()}()go func() {errStop <- svr.Run()}()for {select {case err := <-errStop:log.Fatalln(err)default:time.Sleep(time.Millisecond * 50)}}}func main() {program1()
}

postman,访问结果如下:

到这里就印证了上述结论。

如何能让"Test.GetK8sPod"接口被成功访问,目前只有一种方法,就是修改proto文件,把"GetK8sPod",改成“GetK8SPod”,就是“S”大写。如下:

syntax = "proto3";package test;option go_package = "./test";import "google/api/annotations.proto";
import "protoc-gen-swagger/options/annotations.proto";
import "validate/validate.proto";service Test{// K8S 全部大写rpc GetK8SPod(RequestPod) returns(ResponsePod){option (google.api.http) = {get: "/getPod"};option (grpc.gateway.protoc_gen_swagger.options.openapiv2_operation) = {description : "根据条件查询pod,并返回查询结果"summary : "查询pod"};}
}message RequestPod{option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {json_schema : {title : "RequestPod"description : "查询pod请求"required: []}};string name = 1[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "name",description: "名字"}];string namespace = 2[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "namespace",description: "名空间"}];}message ResponsePod{option (grpc.gateway.protoc_gen_swagger.options.openapiv2_schema) = {json_schema : {title : "ResponsePod"description : "返回pod查询结果"required: []}};string data = 1[(grpc.gateway.protoc_gen_swagger.options.openapiv2_field) = {title: "data",description: "数据"}];}

再重新编译一下proto文件,并重新运行main.go,使用postman访问“/getPod”接口,结果如下:

编译protoc方法名称被自动大写相关推荐

  1. eclipse html自动编译,eclipse不自动编译解决方法 不编译要怎么办

    eclipse不编译怎么办? 「Project」菜单 「项目」菜单可以对工作台中的项目执行动作(建置或编译). eclipse出现不编译工程的现象.怎么刷新classes目录下也是空的. 具体都操作了 ...

  2. Android studio:Button 按钮英文字符自动大写的解决方法

    Android studio:Button 按钮英文字符自动大写的解决方法 一.方法一:styles.xml文件里面添加<item name="textAllCaps"> ...

  3. 006_Spring Data JPA基于方法名称命名规则查询

    1. Repository接口 1.1. Repository接口是Spring Data JPA中为我我们提供的所有接口中的顶层接口. 1.2. Repository提供了两种查询方式的支持 1.2 ...

  4. Java反射————Method根据方法名称字符串调用方法

    引言 之前浏览廖雪峰老师的个人博客网站,无意间发现了关于在Java8中获取参数的方法,随手一转<Java 8中获取参数名称>,没想到今天遇到一个功能,非常符合这种反射调用的使用场景.回看了 ...

  5. aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...

    作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...

  6. ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称以及入参和出参结果并记录方法耗时

    作者:小傅哥 博客:bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了多少代码 ...

  7. 一些防止 Java 代码被反编译的方法

    欢迎关注方志朋的博客,回复"666"获面试宝典 由于Java字节码的抽象级别较高,因此它们较容易被反编译.本节介绍了几种常用的方法,用于保护Java字节码不被反编译.通常,这些方法 ...

  8. VC6命令行编译工程方法

    VC6命令行编译工程方法 昨天下载一个界面库wxWidgets,编译里面的库很痛苦,有好几个工程,我的在一边等待,痛苦!!于是上网找到命令行编译的方法,可以写一个批处理文件,呵呵,想起以前经理编译工程 ...

  9. 面试被问 | 防止 Java 代码被反编译的方法有几种?

    点击上方"朱小厮的博客",选择"设为星标" 后台回复"书",获取 后台回复"k8s",可领取k8s资料 由于Java字节 ...

  10. 关于JPA方法名创建自动查询

    JPA 的根据解析方法名称自动对接口进行实现的方法能节省大量的资源,以下对于解析规则进行列举哈 商品实体类 package com.dionren.zhaoxie.entity.trade;impor ...

最新文章

  1. module ‘imgaug.augmenters‘ has no attribute ‘Resize‘
  2. python中数据分析的流程为-python数据分析011_数据分析流程
  3. android 谷歌地图在模拟器的使用
  4. Android利用AccessibilityService自动获取微信号
  5. 开发小技巧之:unicode的排序和正则匹配
  6. office2016打开PPT出现解决VBE6EXT.OLB不能被加载问题的解决办法
  7. oracle外表日期,三步教会您掌握oracle外表(external table)
  8. Android上试用Linphone(Free SIP VOIP Client)
  9. Monitorix 2.6.0 发布,系统监控工具
  10. 手机java环境_手机端搭建Java编译运行环境
  11. 正则去除汉字和只取数字
  12. C4D模型工具—提取样条
  13. Android 的singleTask和singleInstance的一点思考
  14. 纬地道路纵断面设计教程_市政道路从识图算量到施工,一篇全搞定
  15. verilog 学习笔记2 异步复位串联T触发器
  16. 问题PermissionError [Errno 13] Permission denied解决方法
  17. 威廉玛丽学院计算机专业好吗,威廉玛丽学院计算机
  18. php ipa 版本定制,自建IOS企业包ipa包 下载服务
  19. ORACEL R12 总账和子账的关系
  20. EDM模板设计:教您设计三种独特的邮件营销模板

热门文章

  1. 40个增长和管理你的WordPress网站的有用博客工具
  2. Win socket编程--IOCP完成端口模型
  3. Win11截图键无法使用怎么办?Win11截图键无法使用的解决方法
  4. 2021-2022-1 线性代数知识点总结
  5. 模糊控制 MATLAB 仿真
  6. 计算机网络试卷北理珠,北理工97级计算机网络终考试卷
  7. golang实现家庭收支记账软件项目
  8. uniapp中使用moment.js日期插件
  9. 天使投资,众筹与项目背书
  10. js获取 当前URL中的参数