kitex快速入门

news2025/1/11 0:30:25

简介

kitex是字节跳动开源的一款基于 Go语言的rpc框架。

官网
github仓库
gitee地址

安装与使用

kitex具有一键生成的功能,能够一键生成rpc架构,使开发者只关注于逻辑的开发即可。自动生成的源码只需要简单的配置就可使用,十分方便。

安装就不在多赘述了,详情请见官网kitex的下载与安装

安装完毕使用kitex -module xxx -service xxx xxx.thrift命令自动生成源码。

kitex命令自动生成rpc源码,如下图,其中kitex_gen,script,build,handler,kitex.yaml,main.go是自动生成的,后续会介绍各个目录或文件的作用。
在这里插入图片描述

其中核心部分是kitex_gen

在这里插入图片描述

| -- kitex_gen
|  	| -- demo
|	    |-- storeInterface
|		    |-- client.go
|			|-- invoker.go 
|   		|-- server.go
|		    |-- storeinterface.go
|	    |-- demo.go
|       |-- k-consts.go
|       |-- k-demo.go
|   |-- store
|       |-- demo.go
|       |-- k-consts.go
|       |-- k-demo.go
| -- script
|    |-- bootstrap.sh
| -- build.sh
| -- handler.go
| -- kitex_info.yaml
| -- main.go 

kitex_gen表示是kitex生成的rpc服务源码

demo是以thrift文件的namespace命名的,也就是服务名称

storeInterface是以thrift的service命名的,会把大写改为小写,其下的各个文件都是构建rpc服务的核心代码了,server构建服务端,client构建客户端,kitex将方法重构后拆分了出来,在thrift工具构建的源码中是都在一起的。
demo.go等和storeInterface平级的文件都是公用参数,入thrift定义的公用参数,错误封装参数等

k-consts.go, k-note.go, note.go,它们是rpc底层的传输实现,包含了根据thrift实现的rpc传输信息的包装、传输和验证.
该文件会随定义的多个thrift文件而生成多个,并和thrift文件同名包含文件夹名,除了k-consts.go

script的bootstrap.sh文件是在Kitex项目中用于帮助用户快速生成项目的基础结构,包括下载fabric-sample源码、拉取二进制文件以及拉取docker镜像等操作。这些步骤是自动化的,可以节省您手动配置这些环境的时间。当您在终端中运行这个脚本时,它将自动执行这些操作,为您设置好一个基本的开发环境。

build.sh是项目打包脚本

handler.go是rpc接口的实现方法,用于将go线程共享给rpc服务,实现远程接口调用。

kitex_info.yaml是项目的配置文件

main.go是rpc服务端的启动程序,有kitex直接生成,默认端口8888

之后就是最重要的步骤了:1. 接口的实现类;2. 客户端程序。

接口实现类与客户端程序

续写rpc接口实现类方法体

自动生成的接口方法都是默认的,没有实际的方法体,需要重写,而handler.go就是接口的实现类,使用过thrift就了解,需要使用thrift工具生成核心rpc源码,再有开发继承接口重写方法,并使用源码的程序创建服务端与客户端接口。而在kitex中这些步骤都有kitex实现了,甚至接口的实现类都是生成了,只需要写方法体即可。handler.go默认生成如下:

package main

import (
	"context"
	"errors"
	store "kitexdemo/kitex_gen/store"
)

// StoreInterfaceImpl implements the last service interface defined in the IDL.
type StoreInterfaceImpl struct{}

// AddStore implements the StoreInterfaceImpl interface.
func (s *StoreInterfaceImpl) AddStore(ctx context.Context, req *store.AddStoreReq) (resp int32, err error) {
	// TODO: Your code here...
	return
}

// Delete implements the StoreInterfaceImpl interface.
func (s *StoreInterfaceImpl) Delete(ctx context.Context, req *store.DeleteReq) (resp int32, err error) {
	// TODO: Your code here...
	return
}

// Update implements the StoreInterfaceImpl interface.
func (s *StoreInterfaceImpl) Update(ctx context.Context, req *store.UpdateReq) (resp int32, err error) {
	// TODO: Your code here...
	return
}

// GetStore implements the StoreInterfaceImpl interface.
func (s *StoreInterfaceImpl) GetStore(ctx context.Context, id int32, uuid string) (resp []*store.GetStoreReq, err error) {
	// TODO: Your code here...
	return
}

TODO: Your code here...处编写业务实现的功能即可。例如小编在这里实现GetStore方法,如下

在这里插入图片描述

编写客户端程序

客户端自动生成了,直接启动即可。那么如何编写客户端实现通讯呢?

仿照服务端启动程序写即可,服务端主程序代码如下:

package main

import (
	demo "kitexdemo/kitex_gen/demo/storeinterface"
	"log"
)

func main() {
	svr := demo.NewServer(new(StoreInterfaceImpl))

	err := svr.Run()

	if err != nil {
		log.Println(err.Error())
	}
}

demo.NewServer()方法是生成源码kitex_genserver.go方法,用于生成一个服务端,kitex隐藏了细节;那么该文件下同理还有一个client.go则是生成客户端的方法:

package main

import (
	"context"
	"fmt"
	"github.com/cloudwego/kitex/client"
	"kitexdemo/kitex_gen/demo/storeinterface"
)

func main() {
	newClient := storeinterface.MustNewClient("demo", client.WithHostPorts("127.0.0.1:8888"))
	store, err := newClient.GetStore(context.Background(), 1, "123")
	if err != nil {
		panic(err)
	}
	for _, s := range store {
		fmt.Printf("%#v", s)
	}
}

启动服务端:

在这里插入图片描述
启动客户端端:

在这里插入图片描述
成功连接并获取到服务端返回的结构体数据。

MustNewClient方法用于创建一个新的客户端实例,该方法的参数解析如下:

  1. addr(string):服务端的地址,格式为host:port。例如:“localhost:8080”。
  2. opts([]kitex.ClientOption):可选的配置参数,用于自定义客户端的行为。例如:超时时间、重试策略等。
  3. timeout(time.Duration):请求超时时间,默认为5秒。
  4. retryStrategy(kitex.RetryStrategy):重试策略,默认为指数退避策略。
  5. logger(log.Logger):日志记录器,用于记录客户端的日志信息。
  6. callerName(string):调用者名称,用于在日志中标识调用者。
  7. metadata(map[string]string):元数据,用于在请求和响应中传递额外的信息。

生成的实例为rpc接口用于远程调用方法。

跨语言性

rpc通讯和http协议一样都是跨语言的,只要地址端口和接口名一样就可以调用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1319607.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

能在电脑同时控制苹果和安卓的软件,找到了!

开门见山,既能远程控制安卓手机又能控制iPhone或iPad的软件是AirDroid Cast。 AirDroid Cast是一款专业、强大且易于使用的投屏&控制工具。不仅可以将安卓手机(安卓7.0及以上版本)、iPhone、iPad的屏幕画面投射到电脑上,还支持…

RED影视级R3D文件变0字节加chkdsk恢复案例

随着千兆网络普及小型存储也开始越来越多,特别是在专业级影视领域,存储数据要的就是快速和稳定,所以小存储很适合专业级影视这个行业。下面我们来看一个36T的小存储恢复R3D文件的案例。 故障存储: 36T,Exfat文件系统 故障现象:…

【C++初阶】八、初识模板(泛型编程、函数模板、类模板)

相关代码gitee自取: C语言学习日记: 加油努力 (gitee.com) 接上期: 【C初阶】七、内存管理 (C/C内存分布、C内存管理方式、operator new / delete 函数、定位new表达式) -CSDN博客 目录 一 . 泛型编程 二 . 函数模板 函数模板…

【C语言】数组(一维)详解,手把手教你,保姆级!!!

目录 数组的概念 数组的创建 数组的初始化 数组的类型 数组使用下标 数组的打印 数组的输入 数组的储存 总结 数组的概念 数组是⼀组相同类型元素的集合; 从这个概念中我们有3点拓展: 1,数组中存放的是1个或者多个数据,但…

【Linux】进程周边005之环境变量

👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》《C》《Linux》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.环境变量是什么&#xff1…

引用阿里图标库,不知道对应的图标是什么,可在本地显示图标ui,再也不要担心刚来不知道公司图标对应的是什么了

项目中使用了阿里的图标库,但是无法看到对应显示什么,每次都要去阿里图标库里面找 在下载下来的文件中会发现有两个文件一个是iconfont.css和iconfont.json, 这两个文件的数据可以拿到然后显示在页面上 有两个问题: 1&#xff1a…

【Hadoop】执行start-dfs.sh启动hadoop集群时,datenode没有启动怎么办

