An efficient, extensible and easy-to-use RPC framework.

Overview

eRPC GitHub release report card github issues github closed issues GoDoc view examples

eRPC is an efficient, extensible and easy-to-use RPC framework.

Suitable for RPC, Microservice, Peer-to-Peer, IM, Game and other fields.

简体中文

eRPC-Framework

Install

  • go vesion ≥ 1.11

  • install

GO111MODULE=on go get -u -v -insecure github.com/henrylee2cn/erpc/v6
  • import
import "github.com/henrylee2cn/erpc/v6"

Feature

  • Use peer to provide the same API package for the server and client
  • Provide multi-layout abstractions such as:
    • peer
    • session/socket
    • router
    • handle/context
    • message
    • protocol
    • codec
    • transfer filter
    • plugin
  • Support reboot and shutdown gracefully
  • HTTP-compatible message format:
    • Composed of two parts, the Header and the Body
    • Header contains metadata in the same format as HTTP header
    • Body supports for custom codec of Content Type-Like, already implemented:
      • Protobuf
      • Thrift
      • JSON
      • XML
      • Form
      • Plain
    • Support push, call-reply and more message types
  • Support custom message protocol, and provide some common implementations:
    • rawproto - Default high performance binary protocol
    • jsonproto - JSON message protocol
    • pbproto - Ptotobuf message protocol
    • thriftproto - Thrift message protocol
    • httproto - HTTP message protocol
  • Optimized high performance transport layer
    • Use Non-block socket and I/O multiplexing technology
    • Support setting the size of socket I/O buffer
    • Support setting the size of the reading message (if exceed disconnect it)
    • Support controling the connection file descriptor
  • Support a variety of network types:
    • tcp
    • tcp4
    • tcp6
    • unix
    • unixpacket
    • kcp
    • quic
    • other
      • websocket
      • evio
  • Provide a rich plug-in point, and already implemented:
    • auth
    • binder
    • heartbeat
    • ignorecase(service method)
    • overloader
    • proxy(for unknown service method)
    • secure
  • Powerful and flexible logging system:
    • Detailed log information, support print input and output details
    • Support setting slow operation alarm threshold
    • Support for custom implementation log component
  • Client session support automatically redials after disconnection

Benchmark

Self Test

  • A server and a client process, running on the same machine

  • CPU: Intel Xeon E312xx (Sandy Bridge) 16 cores 2.53GHz

  • Memory: 16G

  • OS: Linux 2.6.32-696.16.1.el6.centos.plus.x86_64, CentOS 6.4

  • Go: 1.9.2

  • Message size: 581 bytes

  • Message codec: protobuf

  • Sent total 1000000 messages

  • erpc

client concurrency mean(ms) median(ms) max(ms) min(ms) throughput(TPS)
100 1 0 16 0 75505
500 9 11 97 0 52192
1000 19 24 187 0 50040
2000 39 54 409 0 42551
5000 96 128 1148 0 46367
  • erpc/socket
client concurrency mean(ms) median(ms) max(ms) min(ms) throughput(TPS)
100 0 0 14 0 225682
500 2 1 24 0 212630
1000 4 3 51 0 180733
2000 8 6 64 0 183351
5000 21 18 651 0 133886

Comparison Test

Environment Throughputs Mean Latency P99 Latency

More Detail

  • Profile torch of erpc/socket

erpc_socket_profile_torch

svg file

  • Heap torch of erpc/socket

erpc_socket_heap_torch

svg file

Example

server.go

package main

import (
	"fmt"
	"time"

	"github.com/henrylee2cn/erpc/v6"
)

