andeya / erpc Goto Github PK
View Code? Open in Web Editor NEWAn efficient, extensible and easy-to-use RPC framework.
Home Page: https://andeya.github.io/erpc-book
License: Apache License 2.0
An efficient, extensible and easy-to-use RPC framework.
Home Page: https://andeya.github.io/erpc-book
License: Apache License 2.0
想自行实现一个 protocol ,但是发现 Unpack 中传递的 Message 并不包含 session 相关的信息,需要依据 session swap 中定义的 key 来对封包进行加解密
可以使用C++客户端连接erpc的服务吗. 这种情况下, erpc服务使用哪种协议比较方便客户端组包或解包? pb、raw?
有没有可能erpc服务自定义数据包的格式. 比如 |len|version|body-bytes-data...|
这样客户端可以比较方便的与服务端做数据交互,而且也提供了自定义协议的能力.
请问有js版本的client么
您好,请问有详细的使用文档嘛
服务端支持udp吗
plugin/auth/auth.go下的Session的interface可以加个LocalAddr()嘛。。
因为在认证的时候有可能会用到,其他session也都带了这个方法,每次更新库了忘记改了就很尴尬。
这里是大致的实现:
https://gist.github.com/chenqinghe/cadea0fc76f545154204b4dab35a4bef
panic信息:
[2019/03/16 22:40:01.223] [PRIN] The current process PID: 2884
[2019/03/16 22:40:01.232] [PRIN] register CALL handler: /user/login
[2019/03/16 22:40:01.241] [PRIN] listen and serve (network:tcp, addr:[::]:9090)
[2019/03/16 22:40:12.296] [INFO] accept ok (network:tcp, addr:127.0.0.1:2964, id:127.0.0.1:2964)
[2019/03/16 22:40:12.297] [DEBU] panic:runtime error: invalid memory address or nil pointer dereference
........../server/manager.(*Manager).Add(0x0, 0x0, 0x0, 0xc000194080)
........../server/manager/manager.go:21 +0x2d
........../server/handler.(*User).Login(0xc000194000, 0xc00016b260, 0x0, 0x0, 0x0)
........../server/handler/user.go:20 +0x12b
reflect.Value.call(0xc0001608a0, 0xc000098528, 0x13, 0x8da74a, 0x4, 0xc00017bd80, 0x2, 0x2, 0x0, 0xc000192180, ...)
C:/Go/src/reflect/value.go:447 +0x450
reflect.Value.Call(0xc0001608a0, 0xc000098528, 0x13, 0xc00017bd80, 0x2, 0x2, 0x0, 0x0, 0xc00017bdb0)
C:/Go/src/reflect/value.go:308 +0xab
........../vendor/github.com/henrylee2cn/teleport.makeCallHandlersFromStruct.func2(0xc0000cd810, 0x8261c0, 0xc00016b260, 0x16)
........../vendor/github.com/henrylee2cn/teleport/router.go:506 +0x138
........../vendor/github.com/henrylee2cn/teleport.(*handlerCtx).handleCall(0xc0000cd810)
........../vendor/github.com/henrylee2cn/teleport/context.go:513 +0x391
........../vendor/github.com/henrylee2cn/teleport.(*handlerCtx).handle(0xc0000cd810)
........../vendor/github.com/henrylee2cn/teleport/context.go:366 +0x35f
初步猜测可能是反射复制Manager实例的时候漏了mux字段导致。具体原因暂不详。
例子是simple里的。
服务器端:
在ListenAndServe前加了个定时器,2秒后关闭服务器
go func() {
time.Sleep(2 * time.Second)
srv.Close()
}()
srv.ListenAndServe()
fmt.Println("exit.............")
客户端:
在 cli.Dial(":9090") 后也加了个定时器,3秒后重连
go func() {
time.Sleep(3 *time.Second)
cli.Dial(":9090")
}()
服务器2秒后执行关闭,并没有退出监听,后面打印也没继续,3秒后客户端还是继续连接成功
看代码还是阻塞在Accept那,这如何退出服务器?
信息如下
-> go get -u github.com/henrylee2cn/teleport
go: finding golang.org/x/sys latest
go: finding github.com/henrylee2cn/goutil latest
go: finding github.com/henrylee2cn/cfgo latest
go: finding golang.org/x/crypto latest
go: finding golang.org/x/net latest
go: finding gopkg.in/tomb.v1 latest
go: finding golang.org/x/tools latest
go: finding golang.org/x/sync latest
go: finding gopkg.in/check.v1 latest
# github.com/lucas-clemente/quic-go/internal/handshake
../gopath/pkg/mod/github.com/lucas-clemente/[email protected]/internal/handshake/crypto_setup.go:115:5: cannot use &cryptoSetup literal (type *cryptoSetup) as type qtls.RecordLayer in assignment:
*cryptoSetup does not implement qtls.RecordLayer (wrong type for SetReadKey method)
have SetReadKey(*qtls.CipherSuite, []byte)
want SetReadKey(qtls.EncryptionLevel, *qtls.CipherSuite, []byte)
../gopath/pkg/mod/github.com/lucas-clemente/[email protected]/internal/handshake/crypto_setup.go:216:35: cannot use cs (type *cryptoSetup) as type qtls.RecordLayer in argument to tlsConfigToQtlsConfig:
*cryptoSetup does not implement qtls.RecordLayer (wrong type for SetReadKey method)
have SetReadKey(*qtls.CipherSuite, []byte)
want SetReadKey(qtls.EncryptionLevel, *qtls.CipherSuite, []byte)
go get -u -f github.com/henrylee2cn/erpc
github.com\henrylee2cn\erpc\quic\quic.go:27:36: not enough arguments in call to sess.OpenStreamSync
have ()
want (context.Context)
github.com\henrylee2cn\erpc\quic\quic.go:96:27: not enough arguments in call to l.lis.Accept
have ()
want (context.Context)
github.com\henrylee2cn\erpc\quic\quic.go:100:34: not enough arguments in call to sess.AcceptStream
have ()
want (context.Context)
go的版本是:
$ go version
go version go1.8 windows/386
go 当前的 env是:
$ go env
set GOARCH=386
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=386
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=D:\workspace\go
set GORACE=
set GOROOT=D:\Go
set GOTOOLDIR=D:\Go\pkg\tool\windows_386
set GCCGO=gccgo
set GO386=
set CC=gcc
set GOGCCFLAGS=-m32 -mthreads -fmessage-length=0 -fdebug-prefix-map=C:\Users\ADMINI~1\AppData\Local\Temp\go-build765695343=/tmp/go-build -gno-record-gcc-switches
set CXX=g++
set CGO_ENABLED=1
set PKG_CONFIG=pkg-config
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
报的错误是:
$ go run client.go
[2017/11/19 14:17:42.098] [PRIN] The current process PID: 11000<github.com/henrylee2cn/teleport/utils.go:58>
[2017/11/19 14:17:42.103] [PRIN] register push handler: /push/test<github.com/henrylee2cn/teleport/router.go:89>
[2017/11/19 14:17:42.108] [INFO] dial ok (addr: 127.0.0.1:9090, id: 127.0.0.1:56087)<github.com/henrylee2cn/teleport/peer.go:142>
[2017/11/19 14:17:42.108] [DEBU] panic:
runtime error: invalid memory address or nil pointer dereference
sync/atomic.LoadUint64(0x126e440c, 0x12776000, 0x127027fc)
D:/Go/src/sync/atomic/asm_386.s:159 +0xb
github.com/henrylee2cn/teleport.(*session).ReadTimeout(0x126e4370, 0x0, 0x0)
D:/workspace/go/src/github.com/henrylee2cn/teleport/session.go:197 +0x28
github.com/henrylee2cn/teleport.(*session).startReadAndHandle(0x126e4370)
D:/workspace/go/src/github.com/henrylee2cn/teleport/session.go:404 +0xcf
github.com/henrylee2cn/teleport.(*session).(github.com/henrylee2cn/teleport.startReadAndHandle)-fm()
D:/workspace/go/src/github.com/henrylee2cn/teleport/peer.go:140 +0x20
github.com/henrylee2cn/goutil/pool.(*GoPool).goroutineFunc(0x1275f780, 0x1274f820)
D:/workspace/go/src/github.com/henrylee2cn/goutil/pool/GoPool.go:223 +0x63
github.com/henrylee2cn/goutil/pool.(*GoPool).getCh.func1(0x1275f780, 0x1274f820, 0x6a7540, 0x1274f820)
D:/workspace/go/src/github.com/henrylee2cn/goutil/pool/GoPool.go:199 +0x29
created by github.com/henrylee2cn/goutil/pool.(*GoPool).getCh
D:/workspace/go/src/github.com/henrylee2cn/goutil/pool/GoPool.go:201 +0xe8<github.com/henrylee2cn/teleport/session.go:383>
[2017/11/19 14:17:42.115] [ERRO] panic:
runtime error: invalid memory address or nil pointer dereference
sync/atomic.LoadUint64(0x126e4414, 0x126e43b0, 0x0)
D:/Go/src/sync/atomic/asm_386.s:159 +0xb
github.com/henrylee2cn/teleport.(*session).WriteTimeout(0x126e4370, 0x0, 0x1a0250)
D:/workspace/go/src/github.com/henrylee2cn/teleport/session.go:202 +0x28
github.com/henrylee2cn/teleport.(*session).write(0x126e4370, 0x1275f8c0, 0x0, 0x0)
D:/workspace/go/src/github.com/henrylee2cn/teleport/session.go:446 +0x56
github.com/henrylee2cn/teleport.(*session).GoPull(0x126e4370, 0x723653, 0x23, 0x6cc9c0, 0x1274f900, 0x6a8880, 0x126cfe78, 0x1275f880, 0x0, 0x0, ...)
D:/workspace/go/src/github.com/henrylee2cn/teleport/session.go:292 +0x4cf<github.com/henrylee2cn/teleport/session.go:285>
[2017/11/19 14:19:16.861] [INFO] shutting down process...<github.com/henrylee2cn/goutil/graceful/grace_a.go:34>
[2017/11/19 14:19:36.868] [ERRO] [shutdown-timeout] context deadline exceeded<github.com/henrylee2cn/goutil/graceful/grace.go:86>
类似这样的是兼容的问题还是怎么回事?
支持断线重连吗?还是需要手动实现?
想请问一下,在teleport中对于远端连接断开时的错误捕获是怎么进行的,有示例吗?
TLS 加解密插件
如题,客户端代码:
Cli.RoutePush(new(Push))
// 连接服务端
sess, stat := Cli.Dial(serverUrl)
...
type Push struct {
tp.PushCtx
}
func (p *Push) Table(msg *vos.TableMsg) *tp.Status {
if true {
return tp.NewStatusByCodeText(tp.CodeInternalServerError, "test return error", false)
}
return nil
}
服务器端代码:
status := session.Push("/push/table", msg)
logs.Logger.Debug("status value.",zap.Any("status",status)) // 打印得到的是nil值
现在的问题是:为什么服务器端得到的status一直是nil值?求助。
客户端使用RedialTimes: -1,
参数设置不断尝试重连,当服务端停止,然后重启服务端,客户端无法正常重建连接。后发现,修改peer.go的以下代码:
stat = p.renewSessionForClient(sess, dialFunc, addr, protoFuncs)
if !stat.OK() { // 此处改为 if stat.OK() {
Infof("redial ok (network:%s, addr:%s, id:%s)", p.network, sess.RemoteAddr().String(), sess.ID())
return true
}
经过修正后,客户端能重连成功。
成功案例多吗?谢谢
quic-go/quic-go@2b8cece#diff-7fa3e81a10e876cd5bdc7f4b7f4909b0
OpenStreamSync多了参数
类似的还有erpc/quic/quic.go下的96和100行
See title ,thank u
How Teleport upgrade to erpc,
can you Give me some suggest?
是否支持filter chain?类似netty或mina
有一组peer,对这组peer 发起一个异步的请求,并使用pingCmdChan 接受所有peer 返回的结果,问题是如何从返回的PullCmd 中获取session (即怎么确认结果是哪个peer 返回的)?
(ps: 是不是AsyncPull 不能这么用)
部分代码如下:
pingCmdChan := make(chan tp.PullCmd, batch)
for _, peer := range hub.others {
......
peer.sess.AsyncPull(
"/peer/ping",
"ping",
new(string),
pingCmdChan,
)
}
......
for pingCmd := range pingCmdChan {
result, rerr := pingCmd.Reply()
sess = pingCmd.XXXXX // ?
}
在说明文档中,sequence length是2bytes;
{2 bytes sequence length}
{sequence}
但在文件github.com/henrylee2cn/teleport/socket/protocol.go中sequence length是1bytes;
{1 bytes sequence length}
{sequence}
{1 byte message type} # e.g. CALL:1; REPLY:2; PUSH:3
{1 bytes service method length}
请问是以谁为准呢?还想请教一下seq的编码解码是怎么计算的呢.
貌似框架对会话的状态的管理不太友好啊。每次请求过来之后,都会路由到不同的handler实例,这样就不能通过handler来管理会话状态了,得要自己再重新封装一层。后面这块会考虑重构吗?
使用方法是什么呢?
是把这个框架import进来呢? 还是说这个是个框架,在这个框架里开发?
你好,首先感谢你开源,我想问下,第一版代码比较少,我想用第一版,有什么问题吗?
感谢作者的开源项目
请问如何才能关闭控制台的打印信息?
quic模式啊,我看了下最新的teleport中的类型没有这个,所以我这里按照quic的Demo一跑就报“Invalid network config, refer to the following: tcp, tcp4, tcp6, unix or unixpacket.”
panic: qtls.ConnectionState not compatible with tls.ConnectionState
goroutine 1 [running]:
github.com/ourcolour/xnettools/vendor/github.com/lucas-clemente/quic-go/internal/handshake.init.0()
E:/goprojects/src/github.com/ourcolour/xnettools/vendor/github.com/lucas-clemente/quic-go/internal/handshake/unsafe.go:17 +0x2b3
新建个qq群,大家一起交流
RT,像:plugin-heartbeat 这里面就有没改。估计有不少都没改过来
不使用govendor的话正常,但是使用了govendor会有一些的报错,老哥能帮忙看看嘛。。
vendor/github.com/henrylee2cn/erpc/plugin/auth/auth.go:111:21: cannot use sess (type erpc.PreSession) as type Session in argument to a.bearerFunc:
erpc.PreSession does not implement Session (wrong type for Swap method)
have Swap() "github.com/henrylee2cn/goutil".Map
want Swap() "rock/agent/vendor/github.com/henrylee2cn/goutil".Map
vendor/github.com/henrylee2cn/erpc/context.go:375:20: cannot use statCodeMtypeNotAllowed (type *"rock/agent/vendor/github.com/henrylee2cn/goutil/status".Status) as type *"github.com/henrylee2cn/goutil/status".Status in argument to c.output.SetStatus
翻了一遍Demo以及Peer、Session相关的代码,没找到相关的函数,麻烦指导下,谢谢。
支持go作为客户端,java做服务端么?
我们的项目之前是根据socket.io开发的实时推送服务,最近用户猛增,导致服务器转发消息延迟很大,想用go重写服务端,但是客户端还用socket.io兼容,估计只能适配socket.io的协议来改服务端这一块,不知道意义可大,plugin的方式可不可行。
有重连发指定请求的需求,看了接口好像没有能获取到冲连的通知
问题描述如下:
我是用了auth plugin,但是每次断线重连之后在plugin这块都会直接返回connection close的error信息,跟踪代码后发现,在renewSessionForClient
方法中,在p.pluginContainer.postDial(sess)
时,当前session的状态依然是Closed,导致后续写消息直接判断状态返回了,
现修改如下:
func (p *peer) renewSessionForClient(sess *session, dialFunc func() (net.Conn, error), addr string, protoFuncs []ProtoFunc) error {
var conn, dialErr = dialFunc()
if dialErr != nil {
return dialErr
}
if p.tlsConfig != nil {
conn = tls.Client(conn, p.tlsConfig)
}
oldIP := sess.LocalAddr().String()
oldID := sess.ID()
oldConn := sess.getConn()
if oldConn != nil {
oldConn.Close()
}
sess.socket.Reset(conn, protoFuncs...)
if oldIP == oldID {
sess.socket.SetID(sess.LocalAddr().String())
} else {
sess.socket.SetID(oldID)
}
atomic.StoreInt32(&sess.status, statusOk) //将状态修改放在plugin之前
if rerr := p.pluginContainer.postDial(sess); rerr != nil {
sess.Close()
return rerr.ToError()
}
// atomic.StoreInt32(&sess.status, statusOk)
AnywayGo(sess.startReadAndHandle)
p.sessHub.Set(sess)
return nil
}
不知道这样改动会不会引发其他问题,还没有完全吃透teleport的源码
想定制自己的协议让其支持类似thrift这样的RPC协议,看了您的git上的说明不是很明白,求赐教。
配置证书TLS 后 链接的时会EOF错误
socket读取部分没找到如何处理粘包、半包问题的逻辑
push = tp.PushCtx
err := push.Session().Close()
发现一点效果都没有,服务器并不能这样主动关闭客户端的连接。
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.