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 =
k.Run()
}
代码说明:
- kite.New创建了一个名字为"first",版本号为"1.0.0"的Kite;
- k.Config 用于设置Kite的属性,比如端口号;
- 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())
}
代码说明:
- NewClient方法指定需要连接的服务端的URL;
- 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 =
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", )
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 =
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[]
client.Dial()
response, _ := client.Tell("square", )
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
最新文章
- 【SAP业务模式】之ICS(七):IDOC配置
- salesforce 零基础学习(五十四)常见异常友好消息提示
- Android layout_weight理解
- 爱上MVC3~布局页的继承与扩展
- ubuntu14.04 server 安装vmware worktation 12
- Dynamic Time Warping 动态时间规整算法
- javascript-this,call,apply,bind简述1
- iOS学习之UIScrollView
- RobotFramework+Selenium2library+Appium+Python+RIDE安装指南
- webpack的配置及使用
- 【Android基础】Activity之间进行参数传递的三种方式
- Union 与 Union all 区别
- Greys学习笔记(未完待续)
- (二叉树 递归) leetcode 105. Construct Binary Tree from Preorder and Inorder Traversal
- Centos虚拟环境工具virtualenvwrapper
- Java的家庭记账本程序(B)
- short s1 = 1; s1 = s1 + 1;和 short s1 = 1; s1 += 1;的问题,终于弄懂了
- WinForm中实现Loading加载界面
- 数据规整化:pandas 求合并数据集(交集并集等)
- PHP + Smarty + html5 构建Wap应用
热门文章
- linux系统下shell命令中的sleep
- 使用 IntraWeb (34) - TIWAJAXNotifier
- 利用Delphi编写IE扩展
- Java时间串获取(格式:yyyyMMddHHmmss)
- 隐藏控件--HiddenField控件
- Asp.net Core中使用Redis 来保存Session, 读取配置文件
- Tensorflow 之finetune微调模型方法&;&;不同层上设置不同的学习率
- SpringCloud服务间调用
- 基于window自带功能生成目录树
- struts2:使用JQuery、JSON和AJAX处理请求