func main() {
	defer erpc.FlushLogger()
	// graceful
	go erpc.GraceSignal()

	// server peer
	srv := erpc.NewPeer(erpc.PeerConfig{
		CountTime:   true,
		ListenPort:  9090,
		PrintDetail: true,
	})
	// srv.SetTLSConfig(erpc.GenerateTLSConfigForServer())

	// router
	srv.RouteCall(new(Math))

	// broadcast per 5s
	go func() {
		for {
			time.Sleep(time.Second * 5)
			srv.RangeSession(func(sess erpc.Session) bool {
				sess.Push(
					"/push/status",
					fmt.Sprintf("this is a broadcast, server time: %v", time.Now()),
				)
				return true
			})
		}
	}()

	// listen and serve
	srv.ListenAndServe()
}

// Math handler
type Math struct {
	erpc.CallCtx
}

// Add handles addition request
func (m *Math) Add(arg *[]int) (int, *erpc.Status) {
	// test meta
	erpc.Infof("author: %s", m.PeekMeta("author"))
	// add
	var r int
	for _, a := range *arg {
		r += a
	}
	// response
	return r, nil
}

client.go

package main

import (
	"time"

	"github.com/henrylee2cn/erpc/v6"
)

func main() {
	defer erpc.SetLoggerLevel("ERROR")()

	cli := erpc.NewPeer(erpc.PeerConfig{})
	defer cli.Close()
	// cli.SetTLSConfig(&tls.Config{InsecureSkipVerify: true})

	cli.RoutePush(new(Push))

	sess, stat := cli.Dial(":9090")
	if !stat.OK() {
		erpc.Fatalf("%v", stat)
	}

	var result int
	stat = sess.Call("/math/add",
		[]int{1, 2, 3, 4, 5},
		&result,
		erpc.WithAddMeta("author", "henrylee2cn"),
	).Status()
	if !stat.OK() {
		erpc.Fatalf("%v", stat)
	}
	erpc.Printf("result: %d", result)
	erpc.Printf("Wait 10 seconds to receive the push...")
	time.Sleep(time.Second * 10)
}

// Push push handler
type Push struct {
	erpc.PushCtx
}

// Push handles '/push/status' message
func (p *Push) Status(arg *string) *erpc.Status {
	erpc.Printf("%s", *arg)
	return nil
}

More Examples

Usage

Peer(server or client) Demo

// Start a server
var peer1 = erpc.NewPeer(erpc.PeerConfig{
    ListenPort: 9090, // for server role
})
peer1.Listen()

...

// Start a client
var peer2 = erpc.NewPeer(erpc.PeerConfig{})
var sess, err = peer2.Dial("127.0.0.1:8080")

Call-Struct API template

type Aaa struct {
    erpc.CallCtx
}
func (x *Aaa) XxZz(arg *<T>) (<T>, *erpc.Status) {
    ...
    return r, nil
}
  • register it to root router:
// register the call route
// HTTP mapping: /aaa/xx_zz
// RPC mapping: Aaa.XxZz
peer.RouteCall(new(Aaa))

// or register the call route
// HTTP mapping: /xx_zz
// RPC mapping: XxZz
peer.RouteCallFunc((*Aaa).XxZz)

Service method mapping

  • The default mapping(HTTPServiceMethodMapper) of struct(func) name to service methods:

    • AaBb -> /aa_bb
    • ABcXYz -> /abc_xyz
    • Aa__Bb -> /aa_bb
    • aa__bb -> /aa_bb
    • ABC__XYZ -> /abc_xyz
    • Aa_Bb -> /aa/bb
    • aa_bb -> /aa/bb
    • ABC_XYZ -> /abc/xyz
    erpc.SetServiceMethodMapper(erpc.HTTPServiceMethodMapper)
  • The mapping(RPCServiceMethodMapper) of struct(func) name to service methods:

    • AaBb -> AaBb
    • ABcXYz -> ABcXYz
    • Aa__Bb -> Aa_Bb
    • aa__bb -> aa_bb
    • ABC__XYZ -> ABC_XYZ
    • Aa_Bb -> Aa.Bb
    • aa_bb -> aa.bb
    • ABC_XYZ -> ABC.XYZ
    erpc.SetServiceMethodMapper(erpc.RPCServiceMethodMapper)

Call-Function API template

