我是靠谱客的博主 名字长了才好记,这篇文章主要介绍go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目),现在分享给大家,希望可以做个参考。

前面两篇跑通了demo项目,和大概了解了kratos demo整体结构,本篇分别构建一个http和一个grpc微服务单独测试。

grpc

先从grpc 开始, 上篇没有测试grpc接口,这回来尝试,直接跑起demo 服务。

kratos new rpcdemo --grpc

复制代码
1
2
3
4
5
6
kratos run INFO 12/26-20:49:08.933 I:/VSProject/kratos/rpcdemo/cmd/main.go:19 rpcdemo start 2019/12/26 20:49:08 start watch filepath: I:VSProjectkratosrpcdemoconfigs [warden] config is Deprecated, argument will be ignored. please use -grpc flag or GRPC env to configure warden server. INFO 12/26-20:49:08.953 I:/VSProject/go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/pkg/net/rpc/warden/server.go:329 warden: start grpc listen addr: [::]:9000

warden :简单了解了下kratos的grpc框架 不是直接使用的google的grpc,类比http也是对grpc接口做了定制包装而成的。

不改gRPC源码,基于接口进行包装集成trace、log、prom等组件
打通自有服务注册发现系统discovery
实现更平滑可靠的负载均衡算法

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// New new a grpc server. func New(svc pb.DemoServer) (ws *warden.Server, err error) { var ( cfg warden.ServerConfig ct paladin.TOML ) if err = paladin.Get("grpc.toml").Unmarshal(&ct); err != nil { return } if err = ct.Get("Server").UnmarshalTOML(&cfg); err != nil { return } ws = warden.NewServer(&cfg) pb.RegisterDemoServer(ws.Server(), svc) ws, err = ws.Start() return }

warden内容很多,我们下次再看,先直接基于grpc 调用 kratos 接口。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
package main import ( "fmt" pb "cli/api" "golang.org/x/net/context" "google.golang.org/grpc" ) const ( Address = "127.0.0.1:50052" ) func main() { conn, err := grpc.Dial("127.0.0.1:9000", grpc.WithInsecure()) if err != nil { fmt.Println(err) } defer conn.Close() c := pb.NewDemoClient(conn) req := new(pb.HelloReq) req.Name = "kratos grpc" r, err := c.SayHelloURL(context.Background(), req) if err != nil { fmt.Println(err) return } fmt.Println(r.Content) }

在这里插入图片描述

http

前面内容都是基于kratos 原本demo的使用, 现在我们自己随便定义一个liveroom.proto的bm服务, 看看需要改动哪些,跑起微服务。

创建一个只生成bm代码的项目liveroom

复制代码
1
2
kratos new liveroom -d C:项目路径 --http
复制代码
1
2
3
4
I:/VSProject/kratos/liveroom/cmd/main.go:19 liveroom start 2019/12/26 20:13:59 start watch filepath: I:VSProjectkratosliveroomconfigs INFO 12/26-20:13:59.446 I:/VSProject/go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/pkg/net/http/blademaster/server.go:98 blademaster: start http listen addr: 0.0.0.0:8000

但这只是前两章的demo项目,接着删掉api 路径下的pb.go和bm.go,定义自己的api.proto

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
syntax = "proto3"; import "github.com/gogo/protobuf/gogoproto/gogo.proto"; import "google/protobuf/empty.proto"; import "google/api/annotations.proto"; // package 命名使用 {appid}.{version} 的方式, version 形如 v1, v2 .. package liveroom.service.v1; // NOTE: 最后请删除这些无用的注释 (゜-゜)つロ option go_package = "api"; option (gogoproto.goproto_getters_all) = false; service Liveroom { rpc Create (Req) returns (Resp); rpc Delete (Req) returns (Resp); rpc Get(Req) returns (Resp) { option (google.api.http) = { get:"/live-room/get" }; }; } message Req { string name = 1 [(gogoproto.moretags)='form:"name" validate:"required"']; } message Resp { string Content = 1 [(gogoproto.jsontag) = 'content']; }

go generate 生成新的go接口。

复制代码
1
2
3
4
5
6
7
8
9
go generate go get -u github.com/bilibili/kratos/tool/kratos-protoc protoc: 安装成功! 2019/12/26 20:26:44 protoc --proto_path=I:VSProjectgo/src --proto_path=I:VSProjectgo/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/third_party --proto_path=I:VSProjectkratosliveroomapi --bm_out=:. api.proto api.proto:7:1: warning: Import google/protobuf/empty.proto is unused. 2019/12/26 20:26:44 protoc --proto_path=I:VSProjectgo/src --proto_path=I:VSProjectgo/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/third_party --proto_path=I:VSProjectkratosliveroomapi --gofast_out=plugins=grpc:. api.proto api.proto:7:1: warning: Import google/protobuf/empty.proto is unused. 2019/12/26 20:26:44 generate api.proto success.

client.go 的newclient()接口也需要重定义。

接着service 层 业务逻辑层 重新定义我们的接口实现

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
func (s *Service) Create(ctx context.Context, req *pb.Req) (reply *pb.Resp, err error) { reply = &pb.Resp{ Content: "Create " + req.Name, } fmt.Printf("Create %s", req.Name) return } func (s *Service) Delete(ctx context.Context, req *pb.Req) (reply *pb.Resp, err error) { reply = &pb.Resp{ Content: "Delete " + req.Name, } fmt.Printf("Delete %s", req.Name) return } func (s *Service) Get(ctx context.Context, req *pb.Req) (reply *pb.Resp, err error) { reply = &pb.Resp{ Content: "Get " + req.Name, } fmt.Printf("Get %s", req.Name) return }

依赖注入层修改wire.go
重新生成静态分析文件wire_gen.go。
go generate

复制代码
1
2
3
4
5
6
>go generate go get -u github.com/google/wire/cmd/wire go: finding golang.org/x/tools latest wire: 安装成功! wire: liveroom/internal/di: wrote I:VSProjectkratosliveroominternaldiwire_gen.go

解决编译问题,bm微服务就起来了。

复制代码
1
2
3
4
5
kratos run INFO 12/26-20:39:48.725 I:/VSProject/kratos/liveroom/cmd/main.go:19 liveroom start 2019/12/26 20:39:48 start watch filepath: I:VSProjectkratosliveroomconfigs INFO 12/26-20:39:48.755 I:/VSProject/go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/pkg/net/http/blademaster/server.go:98 blademaster: start http listen addr: 0.0.0.0:8000

在这里插入图片描述

发现,大致要改的地方其实并不多:
1、service 改proto定义的接口逻辑
2、重新wirei静态分析
3、解决编译报错。

最后

以上就是名字长了才好记最近收集整理的关于go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目)的全部内容,更多相关go微服务框架kratos学习笔记三(构建单独的http或者grpc内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(1931)

评论列表共有 0 条评论

立即
投稿
返回
顶部