readme: update

This commit is contained in:
singchia
2024-05-30 00:01:31 +08:00
parent 104d684af9
commit 7678b82d10

View File

@@ -2,14 +2,14 @@
<img src="./docs/diagram/frontier-logo.png" width="30%" height="30%">
</p>
Frontier是一个go开发的开源长连接网关让微服务直接连通边缘节点或客户端,反之边缘节点或客户端也能直接连通到微服务。对于微服务或者边缘节点提供了单双向RPC调用消息发布和接收以及直接点对点拨通通信的特性。Frontier采用云原生架构可以使用Operator快速部署一个集群轻松实现百万连接
Frontier是一个go开发的开源长连接网关旨在让微服务直边缘节点或客户端,反之边缘节点或客户端也同样直达微服务。对于两者提供了单双向RPC调用消息发布和接收以及点对点通信的功能。Frontier符合云原生架构可以使用Operator快速部署一个集群具有高可用和弹性,轻松支撑百万边缘节点或客户端在线的需求
## 特性
- **RPC** 微服务和边缘可以Call对方的函数提前注册并且在微服务侧支持负载均衡
- **消息** 微服务和边缘可以Publish对方的Topic边缘可以Publish到外部MQ的Topic微服务侧支持负载均衡
- **多路复用** 微服务可以直接在边缘节点打开一个流(连接),可以封装例如文件上传、代理等,天堑变通途
- **流/多路复用** 微服务可以直接在边缘节点打开一个流(连接),可以封装例如文件上传、代理等,天堑变通途
- **上线离线控制** 微服务可以注册边缘节点获取ID、上线离线回调当这些事件发生Frontier会调用这些方法
- **API简单** 在项目api目录下分别对边缘和微服务提供了封装好的sdk可以非常简单的基于这个sdk做开发
- **部署简单** 支持多种部署方式(docker docker-compose helm以及operator)来部署Frontier实例或集群
@@ -30,22 +30,26 @@ Frontier是一个go开发的开源长连接网关能让微服务直接连通
- _Call/Register_调用和注册函数
- _OpenStream/AcceptStream_打开和接收点到点流连接
Frontier需要微服务和边缘节点两方都主动连接到Frontier这种设计的优势在不需要Frontier主动连接任何一个地址Service和Edge的元信息可以在连接的时候携带过来。连接的默认端口是
Frontier需要微服务和边缘节点两方都主动连接到FrontierService和Edge的元信息接收TopicRPCService名等可以在连接的时候携带过来。连接的默认端口是:
- ```30011```提供给微服务连接获取Service
- ```30012```提供给边缘节点连接获取Edge
- ```30010```提供给运维人员或者程序使用的控制面
- ```:30011``` 提供给微服务连接获取Service
- ```:30012``` 提供给边缘节点连接获取Edge
- ```:30010``` 提供给运维人员或者程序使用的控制面
详情见部署章节
### 功能
| First Header | Second Header |
| ------------- | ------------- |
| Content Cell | Content Cell |
| Content Cell | Content Cell |
## 使用
### 示例
> examples/chatroom
该目录下有简单的聊天室示例仅100行代码来实现一个聊天室功能可以通过
目录[examples/chatroom](./examples/chatroom)下有简单的聊天室示例仅100行代码实现一个的聊天室功能可以通过
```
make examples
@@ -55,9 +59,10 @@ make examples
https://github.com/singchia/frontier/assets/15531166/18b01d96-e30b-450f-9610-917d65259c30
可以看到上线离线通知消息Publish等功能
在这个示例你可以看到上线离线通知消息Publish等功能
### Service
### 微服务如何使用
**微服务侧获取Service**
@@ -66,7 +71,6 @@ package main
import (
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -79,7 +83,7 @@ func main() {
}
```
**Service接收获取ID、上线/离线通知**
**微服务接收获取ID、上线/离线通知**
```golang
package main
@@ -87,7 +91,6 @@ package main
import (
"context"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -117,7 +120,7 @@ func offline(edgeID uint64, meta []byte, addr net.Addr) error {
}
```
**Service发布消息到Edge**
**微服务发布消息到边缘节点**
前提需要该Edge在线否则会找不到Edge
@@ -127,7 +130,6 @@ package main
import (
"context"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -142,7 +144,7 @@ func main() {
}
```
**Service调用Edge的RPC**
**微服务调用边缘节点的RPC**
```golang
package main
@@ -150,7 +152,6 @@ package main
import (
"context"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -164,7 +165,7 @@ func main() {
}
```
**Service打开Edge的点到点流**
**微服务打开边缘节点的点到点流**
```golang
package main
@@ -172,7 +173,6 @@ package main
import (
"context"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -187,7 +187,7 @@ func main() {
```
基于这个新打开流,你可以用来传递文件、代理流量等。
**Service注册方法以供Edge调用**
**微服务注册方法以供边缘节点调用**
```golang
package main
@@ -195,7 +195,6 @@ package main
import (
"context"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -214,7 +213,7 @@ func echo(ctx context.Context, req geminio.Request, rsp geminio.Response) {
}
```
**Service声明接收Topic**
**微服务声明接收Topic**
```golang
package main
@@ -224,7 +223,6 @@ import (
"fmt"
"io"
"net"
"github.com/singchia/frontier/api/dataplane/v1/service"
)
@@ -249,7 +247,7 @@ func main() {
}
```
### Edge
### 边缘节点/客户端如何使用
**边缘节点侧获取Edge**
@@ -258,7 +256,6 @@ package main
import (
"net"
"github.com/singchia/frontier/api/dataplane/v1/edge"
)
@@ -280,7 +277,6 @@ package main
import (
"net"
"github.com/singchia/frontier/api/dataplane/v1/edge"
)
@@ -302,7 +298,6 @@ package main
import (
"net"
"github.com/singchia/frontier/api/dataplane/v1/edge"
)
@@ -320,9 +315,10 @@ func main() {
### 控制面
Frontier控制面提供gRPC和rest接口运维人员可以使用这些api来确定本实例的连接情况定义在
Frontier控制面提供gRPC和Rest接口运维人员可以使用这些api来确定本实例的连接情况gRPC和Rest都由默认端口```:30010```提供服务。
**GRPC** 详见[Protobuf定义](./api/controlplane/frontier/v1/controlplane.proto)
> api/controlplane/frontier/v1/controlplane.proto
```protobuf
service ControlPlane {
@@ -348,15 +344,26 @@ service ControlPlane {
}
```
Swagger文档请见[swagger](./docs/swagger/swagger.yaml)
**REST** Swagger见[Swagger定义](./docs/swagger/swagger.yaml)
**注意**
例如你可以使用下面请求来踢出某个边缘节点下线
当你配置dao backend使用sqlite3时count才会返回总数默认使用buntdb为性能考虑这个值返回-1
```
curl -X DELETE http://127.0.0.1:30010/v1/edges/{edge_id}
```
或查看某个微服务注册了哪些RPC
```
curl -X GET http://127.0.0.1:30010/v1/services/rpcs?service_id={service_id}
```
注意gRPC/Rest依赖dao backend有两个选项```buntdb```和```sqlite```都是使用的in-memory模式为性能考虑默认backend使用buntdb并且列表接口返回字段count永远是-1当你配置backend为sqlite3时会认为你对在Frontier上连接的微服务和边缘节点有强烈的OLTP需求例如在Frontier上封装web此时count才会返回总数。
## Frontier配置
如果需要更近一步定制你的Frontier实例可以在这一节了解各个配置是如何工作的。
### TLS
```
@@ -382,7 +389,6 @@ tls:
docker run -d --name frontier -p 30011:30011 -p 30012:30012 singchia/frontier:1.0.0
```
然后你可以使用上面所说的iclm示例来测试功能性
### docker-compose
@@ -394,6 +400,8 @@ docker-compose up -d frontier
### helm
如果你是在k8s环境下可以使用helm快速部署一个实例默认
```
git clone https://github.com/singchia/frontier.git
cd dist/helm
@@ -407,13 +415,26 @@ helm install frontier ./ -f values.yaml
<img src="./docs/diagram/frontlas.png" width="100%" height="100%">
新增Frontlas组件用于构建集群Frontlas同样也是无状态组件并不在内存里留存其他信息因此需要额外依赖Redis你需要
新增Frontlas组件用于构建集群Frontlas同样也是无状态组件并不在内存里留存其他信息因此需要额外依赖Redis你需要提供一个Redis连接信息给到Frontlas支持 ```redis``` ```sentinel```和```redis-cluster```。
- _Frontier_微服务和边缘数据面通信组件
- _Frontlas_集群管理组件将微服务和边缘的元信息、活跃信息记录在Redis里
Frontier需要主动连接Frontlas以上报自己、微服务和边缘的活跃和状态默认Frontlas的端口是
- ```:40011``` 提供给微服务连接代替微服务在单Frontier实例下连接的30011端口
- ```:40012``` 提供给Frontier连接上报状态
### 使用
### 分布式
当部署多个Frontier实例时跨实例的微服务和边缘节点寻址一定需要分布式存储如果没有Frontlas这部分的存储工作
### 高可用
### 水平扩展
## k8s
### Operator