go任务调度5(go操作etcd)(代码片段)

author author     2022-11-29     183

关键词:

连接etcd:

package main

import (
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "time"
)

var (
    config clientv3.Config
    client *clientv3.Client
    err error
)

func main()  
    //客户端配置
    config = clientv3.Config
        Endpoints: []string"0.0.0.0:2379", //集群列表
        DialTimeout: 5 * time.Second,
    
    //建立连接
    if client, err = clientv3.New(config); err != nil 
        fmt.Println(err)
        return
    
    client = client


k-v操作:

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    //"github.com/coreos/etcd/clientv3"
    "time"
)

var (
    config  clientv3.Config
    client  *clientv3.Client
    err     error
    kv      clientv3.KV
    putResp *clientv3.PutResponse
)

func main() 
    //客户端配置
    config = clientv3.Config
        Endpoints:   []string"0.0.0.0:2379", //集群列表
        DialTimeout: 5 * time.Second,
    
    //建立客户端
    if client, err = clientv3.New(config); err != nil 
        fmt.Println(err)
        return
    
    //操作k-v(用于读写etcd的键值对)
    kv = clientv3.NewKV(client)
    //context.TODO()代表什么都不做,占位就可以了
    //不在这里指定clientv3.WithPrevKV(),则不能得到putResp.PrevKv.Key,putResp.PrevKv.Value
    if putResp, err = kv.Put(context.TODO(), "/cron/jobs/job1", "world", clientv3.WithPrevKV()); err != nil 
        fmt.Println(err)
     else 
        //输出版本号
        fmt.Println("Revision:", putResp.Header.Revision)
        if putResp.PrevKv != nil 
            //输出上一个k-v
            fmt.Println(string(putResp.PrevKv.Key), ":", string(putResp.PrevKv.Value))
        
    

运行输出

[[email protected] etcd]# go run demo2.go
Revision: 19
/cron/jobs/job1 : hello
查看:
[[email protected] etcd-v3.3.12-linux-amd64]# ETCDCTL_API=3 ./etcdctl get "/cron/jobs/job1"
/cron/jobs/job1
world


get:

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    //"github.com/coreos/etcd/clientv3"
    "time"
)

func main() 
    var (
        config  clientv3.Config
        client  *clientv3.Client
        err     error
        kv      clientv3.KV
        getResp *clientv3.GetResponse
    )

    //客户端配置
    config = clientv3.Config
        Endpoints:   []string"0.0.0.0:2379", //集群列表
        DialTimeout: 5 * time.Second,
    
    //建立客户端
    if client, err = clientv3.New(config); err != nil 
        fmt.Println(err)
        return
    
    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    if getResp, err = kv.Get(context.TODO(), "/cron/jobs/job1"); err != nil 
        fmt.Println(err)
     else 
        fmt.Println(getResp.Kvs)
    

[[email protected] etcd]# go run demo3.go
[key:"/cron/jobs/job1" create_revision:4 mod_revision:21 version:16 value:"world" ]
(create_revision:创建版本。mod_revision:修改版本。version:自从创建以来修改的次数。)

技术图片
(敲with列出所有选项)


获取指定“目录”下的kvs:

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    //"github.com/coreos/etcd/clientv3"
    "time"
)

func main() 
    var (
        config  clientv3.Config
        client  *clientv3.Client
        err     error
        kv      clientv3.KV
        getResp *clientv3.GetResponse
    )

    //客户端配置
    config = clientv3.Config
        Endpoints:   []string"0.0.0.0:2379", //集群列表
        DialTimeout: 5 * time.Second,
    
    //建立客户端
    if client, err = clientv3.New(config); err != nil 
        fmt.Println(err)
        return
    
    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    //读取/cron/jobs/为前缀的所有key
    if getResp, err = kv.Get(context.TODO(), "/cron/jobs/", clientv3.WithPrefix()); err != nil 
        fmt.Println(err)
     else  //获取成功,我们遍历所有kvs
        fmt.Println(getResp.Kvs)
    

