go微服务框架kratos学习笔记三(构建单独的http或者grpc demo项目)

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

grpc

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

kratos new rpcdemo --grpc

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:\VSProject\kratos\rpcdemo\configs
[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

实现更平滑可靠的负载均衡算法

// 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 接口。

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

kratos new liveroom -d C:\项目路径 --http
I:/VSProject/kratos/liveroom/cmd/main.go:19 liveroom start
2019/12/26 20:13:59 start watch filepath: I:\VSProject\kratos\liveroom\configs
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

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接口。

go generate
go get -u github.com/bilibili/kratos/tool/kratos-protoc
protoc: 安装成功!
2019/12/26 20:26:44 protoc --proto_path=I:\VSProject\go/src --proto_path=I:\VSProject\go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/third_party --proto_path=I:\VSProject\kratos\liveroom\api --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:\VSProject\go/src --proto_path=I:\VSProject\go/pkg/mod/github.com/bilibili/kratos@v0.3.2-0.20191224125553-6e1180f53a8e/third_party --proto_path=I:\VSProject\kratos\liveroom\api --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 层 业务逻辑层 重新定义我们的接口实现

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

>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:\VSProject\kratos\liveroom\internal\di\wire_gen.go

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

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:\VSProject\kratos\liveroom\configs
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项目)的更多相关文章

  1. go微服务框架kratos学习笔记八 (kratos的依赖注入)

    目录 go微服务框架kratos学习笔记八(kratos的依赖注入) 什么是依赖注入 google wire kratos中的wire Providers injector(注入器) Binding ...

  2. go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时])

    目录 go微服务框架kratos学习笔记五(kratos 配置中心 paladin config sdk [断剑重铸之日,骑士归来之时]) 静态配置 flag注入 在线热加载配置 远程配置中心 go微 ...

  3. # go微服务框架kratos学习笔记六(kratos 服务发现 discovery)

    目录 go微服务框架kratos学习笔记六(kratos 服务发现 discovery) http api register 服务注册 fetch 获取实例 fetchs 批量获取实例 polls 批 ...

  4. go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer)

    目录 go微服务框架kratos学习笔记七(kratos warden 负载均衡 balancer) demo demo server demo client 池 dao service p2c ro ...

  5. go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用)

    目录 go微服务框架kratos学习笔记四(kratos warden-quickstart warden-direct方式client调用) warden direct demo-server gr ...

  6. go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin)

    目录 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin) zipkin使用demo 数据持久化 go微服务框架kratos学习笔记九(kratos 全链路追踪 zipkin ...

  7. go微服务框架kratos学习笔记十(熔断器)

    目录 go微服务框架kratos学习笔记十(熔断器) 什么是熔断 熔断器逻辑 kratos Breaker kratos 熔断逻辑 kratos熔断器使用说明 bladmaster client br ...

  8. golang微服务框架go-micro 入门笔记2.3 micro工具之消息接收和发布

    本章节阐述micro消息订阅和发布相关内容 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go-micro环境, golang微服务框架go-mi ...

  9. 微服务框架surging学习之路——序列化 (转载https://www.cnblogs.com/alangur/p/10407727.html)

    微服务框架surging学习之路——序列化   1.对微服务的理解 之前看到在群里的朋友门都在讨论微服务,看到他们的讨论,我也有了一些自己的理解,所谓微服务就是系统里的每个服务都 可以自由组合.自由组 ...

  10. golang微服务框架go-micro 入门笔记2.4 go-micro service解读

    本章节阐述go-micro 服务发现原理 go-micro架构 下图来自go-micro官方 阅读本文前你可能需要进行如下知识储备 golang分布式微服务框架go-micro 入门笔记1:搭建go- ...

随机推荐

  1. delete、truncate、drop的区别

    delete:只删除数据,不删除结构.删除的数据存储在系统回滚段中,可以回滚.不会自动提交事务. 在InnoDB中,delete不会真的把数据删除,mysql实际上只是给删除的数据打了个标记为已删除, ...

  2. 解决CentOS 7.x虚拟机无法上网的问题

    参考地址:https://blog.csdn.net/weixin_43317914/article/details/124770393 1.关闭虚拟机 2.打开cmd,查看本机dns 3.打开虚拟机 ...

  3. 【python】第二模块 步骤一 第二课、数据库表的相关操作

    第二课.数据库表的相关操作 一.课程介绍 1.1 课程介绍 学习目标 管理逻辑库和数据表 创建.删除.修改逻辑库和数据表 了解常用的数据类型和约束 字符串.整数.浮点数.精确数字.日期.枚举.主要约束 ...

  4. MySql 自动设置时间(自动获取时间,填充时间)

    应用场景: 1.在数据表中,要记录每条数据是什么时候创建的,不需要应用程序去特意记录,而由数据数据库获取当前时间自动记录创建时间: 2.在数据库中,要记录每条数据是什么时候修改的,不需要应用程序去特意 ...

  5. HBuilder uniapp手机定位

    // 获取当前位置 getPosition: function() { this.GetLocation(function(res) { if (res) { this.longitude = res ...

  6. Android Native Code 手动调试

    调试启动过程中的 Android Native Code Crash 记录一下,最后成功使用的工具是 lldb + lldb-server,不需要 root 权限.我最先尝试使用的是,gdb + gd ...

  7. Lua元表应用举例:配置表格转为Lua配置表

    把配置表格.xlsx数据转为Lua配置表,其实就是把表格数据用Lua写一遍,这里的实现重点就是setmetatable设置元表. 以下以表格student_info.xlsx举例,展示对应Lua配置表 ...

  8. Docker 安装 MySQL5.7

    1.拉取数据库镜像 docker pull mysql:5.7 docker images命令查看镜像是否下载成功 docker images 2.配置mysql 创建mysql目录,用于存放mysq ...

  9. C++ 文件知识

    #include "iostream" #include "filesystem" #include "fstream" #ifdef WI ...

  10. Ubuntu 20.04 使用deb包安装mysql

    Ubuntu 20.04 使用deb包安装mysql 1.环境 WSL2 + Ubuntu 20.04 2.下载mysql的Ubuntu / Debian安装包 MySQL :: Download M ...