golang入门笔记

您所在的位置:网站首页 etcd基本命令 golang入门笔记

golang入门笔记

#golang入门笔记| 来源: 网络整理| 查看: 265

文章目录 WSL的安装KitexKitex的准备工作创建IDL文件生成代码一个问题以及解决客户端的调用 链路追踪为什么需要链路追踪OpenTelemetry链路追踪 服务注册与发现

WSL的安装

由于Kitex并不支持Linux,所以需要首先安装WSL2

WSL一句话来说就是微软出的一个虚拟机工具

Win11下安装WSL2的步骤为:

1.“开始菜单”搜索功能,打开“启动或关闭Window功能” image.png 2.勾选以下功能 1.适用于Linux的Window子系统 2.虚拟机平台 image.png

3.微软商店搜索wsl,点击安装 image.png 4.安装完打开,安装完之后输入用户的账号密码 image.png 如果安装过程中出现下面这种情况: image.png 说明内核没有更新,需要更新 打开一个终端输入以下命令: wsl --update 5.安装完成之后输入下列命令查看wsl的状态: wsl -l -v 启动wsl命令: wsl 6.安装完成之后我的电脑左下角会出现一个linux盘,为linux子系统的文件系统

image.png

Kitex Kitex的准备工作

安装kitex: go install github.com/cloudwego/kitex/tool/cmd/kitex@latest

安装thriftgo go install github.com/cloudwego/thriftgo@latest

安装成功后,使用以下命令验证是否安装成功 kitex --version thriftgo --version

创建IDL文件

Kitex最典型的情况是使用thrift定义的IDL来编写服务接口,实现客户端和服务端的通信

hello.thrift文件内容如下:

namespace go api struct Request { 1: string message } struct Response { 1: string message } service Hello { Response echo(1: Request req) }

1.namespace go api这里指我们定义了一个命名空间:api,api代表生成的代码中有一个目录:api。 2.struct Request{},表示我们编写一个请求消息体。struct中变量的格式为:不重复的编号:类型:命名 3.struct Response{},表示我们编写了一个返回消息体。 4.service Hello{}表示定义了一个Hello服务 5.Response echo(1:Request req)表示服务Hello中有一个叫做echo的方法,方法的返回消息为Response,请求消息为Request,请求消息的格式为:编号: 请求消息:命名

生成代码

使用以下命令生成代码: kitex -module "mod_name" -service a.b.c hello.thrift

-module mod_name 指定生成的代码所属的go模块,会影响生成代码里的import path GOPATH/src 下的一个目录,那么可以不指定该参数;kitex 会使用GOPATH/src 开始的相对路径作为 import path 前缀。 如果当前目录不在 $GOPATH/src 下,那么必须指定该参数。 如果指定了 -module 参数,那么 kitex 会从当前目录开始往上层搜索 go.mod 文件

-service service_name kitex 会生成构建一个服务的脚手架代码,参数 service_name 给出启动时服务自身的名字,通常其值取决于使用 Kitex 框架时搭配的服务注册和服务发现功能。

运行命令后生成的代码目录

image.png

然后执行命令 go mod tidy下载依赖

一个问题以及解决

代码生成后的hello/hello.go报错,这是因为 github.com/apache/thrift 这个包使用的是v0.17.0版本的,但v0.14.0之后的包中很多函数增加了context上下文参数,所以很多函数由于缺少参数报错。 只需要修改go.mod中的require中github.com/apache/thrift v0.17.0为 github.com/apache/thrift v0.13.0然后再执行go mod tidy问题就能解决

客户端的调用 import "example/kitex_gen/api/echo" import "github.com/cloudwego/kitex/client" import "example/kitex_gen/api" ... c, err := echo.NewClient("example", client.WithHostPorts("0.0.0.0:8888")) if err != nil { log.Fatal(err) } req := &api.Request{Message: "my request"} resp, err := c.Echo(context.Background(), req, callopt.WithRPCTimeout(3*time.Second)) if err != nil { log.Fatal(err) } log.Println(resp)

其中,echo.NewClient(“example”, client.WithHostPorts(“0.0.0.0:8888”))是创建一个客户端连接,第一个参数是服务名,要与生成代码中的service_name保持一致,第二个参数是指定server的地址和端口号(server默认占用8888端口),

链路追踪 为什么需要链路追踪

在分布式系统或者微服务架构中,一次请求往往需要调动内部的多个模块,多个中间件,多台机器相互协调才能完成。这些调用过程是较为复杂的,有的是串行调用的,有的是并行调用的。这种情况下,如果确定整个请求当中调用了哪些应用,哪些节点,哪些模块,以及他们的先后顺序和各部分的性能,这就是链路追踪。链路追踪就是将一次分布式请求还原成调用链路,将一次分布式请求的调用情况集中展示,比如,各个服务节点上的耗时、请求具体到达哪台机器上、每个服务节点的请求状态等。

Kitex提供了对OpenTelemetry和OpenTracing的支持,也支持用户自定义链路追踪

OpenTelemetry链路追踪 import ( ... "github.com/kitex-contrib/obs-opentelemetry/provider" "github.com/kitex-contrib/obs-opentelemetry/tracing" ) func main(){ serviceName := "echo-client" //接入OpenTelemetry p := provider.NewOpenTelemetryProvider( provider.WithServiceName(serviceName), provider.WithExportEndpoint("localhost:4317"), provider.WithInsecure(), ) defer p.Shutdown(context.Background()) } svr := userservice.NewServer( new(UserServiceImpl), //注入trace到server实例中 server.WithSuite(tracing.NewServerSuite()), server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ServiceName: serviceName}), ) 服务注册与发现

Kitex服务注册与发现已经对接了主流的服务注册与发现中心 下面以注册ETCD为例

server

import ( api "example/kitex_gen/api/echo" "fmt" "github.com/cloudwego/kitex/pkg/rpcinfo" "github.com/cloudwego/kitex/server" etcd "github.com/kitex-contrib/registry-etcd" "log" ) func main() { r, err := etcd.NewEtcdRegistry([]string{"127.0.0.1:2379"}) //创建一个etcd的注册,ectd占127.0.0.1的2379端口 if err != nil { fmt.Println(err) } svr := api.NewServer(new(EchoImpl), server.WithRegistry(r), //将server注册到etcd中 server.WithServerBasicInfo(&rpcinfo.EndpointBasicInfo{ ServiceName: "example", }), ) err = svr.Run() if err != nil { log.Println(err.Error()) } }

client

import ( "context" "example/kitex_gen/api" "example/kitex_gen/api/echo" "fmt" client "github.com/cloudwego/kitex/client" etcd "github.com/kitex-contrib/registry-etcd" "time" ) func main() { //根据127.0.0.1:2379地址创建一个etcd组件实例 r, err := etcd.NewEtcdResolver([]string{"127.0.0.1:2379"}) if err != nil { fmt.Println(err) } c := echo.MustNewClient("example", client.WithResolver(r)//client.WithResolver,我们能看到最后把一个服务发现实例放到了 client 的 options 结构体中: ) if err != nil { fmt.Println(err) } for { ctx, cancel := context.WithTimeout(context.Background(), time.Second*3) resp, err := c.Echo(ctx, &api.Request{Message: "hello world!"}) cancel() if err != nil { fmt.Println(err) } time.Sleep(time.Second) fmt.Println(resp) } }


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3