[[email protected] etcd]# go run demo4.go
[key:"/cron/jobs/job1" create_revision:4 mod_revision:21 version:16 value:"world" key:"/cron/jobs/job2" create_revision:5 mod_revision:6 version:2 value:"changed" ]


删除:

package main

import (
    "context"
    "fmt"
    "go.etcd.io/etcd/clientv3"
    "go.etcd.io/etcd/mvcc/mvccpb"

    //"github.com/coreos/etcd/clientv3"
    "time"
)

func main() 
    var (
        config  clientv3.Config
        client  *clientv3.Client
        err     error
        kv      clientv3.KV
        delResp *clientv3.DeleteResponse
        //idx int
        kvpair *mvccpb.KeyValue
    )

    //客户端配置
    config = clientv3.Config
        Endpoints:   []string"0.0.0.0:2379", //集群列表
        DialTimeout: 5 * time.Second,
    
    //建立客户端
    if client, err = clientv3.New(config); err != nil 
        fmt.Println(err)
        return
    
    //用于读写etcd的键值对
    kv = clientv3.NewKV(client)

    //删除kv
    if delResp, err = kv.Delete(context.TODO(), "/cron/jobs/job2/", clientv3.WithPrevKV()); err != nil 
        fmt.Println(err)
        return
    

    //被删除之前的value是什么
    if len(delResp.PrevKvs) != 0  //必须有clientv3.WithPrevKV()才能获取delResp.PrevKvs
        for _, kvpair = range delResp.PrevKvs 
            fmt.Println("删除了key:", string(kvpair.Key), " value:", string(kvpair.Value))
        
    

[[email protected] etcd]# go run demo5.go
删除了key: /cron/jobs/job2 value: changed
再次运行什么也不输出,因为已经删除了:
[[email protected] etcd]# go run demo5.go
[[email protected] etcd]#
如果要删除以/cron/jobs/job2/“目录”开头的所有kv,则将clientv3.WithPrevKV()改为:clientv3.WithPrefix()。
clientv3.WithFromKey()则是删除以此开头的所有kv(kv存储是有序的)。

go任务调度8(op取代get,put,delete方法)(代码片段)

packagemainimport("go.etcd.io/etcd/clientv3""time""fmt""context")funcmain()var(configclientv3.Configclient*clientv3.Clienterrerrorkvclientv3.KVputOpclientv3.OpgetOpclientv3.OpopRespclientv3.OpResponse)//客户端配置config=clientv3.ConfigEndpoints:[]string"0.0.0.0:2379",DialTimeout:5*time.Second,/... 查看详情

go任务调度1(go的操作系统命令调用)(代码片段)

packagemainimport("fmt""os/exec")funcmain()var(cmd*exec.Cmderrerror)cmd=exec.Command("/bin/bash","-c","echo1")err=cmd.Run()fmt.Println(err)packagemainimport("fmt""os/exec")funcmain()var(cmd*exec.Cmdoutput[]byteerrerror)//生成Cmdcmd=exec.Command("/bin/bash","-c","ls-la/")//执行了命令,捕获了... 查看详情

go语言并发(代码片段)

并发与并行并发:同一时间段执行多个任务并行:同一时刻执行多个任务Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由Go语言的运行时调... 查看详情

go任务调度11(分布式crontab架构分析)

