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. element select多选选项卡页面抖动问题

    最近做项目是有个功能需要下拉框多选,然后碰到了一个问题就是选择选项的时候出现频繁抖动的情况 问题描述: 页面选择到三个选项时长度为三的时候就会开始抖动,其他长度没有问题,检索elements是发现选择 ...

  2. 【摘】python和它的super

    python和它的super 如果用过python2,你一定见过下面这个奇怪的代码 class Mama(object): def says(self): print('i am mama') cla ...

  3. dotnet Core 在linux 下设置成Service

    1.新建.service文件 cd /etc/systemd/system //进入改目录 touch Core.service // 新建Core服务文件 vi Core.service // 编辑 ...

  4. LeetCode 之 559. N叉树的最大深度

    原题链接 思路: 递归计算每个子树的深度,返回最大深度即可 python/python3: class Solution(object): def maxDepth(self, root): &quo ...

  5. jsp第4个作业(2)

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"% ...

  6. OSIDP-文件管理-12(end)

    概述 文件特性:可长期存储:可在进程间共享:有特定结构. 文件系统提供对文件操作的功能接口:创建.删除.打开.关闭.读和写. 域(field):基本数据单元,一个域包含一个值. 记录(record): ...

  7. 解决WIN7下pl/sql连接弹出空白提示框问题

    问题描述: win7 32位系统,已安装oracle10.0开发客户端,已配置数据库, 登陆pl/sql时出现空白提示框问题,尝试重装oracle无果,于是上网查找解决方法,逐步尝试,终于把客户端弄好 ...

  8. 1011.Django状态保持以及表单

    一.session保持状态 状态保持: 1. http协议是无状态的:每次请求都是一次新的请求,不会记得之前通信的状态: 2. 客户端与服务器端的一次通信,就是一次会话实现状态保持的方式:在客户端或服 ...

  9. (粗糙版)DeptDao,Service

    DeptDao package com.javasm.dao; import com.javasm.bean.Dept; import com.javasm.util.JDBCUtils; impor ...

  10. 打印机出现错误0x00000709要如何解决

    就是微软2021年10月更新的这个补丁导致的 要卸载KB5006670. 原文:https://www.zhihu.com/question/298855357/answer/514515054 微软 ...