2024-05-28 21:09:28 +08:00
2024-05-08 16:35:49 +08:00
2024-03-04 13:34:31 +08:00
2024-03-06 21:03:22 +08:00
2024-04-10 15:10:07 +08:00
2023-12-10 20:07:34 +08:00
2024-05-16 15:13:08 +08:00
2024-02-23 20:11:59 +08:00
2024-02-23 20:11:59 +08:00

Frontier是一个go开发的开源长连接网关能让微服务直接连通边缘节点或客户端反之边缘节点或客户端也能直接连通到微服务。对于微服务或者边缘节点提供了单双向RPC调用消息发布和接收以及直接点对点拨通通信的特性。Frontier采用云原生架构可以使用Operator快速部署一个集群轻松实现百万连接。

特性

  • RPC远程过程调用微服务可以直接Call到边缘节点的注册函数同样的边缘节点也可以Call到微服务的注册函数并且在微服务侧支持负载均衡。
  • 消息发布和接收微服务可以直接Publish到边缘节点的topic同样的边缘节点也可以Publish到微服务的topic或外部消息队列的topic微服务侧的topic支持负载均衡。
  • 多路复用(点到点拨通);微服务可以直接在边缘节点上打开一个新流(连接),你可以在这个新连接上封装例如流读写、拷贝文件、代理等,天堑变通途。
  • 上线离线控制边缘节点微服务可以注册边缘节点获取ID、上线和下线回调当边缘节点请求ID、上线或者离线时Frontier会调用这个回调。
  • API简单SDK提供在项目的api目录下分别对边缘和微服务提供了封装好的sdk你可以非常简单和轻量的基于这个sdk做开发。
  • 部署简单支持多种部署方式如docker、docker-compose、k8s-helm以及operator来部署和管理你的Frontier实例。
  • 水平扩展提供了Frontiter和Frontlas集群在单实例性能达到瓶颈下可以水平扩展Frontier实例。
  • 高可用Frontlas具有集群视角你可以使用微服务和边缘节点永久重连的sdk在当前Frontier宕机情况下新选择一个可用Frontier实例继续服务。

架构

Frontier架构

  • Service End微服务侧的功能入口
  • Edge End边缘节点或客户端侧的功能入口
  • Publish/Receive发布和接收消息
    • Topic发布和接收消息的主题
  • Call/Register调用和注册函数
    • Method调用和注册的函数名
  • OpenStream/AcceptStream打开和接收点到点连接

使用

Service

微服务侧获取Service

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
		dialer := func() (net.Conn, error) {
			return net.Dial("tcp", "127.0.0.1:30011")
		}
		svc, err := service.NewService(dialer)
		// 开始使用service
}

Service接收获取ID、上线/离线通知

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30011")
	}
	svc, _ := service.NewService(dialer)
	srv.RegisterGetEdgeID(context.TODO(), getID)
	srv.RegisterEdgeOnline(context.TODO(), online)
	srv.RegisterEdgeOffline(context.TODO(), offline)
}

// service可以根据meta分配id给edge
func getID(meta []byte) (uint64, error) {
	return 0, nil
}

func online(edgeID uint64, meta []byte, addr net.Addr) error {
	return nil
}

func offline(edgeID uint64, meta []byte, addr net.Addr) error {
	return nil
}

Service发布消息到Edge

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30011")
	}
	svc, _ := service.NewService(dialer)
	msg := srv.NewMessage([]byte("test"))
	// 发布一条消息到ID为1001的边缘节点
	err = srv.Publish(context.TODO(), 1001, msg)
}

Service调用Edge的RPC

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30011")
	}
	svc, _ := service.NewService(dialer)
	req := srv.NewRequest([]byte("test"))
	// 调用ID为1001边缘节点的foo方法前提是边缘节点需要预注册该方法
	rsp, err := srv.Call(context.TODO(), edgeID, "foo", req)
}

Service打开Edge的点到点流

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30011")
	}
	svc, _ := service.NewService(dialer)
	// 打开ID为1001边缘节点的新流同时st也是一个net.Conn前提是edge需要AcceptStream接收该流
	st, err := srv.OpenStream(context.TODO(), 1001)
}

Service注册方法以供Edge调用

package main

import "github.com/singchia/frontier/api/dataplane/v1/service"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30011")
	}
	svc, _ := service.NewService(dialer)
	// 注册一个"echo"方法
	srv.Register(context.TODO(), "echo", echo)
}

func echo(ctx context.Context, req geminio.Request, rsp geminio.Response) {
	value := req.Data()
	rsp.SetData(value)
}

Service声明接收Topic

Edge

边缘节点侧获取Edge

package main

import "github.com/singchia/frontier/api/dataplane/v1/edge"

func main() {
	dialer := func() (net.Conn, error) {
		return net.Dial("tcp", "127.0.0.1:30012")
	}
	eg, err := edge.NewEdge(dialer)
	// 开始使用eg
}

部署

默认端口

  • 30011提供给微服务连接获取Service的端口
  • 30012提供给边缘节点连接获取Edge的端口
  • 30010提供给运维人员或者程序使用的控制面端口

docker


docker-compose


helm


集群

Frontier + Frontlas架构

参与开发

如果你发现任何Bug请提出Issue项目Maintainers会及时响应相关问题。

如果你希望能够提交Feature更快速解决项目问题满足以下简单条件下欢迎提交PR

  • 代码风格保持一致
  • 每次提交一个Feature
  • 提交的代码都携带单元测试

许可证

Released under the Apache License 2.0

Description
The first open source cloud-native tcp gateway for edges. 首个开源云原生tcp/udp长连接网关,支持rpc、消息和流,微服务和边缘节点/客户端互相直达!完美匹配mesh vpn、内网穿透、边缘管理、iot网关等场景
Readme Apache-2.0 15 MiB
Languages
Go 95.8%
Makefile 3.2%
Lua 0.6%
Dockerfile 0.3%
Shell 0.1%