• Go的微服务库kite


    Kite

    Kite是用Go开发的一套RPC库,很适合作为分布式微服务的开发框架。

    Kite 的传输层使用 SockJS 提供的WebSocket服务, 浏览器Javascript也可以连接到Kite上 (Kite.js);

    Kite 的RPC消息格式使用修改过的 dnode 协议,Kite 增加了 session 和 authentication 层, 用于Kites 的发现和识别。

    标识一个Kite的参数如下:

    • Username: Kite的属主;
    • Environment: 当前环境,比如“production”, “testing”, “staging” 等;
    • Name: 标识Kite类别的名称,比如mykite, fs, terminal 等;
    • Version: 版本号,比如1.0.0;
    • Region: 当前区域, 比如 “Europe”, “Asia” 或其它地区;
    • Hostname: Kite的Hostname;
    • ID: 识别Kite的唯一ID,这个是由Kite库生成的,但用户也可以自己指定一个;

    注意:以上参数的顺序很重要;

    Kite的使用

    如下面的例子:

    服务端:

    package main
    import "github.com/koding/kite"
    func main() {
        k := kite.New("first", "1.0.0")
        k.Config.Port = 6000
        k.Run()
    }

    代码说明:

    1. kite.New创建了一个名字为"first",版本号为"1.0.0"的Kite;
    2. k.Config 用于设置Kite的属性,比如端口号;
    3. Run方法表示运行此服务,这是个阻塞式的调用,之后,Kite就可以接收请求了;

    客户端:

    package main
    import (
        "fmt"
        "github.com/koding/kite"
    )
    func main() {
        k := kite.New("second", "1.0.0")
        client := k.NewClient("http://localhost:6000/kite")
        client.Dial()
        response, _ := client.Tell("kite.ping")
        fmt.Println(response.MustString())
    }

    代码说明:

    1. NewClient方法指定需要连接的服务端的URL;
    2. Tell方法传入调用的方法名,在服务端,这个方法名对应一个handler,这里的kite.ping是一个默认的方法,当调用这个方法的时候,client端会受到一个字符串"pong";

    下面再来看看怎么调用一个自定义方法:

    服务端:

    package main
    import "github.com/koding/kite"
    func main() {
        k := kite.New("first", "1.0.0")
        k.Config.Port = 6000
        k.Config.DisableAuthentication = true
        k.HandleFunc("square", func(r *kite.Request) (interface{}, error) {
            a := r.Args.One().MustFloat64()
            return a * a, nil
        })
    k.Run() }

    定义了一个square方法,对应的handler接收一个数字,并返回这个数字的平方;

    客户端:

    package main
    import (
        "fmt"
        "github.com/koding/kite"
    )
    func main() {
        k := kite.New("second", "1.0.0")
        client := k.NewClient("http://localhost:6000/kite")
        client.Dial()
        response, _ := client.Tell("square", 4)
        fmt.Println(response.MustFloat64())
    }

    服务注册和发现Kontrol

    Kite之间可以互相通信,通过Kontrol的服务发现机制,一个Kite可以发现其它的Kites。也就是说一个Kite可以在Kontrol注册自己,从而让其它的kites能找到它; 

    Kontrol本身也是一个Kite,它用于对服务进行注册和鉴权;Kontrol 使用 etcd 作为后端存储, 当然,也可以用其它数据库替换,比如PostgreSQL。任何满足 kontrol.Storage接口的都可以作为后端存储。

    服务端:

    package main
    import (
        "net/url"
        "github.com/koding/kite"
    )
    
    func main() {
        k := kite.New("first", "1.0.0")
        k.Config.Port = 6000
        k.HandleFunc("square", func(r *kite.Request) (interface{}, error) {
            a := r.Args.One().MustFloat64()
            return a * a, nil
        })
    
        k.Register(&url.URL{Scheme: "http", Host: "localhost:6000/kite"})
        k.Run()
    }

    服务端调用Register方法将自己注册到Kontrol,使用的URL参数是其它kites连接本kite的地址,Kontrol会保存这个url,方便其它kites获取;

    客户端:

    package main
    
    import (
        "fmt"
        "github.com/koding/kite"
        "github.com/koding/kite/protocol"
    )
    
    func main() {
        k := kite.New("second", "1.0.0")
        // search a kite that has the same username and environment as us, but the
        // kite name should be "first"
        kites, _ := k.GetKites(&protocol.KontrolQuery{
            Username:    k.Config.Username,
            Environment: k.Config.Environment,
            Name:        "first",
        })
    
        // there might be several kites that matches our query
        client := kites[0]
        client.Dial()
        response, _ := client.Tell("square", 4)
        fmt.Println(response.MustFloat64())
    }

     GetKites方法会连接Kontrol,并获取符合查找条件的kites列表。

    本例子中是查找同一个用户名下面名为"first"的所有kites,如果该用户注册了10个名为"first"的kites,在client都能返回,调用方可以使用特定的负载均衡算法(例如round robin)选择其中一个。

    参考文档:

    Kite API

    https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/
    https://toutiao.io/posts/yfwvyt/preview

  • 相关阅读:
    第二阶段~JS中的各种循环语句
    项目一~达人美食图册详情
    项目一~达人行程
    项目一~美食达人图册
    项目一~机票2
    项目一~达人首页
    项目一~Hotel5
    pythonday02基础与运算符
    pythonday01计算机初步认识
    第六章 百度Apollo ROS介绍(2)
  • 原文地址:https://www.cnblogs.com/chenny7/p/6846925.html
Copyright © 2020-2023  润新知