func XxZz(ctx erpc.CallCtx, arg *<T>) (<T>, *erpc.Status) {
    ...
    return r, nil
}
  • register it to root router:
// register the call route
// HTTP mapping: /xx_zz
// RPC mapping: XxZz
peer.RouteCallFunc(XxZz)

Push-Struct API template

type Bbb struct {
    erpc.PushCtx
}
func (b *Bbb) YyZz(arg *<T>) *erpc.Status {
    ...
    return nil
}
  • register it to root router:
// register the push handler
// HTTP mapping: /bbb/yy_zz
// RPC mapping: Bbb.YyZz
peer.RoutePush(new(Bbb))

// or register the push handler
// HTTP mapping: /yy_zz
// RPC mapping: YyZz
peer.RoutePushFunc((*Bbb).YyZz)

Push-Function API template

// YyZz register the handler
func YyZz(ctx erpc.PushCtx, arg *<T>) *erpc.Status {
    ...
    return nil
}
  • register it to root router:
// register the push handler
// HTTP mapping: /yy_zz
// RPC mapping: YyZz
peer.RoutePushFunc(YyZz)

Unknown-Call-Function API template

func XxxUnknownCall (ctx erpc.UnknownCallCtx) (interface{}, *erpc.Status) {
    ...
    return r, nil
}
  • register it to root router:
// register the unknown call route: /*
peer.SetUnknownCall(XxxUnknownCall)

Unknown-Push-Function API template

func XxxUnknownPush(ctx erpc.UnknownPushCtx) *erpc.Status {
    ...
    return nil
}
  • register it to root router:
// register the unknown push route: /*
peer.SetUnknownPush(XxxUnknownPush)

Plugin Demo

// NewIgnoreCase Returns a ignoreCase plugin.
func NewIgnoreCase() *ignoreCase {
    return &ignoreCase{}
}

type ignoreCase struct{}

var (
    _ erpc.PostReadCallHeaderPlugin = new(ignoreCase)
    _ erpc.PostReadPushHeaderPlugin = new(ignoreCase)
)

func (i *ignoreCase) Name() string {
    return "ignoreCase"
}

func (i *ignoreCase) PostReadCallHeader(ctx erpc.ReadCtx) *erpc.Status {
    // Dynamic transformation path is lowercase
    ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path)
    return nil
}

func (i *ignoreCase) PostReadPushHeader(ctx erpc.ReadCtx) *erpc.Status {
    // Dynamic transformation path is lowercase
    ctx.UriObject().Path = strings.ToLower(ctx.UriObject().Path)
    return nil
}

Register above handler and plugin

// add router group
group := peer.SubRoute("test")
// register to test group
group.RouteCall(new(Aaa), NewIgnoreCase())
peer.RouteCallFunc(XxZz, NewIgnoreCase())
group.RoutePush(new(Bbb))
peer.RoutePushFunc(YyZz)
peer.SetUnknownCall(XxxUnknownCall)
peer.SetUnknownPush(XxxUnknownPush)

Config

