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()
}

代码说明:

  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 =
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)选择其中一个。

参考文档:

Kite API

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

Go的微服务库kite的更多相关文章

  1. Soa: 一个轻量级的微服务库

    Soa 项目地址:Github:MatoApps/Soa 介绍 一个轻量级的微服务库,基于.Net 6 + Abp框架 可快速地将现有项目改造成为面向服务体系结构,实现模块间松耦合. 感谢 Rabbi ...

  2. 【GoLang】go 微服务框架 && Web框架学习资料

    参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化:  http://www.cnblogs.com/huligong1234/p/4707282.html Go 语 ...

  3. SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截

    项目依赖 SpringBoot 2.5.5 SpringCloud 2020.0.4 Alibaba Spring Cloud 2021.1 Mybatis Plus 3.4.0 Seata 1.4. ...

  4. 【GoLang】GoLang 微服务、开源库等参考资料

    参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries ...

  5. 【微服务No.2】polly微服务故障处理库

    熔断.降级: 熔断:熔断就是我们常说的“保险丝”,意为当服务出现某些状况时,切断服务,从而防止应用程序不断地常识执行可能会失败的操作造成系统的“雪崩”,或者大量的超时等待导致系统卡死等情况,很多地方也 ...

  6. Go+gRPC-Gateway(V2) 微服务实战,小程序登录鉴权服务(六):客户端基础库 TS 实战

    小程序登录鉴权服务,客户端底层 SDK,登录鉴权.业务请求.鉴权重试模块 Typescript 实战. 系列 云原生 API 网关,gRPC-Gateway V2 初探 Go + gRPC-Gatew ...

  7. kratos微服务框架学习笔记一(kratos-demo)

    目录 kratos微服务框架学习笔记一(kratos-demo) kratos本体 demo kratos微服务框架学习笔记一(kratos-demo) 今年大部分时间飘过去了,没怎么更博和githu ...

  8. 【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

    在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Frame ...

  9. WeText项目:一个基于.NET实现的DDD、CQRS与微服务架构的演示案例

    最近出于工作需要,了解了一下微服务架构(Microservice Architecture,MSA).我经过两周业余时间的努力,凭着自己对微服务架构的理解,从无到有,基于.NET打造了一个演示微服务架 ...

随机推荐

  1. Oracle DML容错处理(2)

    关于DML Error Logging效率的问题,摘自网上一篇文章,作为单独一篇说明,原文如下: DML Error Logging in Oracle 10g Database Release 2 ...

  2. CocosCreator动作系统

    废话没有,直接上代码,有注释可以看的, cc.Class({ extends: cc.Component, properties: { player:{ default:null, type:cc.N ...

  3. db2 OLAP函数使用

    说起 DB2 在线分析处理,可以用很好很强大来形容.这项功能特别适用于各种统计查询,这些查询用通常的SQL很难实现,或者根本就无发实现.首先,我们从一个简单的例子开始,来一步一步揭开它神秘的面纱,请看 ...

  4. 第二章 flex输入输出

    flex程序默认总是从标准输入读取, 实际上,词法分析程序都从文件读取输入 flex总是通过名为yyin的文件句柄读取输入, 下面的例子,我们修改单词计数程序,使得它能从文件读取输入 /* even ...

  5. 中文分词组件:thulac及jieba试用手记

    一.THULAC THULAC由<清华大学自然语言处理与社会人文计算实验室>研制推出的一套中文词法分析工具包.官网地址:http://thulac.thunlp.org,该项目提供了多种语 ...

  6. 探讨后端选型中不同语言及对应的Web框架

    在进行后端选型的时候,实际上我们要选择的是一个框架.后端领域所使用的技术和框架已经趋于稳定,我们只需要按我们的需要选择所需要的框架.当存在多个框架适合时,我们再选择适合的语言.不得不指出的是,当我们喜 ...

  7. 用十条命令在一分钟内检查 Linux 服务器性能

    原文地址: http://www.oschina.net/news/69132/linux-performance 如果你的Linux服务器突然负载暴增,告警短信快发爆你的手机,如何在最短时间内找出L ...

  8. dhtmlxtree 节点 展开收缩:新增了直接点 文本内容 也 实现了 展开收缩 功能(并记住了展开、收缩状态)

    dhtmlxtree 节点 展开收缩通常情况我们按 +- 就实现了 展开收缩 功能,为了方便我们新增了直接点 文本内容 也 实现了 展开收缩 功能(并记住了展开.收缩状态) tree = new dh ...

  9. 理解HTTP之keep-alive

    理解HTTP之keep-alive 在前面一篇文章中讲了TCP的keepalive,这篇文章再讲讲HTTP层面keep-alive.两种keepalive在拼写上面就是不一样的,只是发音一样,于是乎大 ...

  10. 解决无法安装Flash Player的问题

    1.同时搜索几个关键词:关键词用空格分开,例如:“中国 历史”会搜索显示同时包含中国.历史两个词的网页 2.排除某个关键词:被排除的词前面加上-号,例如“中国 历史 -清朝”会把有清朝两个字的网页过滤 ...