标签:stack 用户 rip 顺序 地址 tps strong .com nod
Kite是用Go开发的一套RPC库,很适合作为分布式微服务的开发框架。
Kite 的传输层使用 SockJS 提供的WebSocket服务, 浏览器Javascript也可以连接到Kite上 (Kite.js);
Kite 的RPC消息格式使用修改过的 dnode 协议,Kite 增加了 session 和 authentication 层, 用于Kites 的发现和识别。
标识一个Kite的参数如下:
注意:以上参数的顺序很重要;
如下面的例子:
服务端:
package main import "github.com/koding/kite" func main() { k := kite.New("first", "1.0.0") k.Config.Port = 6000 k.Run() }
代码说明:
客户端:
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()) }
代码说明:
下面再来看看怎么调用一个自定义方法:
服务端:
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() }
定义了一个squid方法,对应的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()) }
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)选择其中一个。
参考文档:
https://blog.gopheracademy.com/birthday-bash-2014/kite-microservice-library/
https://toutiao.io/posts/yfwvyt/preview
标签:stack 用户 rip 顺序 地址 tps strong .com nod
原文地址:http://www.cnblogs.com/chenny7/p/6846925.html