gn

package module
v1.8.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Dec 1, 2021 License: MIT Imports: 15 Imported by: 0

README

gn

简述

gn是一个基于linux下epoll的网络框架,目前只能运行在Linux下环境,gn可以配置处理网络事件的goroutine数量,相比golang原生库,在海量链接下,可以减少goroutine的开销,从而减少系统资源占用。

支持功能

1.tcp拆包粘包
通过调用系统recv_from函数,使用系统读缓存区实现拆包,减少用户态内存分配,使用sync.pool申请读写使用的字节数组,减少内存申请开销以及GC压力。
2.客户端超时踢出
可以设置超时时间,gn会定时检测超出超时的TCP连接(在指定时间内没有发送数据的连接),进行释放。

使用方式
package main

import (
	"github.com/alberliu/gn"

	"time"
)

var log = gn.GetLogger()

var server *gn.Server

var encoder = gn.NewHeaderLenEncoder(2, 1024)

type Handler struct {
}

func (Handler) OnConnect(c *gn.Conn) {
	log.Info("connect:", c.GetFd(), c.GetAddr())
}
func (Handler) OnMessage(c *gn.Conn, bytes []byte) {
	encoder.EncodeToFD(c.GetFd(), bytes)
	log.Info("read:", string(bytes))
}
func (Handler) OnClose(c *gn.Conn, err error) {
	log.Info("close:", c.GetFd(), err)
}

func main() {
	var err error
	server, err = gn.NewServer(":8080", Handler{}, gn.NewHeaderLenDecoder(2),
		gn.WithTimeout(1*time.Second, 5*time.Second), gn.WithReadBufferLen(10))
	if err != nil {
		log.Info("err")
		return
	}

	server.Run()
}

Documentation

Index

Constants

对端关闭连接 8193

View Source
const (
	EventIn      = 1 // 数据流入
	EventClose   = 2 // 断开连接
	EventTimeout = 3 // 检测到超时
)

Variables

View Source
var ErrNotEnough = errors.New("not enough")
View Source
var (
	ErrReadTimeout = errors.New("tcp read timeout")
)

Functions

func GetLogger

func GetLogger() logger

func NewHeaderLenEncoder

func NewHeaderLenEncoder(headerLen, writeBufferLen int) *headerLenEncoder

NewHeaderLenEncoder 创建基于头部长度的编码器 headerLen TCP包的头部内容,用来描述这个包的字节长度 writeBufferLen 服务器发送给客户端包的建议长度,当发送的包小于这个值时,会利用到内存池优化

func SetLogger

func SetLogger(l logger)

func TimeEncoder

func TimeEncoder(t time.Time, enc zapcore.PrimitiveArrayEncoder)

Types

type Buffer

type Buffer struct {
	// contains filtered or unexported fields
}

Buffer 读缓冲区,每个tcp长连接对应一个读缓冲区

func NewBuffer

func NewBuffer(bytes []byte) *Buffer

NewBuffer 创建一个缓存区

func (*Buffer) Cap

func (b *Buffer) Cap() int

Cap 返回总容量

func (*Buffer) GetBuf

func (b *Buffer) GetBuf() []byte

func (*Buffer) Len

func (b *Buffer) Len() int

Len 返回有效字节数组长度

func (*Buffer) Read

func (b *Buffer) Read(offset, limit int) ([]byte, error)

Read 舍弃offset个字段,读取n个字段,如果没有足够的字节,返回错误

func (*Buffer) ReadFromFD

func (b *Buffer) ReadFromFD(fd int) error

ReadFromFD 从文件描述符里面读取数据

func (*Buffer) ReadFromReader

func (b *Buffer) ReadFromReader(reader io.Reader) (int, error)

ReadFromReader 从reader里面读取数据,如果reader阻塞,会发生阻塞

func (*Buffer) Seek

func (b *Buffer) Seek(len int) ([]byte, error)

Seek 返回n个字节,而不产生移位,如果没有足够字节,返回错误

type Conn

type Conn struct {
	// contains filtered or unexported fields
}

Conn 客户端长连接

func (*Conn) Close

func (c *Conn) Close() error

Close 关闭连接

func (*Conn) CloseRead

func (c *Conn) CloseRead() error

CloseRead 关闭连接

func (*Conn) GetAddr

func (c *Conn) GetAddr() string

GetAddr 获取客户端地址

func (*Conn) GetBuffer

func (c *Conn) GetBuffer() *Buffer

GetBuffer 获取客户端地址

func (*Conn) GetData

func (c *Conn) GetData() interface{}

GetData 获取数据

func (*Conn) GetFd

func (c *Conn) GetFd() int32

GetFd 获取文件描述符

func (*Conn) Read

func (c *Conn) Read() error

Read 读取数据

func (*Conn) SetData

func (c *Conn) SetData(data interface{})

SetData 设置数据

func (*Conn) Write

func (c *Conn) Write(bytes []byte) (int, error)

Write 写入数据

type Decoder

type Decoder interface {
	Decode(c *Conn) error
}

Decoder 解码器

func NewHeaderLenDecoder

func NewHeaderLenDecoder(headerLen int) Decoder

NewHeaderLenDecoder 创建基于头部长度的解码器 headerLen TCP包的头部内容,用来描述这个包的字节长度 readMaxLen 所读取的客户端包的最大长度,客户端发送的包不能超过这个长度

type Encoder

type Encoder interface {
	EncodeToFD(fd int32, bytes []byte) error
}

Encoder 编码器

type Handler

type Handler interface {
	OnConnect(c *Conn)               // OnConnect 当TCP长连接建立成功是回调
	OnMessage(c *Conn, bytes []byte) // OnMessage 当客户端有数据写入是回调
	OnClose(c *Conn, err error)      // OnClose 当客户端主动断开链接或者超时时回调,err返回关闭的原因
}

Handler Server 注册接口

type Option

type Option interface {
	// contains filtered or unexported methods
}

func WithAcceptGNum

func WithAcceptGNum(num int) Option

WithAcceptGNum 设置建立连接的goroutine数量

func WithIOEventQueueLen

func WithIOEventQueueLen(num int) Option

WithIOEventQueueLen 设置IO事件队列长度,默认值是1024

func WithIOGNum

func WithIOGNum(num int) Option

WithIOGNum 设置处理IO的goroutine数量

func WithReadBufferLen

func WithReadBufferLen(len int) Option

WithReadBufferLen 设置缓存区大小

func WithTimeout

func WithTimeout(timeoutTicker, timeout time.Duration) Option

WithTimeout 设置TCP超时检查的间隔时间以及超时时间

type Server

type Server struct {
	// contains filtered or unexported fields
}

Server TCP服务

func NewServer

func NewServer(address string, handler Handler, decoder Decoder, opts ...Option) (*Server, error)

NewServer 创建server服务器

func (*Server) GetConn

func (s *Server) GetConn(fd int32) (*Conn, bool)

GetConn 获取Conn

func (*Server) GetConnsNum

func (s *Server) GetConnsNum() int64

GetConnsNum 获取当前长连接的数量

func (*Server) Run

func (s *Server) Run()

Run 启动服务

func (*Server) Stop

func (s *Server) Stop()

Stop 启动服务

Directories

Path Synopsis
test

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL