研究本地服务系列文章:

  1. 图一乐研究之初识Yakit(本文)
  2. 图一乐研究之本地服务猎手
  3. 本地服务猎手终章

前言

今天下载 yakit 试用了一下,颜值非常高,功能也很强大:

Untitled

撇到左上角的 127.0.0.1:49024 引起了巴斯的注意。

yakit软件大致架构为 yak engine 和 yakit gui 是分离的,通过 grpc 通信,在macOS下运行 lsof -i tcp:49024 查看占用进程yak,查看其启动命令为 $HOME/yakit-projects/yak-engine/yak grpc --port 49024

去github 逛了下找到了 protobuf 文件: https://github.com/yaklang/yakit/blob/master/app/protos/grpc.proto

看到 rpc Exec(ExecRequest) returns (stream ExecResult); 是用来执行 yaklang 脚本的,感觉有搞头。

图一乐

Untitled

简单写个demo 验证一下,能否执行与 yak 通信 :

  1. 安装 protobuf 和 protoc-gen-go
  2. protoc --go_out=plugins=grpc:. *.proto 生成 bp.go
  3. 写代码
package main

import (
	"context"
	"log"

	pb "yakit/ypb"

	"google.golang.org/grpc"
	"google.golang.org/grpc/credentials/insecure"
)

const (
	host = "127.0.0.1:49024"
)

func main() {
	conn, err := grpc.Dial(host,
		grpc.WithTransportCredentials(insecure.NewCredentials()))
	if err != nil {
		log.Fatal(err)
	}
	defer conn.Close()

	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	yak := pb.NewYakClient(conn)

	v, err := yak.Version(ctx, &pb.Empty{})
	if err != nil {
		log.Fatal(err)
	}
	log.Printf("version: %s", v.Version)
}

Untitled

可以本地通信的话没啥限制。