type PeerConfig struct {
    Network            string        `yaml:"network"              ini:"network"              comment:"Network; tcp, tcp4, tcp6, unix, unixpacket, kcp or quic"`
    LocalIP            string        `yaml:"local_ip"             ini:"local_ip"             comment:"Local IP"`
    ListenPort         uint16        `yaml:"listen_port"          ini:"listen_port"          comment:"Listen port; for server role"`
    DialTimeout time.Duration `yaml:"dial_timeout" ini:"dial_timeout" comment:"Default maximum duration for dialing; for client role; ns,µs,ms,s,m,h"`
    RedialTimes        int32         `yaml:"redial_times"         ini:"redial_times"         comment:"The maximum times of attempts to redial, after the connection has been unexpectedly broken; Unlimited when <0; for client role"`
	RedialInterval     time.Duration `yaml:"redial_interval"      ini:"redial_interval"      comment:"Interval of redialing each time, default 100ms; for client role; ns,µs,ms,s,m,h"`
    DefaultBodyCodec   string        `yaml:"default_body_codec"   ini:"default_body_codec"   comment:"Default body codec type id"`
    DefaultSessionAge  time.Duration `yaml:"default_session_age"  ini:"default_session_age"  comment:"Default session max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h"`
    DefaultContextAge  time.Duration `yaml:"default_context_age"  ini:"default_context_age"  comment:"Default CALL or PUSH context max age, if less than or equal to 0, no time limit; ns,µs,ms,s,m,h"`
    SlowCometDuration  time.Duration `yaml:"slow_comet_duration"  ini:"slow_comet_duration"  comment:"Slow operation alarm threshold; ns,µs,ms,s ..."`
    PrintDetail        bool          `yaml:"print_detail"         ini:"print_detail"         comment:"Is print body and metadata or not"`
    CountTime          bool          `yaml:"count_time"           ini:"count_time"           comment:"Is count cost time or not"`
}