执行start-dfs.sh后,datenode没有启动,很大一部分原因是因为在第一次格式化dfs后又重新执行了格式化命令(hdfs namenode -format),这时主节点namenode的clusterID会重新生成,而从节点datanode的clusterID 保持不变。 在…

ansible远程操作主机功能和自动化运维

ansible 两个功能:1、远程操作主机功能 2、自动化运维(play 剧本 yaml) 简述: 是基于python开发的配置管理和应用部署工具。在自动化运维中,现在是异军突起。 Asible能批量配置,部署,管理上千…

智能环境与可持续发展:人工智能为地球未来添翼

导言 在全球迅速发展的背景下,人工智能技术的应用逐渐深入到环境保护和可持续发展领域。随着全球环境问题的加剧,人工智能技术在环境和可持续发展领域的应用成为推动绿色未来的关键力量。本文将深入探讨人工智能在智能环境中的角色,以及如何通…

保护数据库数据安全就用行云管家!全方位保障!

对于企业而言,数据库是企业核心信息的存储和处理中心,所以保障数据库安全至关重要。而如何保障数据库数据的安全性也成为了企业亟待解决的问题。行云管家数据安全运维平台作为全面的数据安全运维平台,通过数据运维的事前阻断、事中控制、事后…

基于Java SpringBoot和Vue的医院信息管理挂号系统

摘要 医院信息管理系统(Hospital Information Management System,简称HIMS)是一种应用于医疗机构的信息化管理系统,旨在提高医疗服务质量、降低运营成本、提高工作效率和满足患者需求。HIMS通过对医院内各种信息的集成、管理和共享…

mybatis中oracle的sql没走索引导致特别慢(未加jdbcType的)

如果直接跑sql是能走索引很快,在mybatis中不能,可能就是jdbcType的原因。 比如,我有一个属性A,在表里面是VARCHAR2类型,但是在mybatis中的sql是#{a},缺少jdbcTypeJdbcType.VARCHAR,就会导致myba…

Excel小技能:excel如何将数字20231211转化成指定日期格式2023/12/11

给了一串数字20231211,想要转成指定格式的日期格式,发现设置单元格格式为指定日期格式不生效,反而变成很长很长的一串#这个,如图所示: 其实,正确的做法如下: 1)打开数据功能界面&am…

列举python2和python3的区别,python 2和python 3的区别

大家好,本文将围绕python2和python3的区别有哪些?展开说明,列举 python2和python3的区别?是一个很多人都想弄明白的事情,想搞清楚python2和python3的区别大吗需要先了解以下几个事情。 python不同于其他语言,python3并不对python2向下兼容 …

Java刷题篇——单链表练习题上

206. 反转链表 - 力扣(LeetCode) 1. 题目描述 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 示例1 输入:head [1,2,3,4,5] 输出:[5,4,3,2,1] 示例2 输入:head [1,2] 输出&…

深入比较Input、Change和Blur事件:Vue与React中的行为差异解析

目录 前言 1. Input事件: 行为差异: 2. Change事件: 行为差异: 3. Blur事件: 行为差异: 4. 在Vue中的表现: Input事件: Change事件: Blur事件: 5.…

基于Vue的汽车服务商城系统设计与实现论文

摘 要 本课题是根据用户的需要以及网络的优势建立的一个基于Vue的汽车服务商城系统,来更好的为用户提供服务。 本基于Vue的汽车服务商城系统应用Java技术,MYSQL数据库存储数据,基于SSMVue框架开发。在网站的整个开发过程中,首先对…

【数据结构】树状数组总结

知识概览 树状数组有两个作用: 快速求前缀和 时间复杂度O(log(n))修改某一个数 时间复杂度O(log(n)) 例题展示 1. 单点修改,区间查询 题目链接 活动 - AcWing本活动组织刷《算法竞赛进阶指南》,系统学习各种编程算法。主要面向…

浅谈深度学习中的不同归一化层

引言 目前,深度学习已经彻底改变了自然语言处理、计算机视觉、机器人等许多子领域。深度学习当然涉及训练精心设计的深度神经网络,并且各种设计决策会影响这些深度网络的训练机制。其中一些设计决策包括 网络中要使用的网络层类型,例如卷积…

【python】深拷贝和浅拷贝

能使用.copy()的对象: 需要是能改变元素的对象比如 list 和 set 就可以改变对象,可以使用copy函数但是类似于 一个整数 a10 或者 元组 就不能使用copy函数,因为他们是不可改变的对象 深拷贝和浅拷贝 浅拷贝就是这能复制第一层元素&#xff0…