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

定义了一个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())
}

服务注册和发现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

时间: 2024-08-09 14:33:01

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

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

参考资料: 通过beego快速创建一个Restful风格API项目及API文档自动化:  http://www.cnblogs.com/huligong1234/p/4707282.html Go 语言构建 RESTful Web 服务:  https://www.oschina.net/translate/hardcore-google-communicating-go Golang中使用 JWT认证来 保障Restful JSON API的安全(英文):   http://www.tuico

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

参考资料: GoLang书籍: https://github.com/dariubs/GoBooksGo名库: https://github.com/Unknwon/go-rock-libraries-showcasesGoLang中国: http://golangtc.com/Spring Boot实现微服务: http://blog.netgloo.com/2014/10/06/spring-boot-data-access-with-jpa-hibernate-and-mysql/Spri

微服务改造中解决跨库问题的思路

今年一直在和团队做微服务的架构改造(相关的一些详情,有兴趣的朋友,可以参见之前的这篇分享).但是做过改造的朋友都知道 从“All-In-One” 到 “Micro-Service” 都需要迈过的一个坎,那就是垂直分库, 根据不同的子服务,将数据库拆分为不同的子服务库. 那么问题就来了,在开始做微服务改造前,我发现在摇旺的老系统中,有很多后台报表或者前端详情页所需的数据是通过SQL Join来完成的.但是,我们微服务改造后,每个服务背后的数据库已经在分布不同的实例中了,所以我们已经不能继续简单在S

创建微服务?请先回答这10个问题

原文地址:http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=401654497&idx=1&sn=5cac9aa4ae113592e1513c1ff70ea917&scene=21#wechat_redirect 乍一看微服务似乎很容易构建,但是要真正构建微服务,要完成的工作可比在容器里运行一些代码,并在这些代码间使用HTTP请求进行通信,要多得多.在开发新的微服务之前--必须得在新服务部署到生产环境之前--你需要回答

使用Ratpack和Spring Boot打造高性能的JVM微服务应用

使用Ratpack和Spring Boot打造高性能的JVM微服务应用 这是我为InfoQ翻译的文章,原文地址:Build High Performance JVM Microservices with Ratpack & Spring Boot,InfoQ上的中文地址:使用Ratpack与Spring Boot构建高性能JVM微服务. 在微服务天堂中Ratpack和Spring Boot是天造地设的一对.它们都是以开发者为中心的运行于JVM之上的web框架,侧重于生产率.效率以及轻量级部署.他

微服务架构

互联网保险O2O平台微服务架构设计 关于架构,笔者认为并不是越复杂越好,而是相反,简单就是硬道理也提现在这里.这也是微服务能够流行的原因,看看市场上曾经出现的服务架构:EJB.SCA.Dubbo等等,都比微服务先进,都比微服务功能完善,但它们都没有微服务这么深入民心,就是因为他们过于复杂.简单就是高科技,苹果手机据说专门有个团队研究如何能让用户更加简单的操作.大公司都是由小公司发展起来的,如果小公司在开始技术选型时感觉某个框架费时费力就不会选择,而小公司发展到大公司的过程,一般也伴随着系统不断优

微服务设计--(1)

微服务是一宗分布式系统解决方案,推动细粒度服务的试用,这些服务协同工作,且每个服务都有自己的生命周期.因为微服务主要围绕业务领域建模,所以避免了有传统的分层架构引发的很多问题. 1.微服务 背景 随着领域驱动设计,持续交付,按需虚拟化,基础设施自动化,小型自制团队,大型集群系统这些实践的流行,微服务孕育而生 定义 微服务就是一些协同工作的小而自制的服务 特点 很小,专注做一件事情 内聚性:把因相同原因而变化的东西聚合在一起,把因不同原因而变化的东西分离出来 边界划分原则:在一两个周内完全可以重写

微服务架构——不是免费的午餐

当我開始了解<微服务架构>的时候,我发现里面的中文文章是相当的少,于是開始试着翻译一些文章,比方这一篇<微服务--不是免费的午餐>.这篇文章是在某次讨论结束后听到的,和之前相似的是这样的差别有点相似于之前说的微内核与宏内核的差别. 译文例如以下: 文章是由Contino公司的CTO,Benjamin Wootton写的.Contino是一家在伦敦的咨询公司,专注于DevOps和持续支付. Microservices are a style of software architect

理解微服务

当前微服务很热,大家都号称在使用微服务架构,但究竟什么是微服务架构?微服务架构是不是发展趋势?对于这些问题,我们都缺乏清楚的认识,本文基于作者在大型互联网系统的服务化实践和思考,和大家一起探讨微服务架构.本文主要内容包括: 1.   传统SOA架构 2.   新型SOA架构 3.   服务设计方式 4.   深入微服务 5.   微服务体系 6.   微服务系统架构 传统SOA架构 说到微服务,离不开SOA,两者经常放一起讨论,首先我们要了解SOA架构. 国外信息化起步较早,很多大公司先后建设了