Optimize

  • SetMessageSizeLimit sets max message size. If maxSize<=0, set it to max uint32.

    func SetMessageSizeLimit(maxMessageSize uint32)
  • SetSocketKeepAlive sets whether the operating system should send keepalive messages on the connection.

    func SetSocketKeepAlive(keepalive bool)
  • SetSocketKeepAlivePeriod sets period between keep alives.

    func SetSocketKeepAlivePeriod(d time.Duration)
  • SetSocketNoDelay controls whether the operating system should delay message transmission in hopes of sending fewer messages (Nagle's algorithm). The default is true (no delay), meaning that data is sent as soon as possible after a Write.

    func SetSocketNoDelay(_noDelay bool)
  • SetSocketReadBuffer sets the size of the operating system's receive buffer associated with the connection.

    func SetSocketReadBuffer(bytes int)
  • SetSocketWriteBuffer sets the size of the operating system's transmit buffer associated with the connection.

    func SetSocketWriteBuffer(bytes int)

Extensions

Codec

package import description
json "github.com/henrylee2cn/erpc/v6/codec" JSON codec(erpc own)
protobuf "github.com/henrylee2cn/erpc/v6/codec" Protobuf codec(erpc own)
thrift "github.com/henrylee2cn/erpc/v6/codec" Form(url encode) codec(erpc own)
xml "github.com/henrylee2cn/erpc/v6/codec" Form(url encode) codec(erpc own)
plain "github.com/henrylee2cn/erpc/v6/codec" Plain text codec(erpc own)
form "github.com/henrylee2cn/erpc/v6/codec" Form(url encode) codec(erpc own)

Plugin

package import description
auth "github.com/henrylee2cn/erpc/v6/plugin/auth" An auth plugin for verifying peer at the first time
binder "github.com/henrylee2cn/erpc/v6/plugin/binder" Parameter Binding Verification for Struct Handler
heartbeat "github.com/henrylee2cn/erpc/v6/plugin/heartbeat" A generic timing heartbeat plugin
proxy "github.com/henrylee2cn/erpc/v6/plugin/proxy" A proxy plugin for handling unknown calling or pushing
secure "github.com/henrylee2cn/erpc/v6/plugin/secure" Encrypting/decrypting the message body
overloader "github.com/henrylee2cn/erpc/v6/plugin/overloader" A plugin to protect erpc from overload

Protocol

package import description
rawproto "github.com/henrylee2cn/erpc/v6/proto/rawproto A fast socket communication protocol(erpc default protocol)
jsonproto "github.com/henrylee2cn/erpc/v6/proto/jsonproto" A JSON socket communication protocol
pbproto "github.com/henrylee2cn/erpc/v6/proto/pbproto" A Protobuf socket communication protocol
thriftproto "github.com/henrylee2cn/erpc/v6/proto/thriftproto" A Thrift communication protocol
httproto "github.com/henrylee2cn/erpc/v6/proto/httproto" A HTTP style socket communication protocol

Transfer-Filter

package import description
gzip "github.com/henrylee2cn/erpc/v6/xfer/gzip" Gzip(erpc own)
md5 "github.com/henrylee2cn/erpc/v6/xfer/md5" Provides a integrity check transfer filter

Mixer

package import description
multiclient "github.com/henrylee2cn/erpc/v6/mixer/multiclient" Higher throughput client connection pool when transferring large messages (such as downloading files)
websocket "github.com/henrylee2cn/erpc/v6/mixer/websocket" Makes the eRPC framework compatible with websocket protocol as specified in RFC 6455
evio "github.com/henrylee2cn/erpc/v6/mixer/evio" A fast event-loop networking framework that uses the erpc API layer
html html "github.com/xiaoenai/tp-micro/helper/mod-html" HTML render for http client

Projects based on eRPC

project description
TP-Micro TP-Micro is a simple, powerful micro service framework based on eRPC
Pholcus Pholcus is a distributed, high concurrency and powerful web crawler software

Business Users

深圳市梦之舵信息技术有限公司    平安科技
北京风行在线技术有限公司    北京可即时代网络公司 快手短视频平台

License

eRPC is under Apache v2 License. See the LICENSE file for the full license text

Issues
  • 可以根据teleport开发socket.io的插件吗?

    可以根据teleport开发socket.io的插件吗?

    我们的项目之前是根据socket.io开发的实时推送服务,最近用户猛增,导致服务器转发消息延迟很大,想用go重写服务端,但是客户端还用socket.io兼容,估计只能适配socket.io的协议来改服务端这一块,不知道意义可大,plugin的方式可不可行。

    opened by AlexStacker 15
  • 请问如何才能关闭控制台的打印信息?

    请问如何才能关闭控制台的打印信息?

    感谢作者的开源项目 请问如何才能关闭控制台的打印信息?

    question 
    opened by go-xworkflow 13
  • 客户端支持callctx么?

    客户端支持callctx么?

    opened by dxwy2001 8
  • 粘包、半包处理机制

    粘包、半包处理机制

    socket读取部分没找到如何处理粘包、半包问题的逻辑

    opened by TaijiGao 7
  • add websocket handshake_auth.go

    add websocket handshake_auth.go

    add a handshake-plugin of websocket to auth by URL.Query info Usage: @see func TestHandshakeWebsocketAuth

    opened by deepziyu 5
  • 如何在自定义的 protocol 中在进行 Unpack 和 Pack 的时候获取 session ?

    如何在自定义的 protocol 中在进行 Unpack 和 Pack 的时候获取 session ?

    想自行实现一个 protocol ,但是发现 Unpack 中传递的 Message 并不包含 session 相关的信息,需要依据 session swap 中定义的 key 来对封包进行加解密

    opened by freeznet 5
  • 自定义协议如何支持像Thrift这样的RPC协议

    自定义协议如何支持像Thrift这样的RPC协议

    想定制自己的协议让其支持类似thrift这样的RPC协议,看了您的git上的说明不是很明白,求赐教。

    opened by xzy256 4
  • 可扩展自定义协议么?

    可扩展自定义协议么?

    See title ,thank u

    opened by rfyiamcool 4
  • 支持断线重连吗?还是需要手动实现?

    支持断线重连吗?还是需要手动实现?

    支持断线重连吗?还是需要手动实现?

    opened by dean2021 3
  • c++ client

    c++ client

    可以使用C++客户端连接erpc的服务吗. 这种情况下, erpc服务使用哪种协议比较方便客户端组包或解包? pb、raw? 有没有可能erpc服务自定义数据包的格式. 比如 |len|version|body-bytes-data...| 这样客户端可以比较方便的与服务端做数据交互,而且也提供了自定义协议的能力.

    opened by sleepreading 3
  • 解决使用

    解决使用"-race"进行竞态检查报错

    重现方法

    打开命令行窗口:

    cd /path/to/examples/simple/
    go run -race server.go
    

    打开第二个命令行窗口

    cd /path/to/examples/simple/
    go run -race client.go
    

    此时第一个窗口必定会报错。

    fatal error: checkptr: pointer arithmetic result points to invalid allocation

    错误原因,不正确的使用了unsafe包,将非类型安全指针转换为一个uintptr值,然后此uintptr值参与各种算术运算,再将算术运算的结果uintptr值转回非类型安全指针。

    使用说明可以参考,https://blog.csdn.net/u010853261/article/details/103826830

    使用该pr修复后,执行成功。

    opened by osgochina 0
  • invalid PreWriteCallPlugin in router: secure(encrypt/decrypt)

    invalid PreWriteCallPlugin in router: secure(encrypt/decrypt)

    [2021/07/28 15:16:23.140] [DEBU] invalid PreWriteCallPlugin in router: secure(encrypt/decrypt)

    Run with link example,Also I faild -> https://github.com/henrylee2cn/erpc/tree/master/plugin/secure

    opened by billmi 0
  • 有没办法服务端对客户端的连接进行限制?

    有没办法服务端对客户端的连接进行限制?

    非常感谢作者优秀的项目。 我们使用erpc做服务端,嵌入式设备做客户端,自己写的客户端代码。测试时遇到这样的情况,客户端意外出现1秒钟断开重连一次,当有10多个终端同时连接时,导致服务器内存接近100%。麻烦问下有没配置能从服务端对客户端的这种行为进行限制呢,避免过度额消耗系统资源。

    opened by akuan 0
  • Flat buffers support

    Flat buffers support

    Would you be ok with adding flatbuffers ?

    I used to use protobuf but now flatbuffers is mature. It’s much faster and I am using it on golang projects

    it also makes it much easier to compile to wasm with tinygo if your interested

    opened by gedw99 2
  • router 能不能暴露一个delete 方法

    router 能不能暴露一个delete 方法

    想用做灵活新增和删除router

    opened by edunx 1
  • defferences between erpc and go-micro?

    defferences between erpc and go-micro?

    what's the defferences between erpc and go-micro? please explain detailly

    opened by weiwangchao 2
  • Socket

    Socket

    请问socket 示例有么

    opened by YspCoder 0
  • 运行提示 undefined: cpu.HasAES错误

    运行提示 undefined: cpu.HasAES错误

    github.com/marten-seemann/qtls

    src\github.com\marten-seemann\qtls\common.go:1380:20: undefined: cpu.HasAES src\github.com\marten-seemann\qtls\common.go:1380:34: undefined: cpu.ARM64 src\github.com\marten-seemann\qtls\key_schedule.go:40:9: undefined: hkdf.Extract src\github.com\marten-seemann\qtls\key_schedule.go:59:12: undefined: hkdf.Expand src\github.com\marten-seemann\qtls\key_schedule.go:129:30: undefined: curve25519.ScalarSize src\github.com\marten-seemann\qtls\key_schedule.go:133:21: undefined: curve25519.X25519 src\github.com\marten-seemann\qtls\key_schedule.go:133:51: undefined: curve25519.Basepoint src\github.com\marten-seemann\qtls\key_schedule.go:212:20: undefined: curve25519.X25519

    opened by legolas-zeng 1
  • 您好,请问有详细的使用文档嘛

    您好,请问有详细的使用文档嘛

    您好,请问有详细的使用文档嘛

    opened by ffgfg 1
  •  TLS handshake error from 10.x.x.x:53786 EOF

    TLS handshake error from 10.x.x.x:53786 EOF

    配置证书TLS 后 链接的时会EOF错误

    opened by edunx 1
Releases(v6.3.5)
Owner
henrylee2cn
Cease to programing and cease to live.
henrylee2cn
Yet Another REST Framework

YARF: Yet Another REST Framework YARF is a fast micro-framework designed to build REST APIs and web services in a fast and simple way. Designed after

null 62 Jun 30, 2021
REST Layer, Go (golang) REST API framework

REST Layer REST APIs made easy. REST Layer is an API framework heavily inspired by the excellent Python Eve. It helps you create a comprehensive, cust

Olivier Poitrey 1.1k Oct 22, 2021
:zap: Go web framework benchmark

go-web-framework-benchmark This benchmark suite aims to compare the performance of Go web frameworks. It is inspired by Go HTTP Router Benchmark but t

smallnest 1.6k Oct 15, 2021
go-zero is a web and rpc framework written in Go. It's born to ensure the stability of the busy sites with resilient design. Builtin goctl greatly improves the development productivity.

go-zero English | 简体中文 0. what is go-zero go-zero is a web and rpc framework that with lots of engineering practices builtin. It’s born to ensure the

好未来技术 12k Oct 17, 2021
🍐 Elegant Golang REST API Framework

An Elegant Golang Web Framework Goyave is a progressive and accessible web application framework focused on REST APIs, aimed at making backend develop

Goyave 913 Oct 15, 2021
A secure, flexible, rapid Go web framework

A secure, flexible, rapid Go web framework Visit aah's official website https://aahframework.org to learn more News v0.12.3 released and tagged on Feb

aah framework 656 Oct 5, 2021
Gerasimos (Makis) Maropoulos 21.3k Oct 20, 2021
Simple web framework for go, still quite beta at this point

WFDR Framework - Beta Release New 18/Feb/2012: Updated for go 1.0, new directory layout to take advantage of the go build tool. Background There's a m

null 23 Feb 11, 2021
Advanced Honeypot framework.

Honeytrap Honeytrap is an extensible and opensource system for running, monitoring and managing honeypots. Features Combine multiple services to one h

Honeytrap 1k Oct 21, 2021
go-zero is a web and rpc framework that with lots of engineering practices builtin.

go-zero is a web and rpc framework that with lots of engineering practices builtin. It’s born to ensure the stability of the busy services with resilience design, and has been serving sites with tens of millions users for years.

null 157 Oct 13, 2021
Flamingo Framework and Core Library. Flamingo is a go based framework for pluggable web projects. It is used to build scalable and maintainable (web)applications.

Flamingo Framework Flamingo is a web framework based on Go. It is designed to build pluggable and maintainable web projects. It is production ready, f

Flamingo 235 Oct 15, 2021
Gin is a HTTP web framework written in Go (Golang).

Gin is a HTTP web framework written in Go (Golang). It features a Martini-like API with much better performance -- up to 40 times faster. If you need smashing performance, get yourself some Gin.

Gin-Gonic 52.4k Oct 23, 2021
Hexya business application development framework

Hexya Hexya is an open source ERP and a business application development framework written in Go. This repository houses the business application deve

Hexya 319 Oct 14, 2021
Golanger Web Framework is a lightweight framework for writing web applications in Go.

/* Copyright 2013 Golanger.com. All rights reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except

golanger 302 Aug 16, 2021
The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework.

jin About The jin is a simplified version of the gin web framework that can help you quickly understand the core principles of a web framework. If thi

null 7 Oct 22, 2021
A REST framework for quickly writing resource based services in Golang.

What is Resoursea? A high productivity web framework for quickly writing resource based services fully implementing the REST architectural style. This

Resoursea 31 Feb 21, 2020
A small and evil REST framework for Go

go-rest A small and evil REST framework for Go Reflection, Go structs, and JSON marshalling FTW! go get github.com/ungerik/go-rest import "github.com/

Erik Unger 125 Feb 11, 2021
⚡️ Express inspired web framework written in Go

Fiber is an Express inspired web framework built on top of Fasthttp, the fastest HTTP engine for Go. Designed to ease things up for fast development w

Fiber 16k Oct 23, 2021
High performance, minimalist Go web framework

Supported Go versions As of version 4.0.0, Echo is available as a Go module. Therefore a Go version capable of understanding /vN suffixed imports is r

LabStack LLC 20.9k Oct 15, 2021