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. C++的多态

    继承.封装.多态是面向对象编程最主要的三个特征,有人说多态是理解C++最难理解的一部分,其实我觉得单单从技术上讲,多态并不难,难的是你需要懂得在何时使用多态,就像封装一样,封装本身不难,难的是你对整个 ...

  2. linux sendmail 发送缓慢的问题

    这个问题关键就是hosts里面对于本机host的设置有问题,你可以看下/var/log/mail.log retry 和 sleeping,再加上其他时间,用sendmail发送邮件等这么久,太累了吧 ...

  3. java程序中实现打开 某个指定浏览器

    package com.test; import java.lang.reflect.Method; //实现打开浏览器并跳到指定网址的类 public class BareBonesBrowserL ...

  4. python接口自动化28-requests-html爬虫框架

    前言 requests库的好,只有用过的人才知道,最近这个库的作者又出了一个好用的爬虫框架requests-html.之前解析html页面用过了lxml和bs4, requests-html集成了一些 ...

  5. Asp.Net JsonResult重写

    在Json序列化工具中,Newtonsoft.Json 的工具包相对比较好用. 对于循环引用.序列化格式.时间格式等都提供了可配置. 如果想重写Mvc 自带 JsonResult 返回结果,提供了2中 ...

  6. oracle11g-linux 归档处理

    在使用oracle时突然登录不上去了提示:ORA-00257:archiver error.Connect internal only,until freed. 查遍很多资料,都指向“归档日志空间不足 ...

  7. MSVC 12: compiler error in boost/type_traits/common_type.hpp

    来自: https://svn.boost.org/trac10/ticket/11885 MSVC 12: compiler error in boost/type_traits/common_ty ...

  8. 【T03】理解私有地址和NAT

    1.私有地址包括三块: 10.0.0.0 到 10.255.255.255 172.16.0.0 到 172.31.0.0 192.168.0.0 到 192.168.255.255 2.私有地址接入 ...

  9. CentOS7下 让Docker pull命令使用squid做http代理拉取目标镜像仓库的镜像

    场景,如下图所示: 服务器B具有两个网卡,分别和服务器A和服务器C互通,这里想要在服务器C上借助服务器B作为桥梁,拉取镜像仓库服务器A上的镜像. 思路也很简单,在服务器上搭建HTTP代理服务,服务器C ...

  10. 使用 .toLocaleString() 轻松实现多国语言价格数字格式化

    用代码对数字进行格式化,显然不是逢三位加逗号这么简单.比如印度在数字分位符号上的处理,就堪称业界奇葩: 印度的数字读法用“拉克”(十万)和“克若尔”(千万),数字标法用不对称的数位分离,即小数点左侧首 ...