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

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

grpc

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

kratos new rpcdemo --grpc

  1. kratos run
  2. INFO 12/26-20:49:08.933 I:/VSProject/kratos/rpcdemo/cmd/main.go:19 rpcdemo start
  3. 2019/12/26 20:49:08 start watch filepath: I:\VSProject\kratos\rpcdemo\configs
  4. [warden] config is Deprecated, argument will be ignored. please use -grpc flag or GRPC env to configure warden server.
  5. 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. // New new a grpc server.
  2. func New(svc pb.DemoServer) (ws *warden.Server, err error) {
  3. var (
  4. cfg warden.ServerConfig
  5. ct paladin.TOML
  6. )
  7. if err = paladin.Get("grpc.toml").Unmarshal(&ct); err != nil {
  8. return
  9. }
  10. if err = ct.Get("Server").UnmarshalTOML(&cfg); err != nil {
  11. return
  12. }
  13. ws = warden.NewServer(&cfg)
  14. pb.RegisterDemoServer(ws.Server(), svc)
  15. ws, err = ws.Start()
  16. return
  17. }

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

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

http

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

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

  1. kratos new liveroom -d C:\项目路径 --http
  1. I:/VSProject/kratos/liveroom/cmd/main.go:19 liveroom start
  2. 2019/12/26 20:13:59 start watch filepath: I:\VSProject\kratos\liveroom\configs
  3. 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. syntax = "proto3";
  2. import "github.com/gogo/protobuf/gogoproto/gogo.proto";
  3. import "google/protobuf/empty.proto";
  4. import "google/api/annotations.proto";
  5. // package 命名使用 {appid}.{version} 的方式, version 形如 v1, v2 ..
  6. package liveroom.service.v1;
  7. // NOTE: 最后请删除这些无用的注释 (゜-゜)つロ
  8. option go_package = "api";
  9. option (gogoproto.goproto_getters_all) = false;
  10. service Liveroom {
  11. rpc Create (Req) returns (Resp);
  12. rpc Delete (Req) returns (Resp);
  13. rpc Get(Req) returns (Resp) {
  14. option (google.api.http) = {
  15. get:"/live-room/get"
  16. };
  17. };
  18. }
  19. message Req {
  20. string name = 1 [(gogoproto.moretags)='form:"name" validate:"required"'];
  21. }
  22. message Resp {
  23. string Content = 1 [(gogoproto.jsontag) = 'content'];
  24. }

go generate 生成新的go接口。

  1. go generate
  2. go get -u github.com/bilibili/kratos/tool/kratos-protoc
  3. protoc: 安装成功!
  4. 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
  5. api.proto:7:1: warning: Import google/protobuf/empty.proto is unused.
  6. 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
  7. api.proto:7:1: warning: Import google/protobuf/empty.proto is unused.
  8. 2019/12/26 20:26:44 generate api.proto success.

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

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

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

依赖注入层修改wire.go

重新生成静态分析文件wire_gen.go。

go generate

  1. >go generate
  2. go get -u github.com/google/wire/cmd/wire
  3. go: finding golang.org/x/tools latest
  4. wire: 安装成功!
  5. wire: liveroom/internal/di: wrote I:\VSProject\kratos\liveroom\internal\di\wire_gen.go

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

  1. kratos run
  2. INFO 12/26-20:39:48.725 I:/VSProject/kratos/liveroom/cmd/main.go:19 liveroom start
  3. 2019/12/26 20:39:48 start watch filepath: I:\VSProject\kratos\liveroom\configs
  4. 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. vue中sso登录使用VueKeycloak登录

    一,先下载vuekeycloakjs npm install @dsb-norge/vue-keycloak-js --save 二,引入 import VueKeycloakJs from '@ds ...

  2. P2504 聪明的猴子

    题目描述 在一个热带雨林中生存着一群猴子,它们以树上的果子为生.昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上.猴子不会游泳,但跳跃能力比较强,它们仍然可以 ...

  3. 无显示器无键盘的树莓派搭建NAS(samba)

    使用软件Rufus烧录系统2020-02-13-raspbian-buster.img到TF卡后,在TF卡的文件夹内创建空文件ssh,再创建一个名为wpa_supplicant.conf的文件,内容为 ...

  4. golang sync.RWMutex总结笔记

    背景 最近项目中遇到两次RWMutex死锁问题,所以稍微看了一下资料和源码,稍作记录 源码 type RWMutex struct { w Mutex // held if there are pen ...

  5. Matlab字体设置中找不到字体的解决方法(转载)

    Matlab字体设置中找不到字体 Matlab默认的字体实在不好看,一般都需要重新设置字体. 在其字体设置中有些字体不能同时支持中文和英文,我在之前的博客中说过,如何为Matlab设置一款好看的同时兼 ...

  6. 第一课 Hello World程序

    接触一门编程语言都是从HelloWorld开始的.我们以Idea为开发工具,写一个JAVA版的HelloWorld. 1,启动idea,点击菜单 File->New->Project 新建 ...

  7. 简单的python格网算法算数据密集度demo

    # 格网算法计算数据集区域数据密集度 import time import random import numpy as np import pandas as pd # 模拟数据集 def crea ...

  8. 快速排序(Java分治法)

    快速排序(Java分治法) 文章目录 快速排序(Java分治法) 0. 分治策略 1.思路步骤 2.代码 3.复杂度分析 3.1 最好情况 3.2 最坏情况 3.3 平均情况 3.4 性能影响因素 4 ...

  9. new Date()在IOS中的坑(转)

    原文地址:https://www.cnblogs.com/zjjDaily/p/8963327.html 第一次遇到,记录一下 要创建一个指定时间的new Date对象时,通常的做法是: new Da ...

  10. Oracle 取Group By 第一条

    select *from (select emp.*,row_number() over(partition by deptno order by rownum) cn from emp)where ...