crontab是单机工具(所有worker都在调度,如果有1000个任务,所有worker都在调用者1000个任务。对于编译型语言来说,排序一个一千万的数组只需要一秒,对于一千一万的调度,无需担心性能)(相当于完成一个到worker集群的通知,通知... 查看详情

一天一门编程语言用go语言实现一个dag任务调度系统的api接口代码(代码片段)

文章目录用Go语言实现一个DAG任务调度系统的API接口代码什么是DAG任务调度系统Go语言实现DAG任务调度系统API接口使用Gin框架编写API接口API功能设计实现API功能API设计2.1API方法2.2参数定义2.3返回值定义DAG任务调度系统实现3.1添加... 查看详情

19.go语言基础之并发(代码片段)

1.1并发与并行并发:同一时间段执行多个任务(使用微信和多个朋友聊天)并行:同一时刻执行多个任务(windows中360在杀毒,同时你也在写代码)Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以... 查看详情

go语言基础之并发(代码片段)

...言中的并发编程并发与并行并发:同一时间段内执行多个任务并行:同一时刻执行多个任务Go语言的并发通过goroutine实现。goroutine类似于线程,属于用户态的线程,我们可以根据需要创建成千上万个goroutine并发工作。goroutine是由G... 查看详情

go底层原理:一起来唠唠gmp调度(代码片段)

....3M上创建的G个数大于本地队列长度时3.3.5M的自旋状态3.3.5任务窃取机制3.3.6G发生系统调用进入阻塞时3.3.6.1用户态阻塞3.3.6.2系统调用阻塞3.3.7G退出系统调用时前言春招开始了,作为23届的科班咸鱼学习记录一下八股文和go底层... 查看详情

go语言基础之并发(代码片段)

...很重要的原因。并发与并行并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。Go语言的并发通过goroutine实现。goroutine类似于线程,属于... 查看详情

go语言系列之并发编程(代码片段)

...言中的并发编程并发与并行并发:同一时间段内执行多个任务(你在用微信和两个女朋友聊天)。并行:同一时刻执行多个任务(你和你朋友都在用微信和女朋友聊天)。Go语言的并发通过goroutine实现。goroutine类似于线程,属于... 查看详情

golang基于etcd做分布式任务锁(代码片段)

参考:https://www.jianshu.com/p/d7434d916856etcd服务搭建请看上一篇,下面直接上代码:#goget github.com/etcd-io/etcdmain.go内容如下:packagemainimport("context""fmt""time"//"github.com/etcd-io/etcd/clientv3"这个引用会导致启动失败"go.e 查看详情

从0实现分布式任务调度系统--etcd基础操作(代码片段)

下载:etcd-v3.3.18-linux-amd64.tar.gz ;解压:tar-zxvfetcd-v3.3.18-linux-amd64.tar.gz解压后的情况如下:其中etcd是服务端程序,etcdctl是客户端程序。   2.启动etcd服务(后台启动,并监听公网IP,默认只监听localhost):n 查看详情

go-microundefined:balancer.pickoptions(代码片段)

#go.etcd.io/etcd/clientv3/balancer/picker/home/user/go/src/go.etcd.io/etcd/clientv3/balancer/picker/err.go:37:44:undefined:balancer.PickOptions/home/user/go/src/go.etcd.io/etcd/clientv3/balancer/picke 查看详情

go语言开发分布式任务调度轻松搞定高性能crontab

...具体安排。1-1导学视频第2章如何执行shell命令执行"定时任务"其实就是执行"shell命令"。在本章中,将首先带大家区分"程序"与"命令",接着了解bash命令解释器的2种工作模式,并图示分析shell执行任务的底层原理与涉及的系统调用... 查看详情

go语言的开源项目

...用Go语言自身进行编写。Go语言的源码对了解Go语言的底层调度有极大的参考意义,建议希望对Go语言有深入了解的读者读一读。3.Kubernetes项目网址为https://github.com/kubernetes/kubernetes。介绍:Google公司开发的构建于Docker之上的容器... 查看详情

09.go语言并发(代码片段)

Go语言并发并发指在同一时间内可以执行多个任务。并发编程含义比较广泛,包含多线程编程、多进程编程及分布式程序等。本章讲解的并发含义属于多线程编程。Go语言通过编译器运行时(runtime),从语言上支持了并发的特性... 查看详情

go协程(goroutine)调度原理(代码片段)

...了线程池。线程池中预先保存一定数量的线程,而新任务将不再以创建线程的方式去执行,而是将任务发布到任务队列,线程池中的线程不断地从任务队列中取出任务并执行,可以有效的减少线程创建和销毁所带... 查看详情

go语言基于etcd实现的定时任务

参考技术A利用Etcd的Lease租约特性来实现定时功能,同时通过Watch机制来实现多节点情况下只有一个节点执行该任务。通过定时任务库Cron的时间字符串解析器Parser来解析任务执行时间。EtcdCron源码链接 查看详情