You can not select more than 25 topics Topics must start with a chinese character,a letter or number, can include dashes ('-') and can be up to 35 characters long.

rpc_client.go 3.3 kB

4 years ago
5 years ago
4 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
4 years ago
5 years ago
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. package client
  2. import (
  3. "fmt"
  4. "net"
  5. )
  6. import (
  7. getty "github.com/apache/dubbo-getty"
  8. gxsync "github.com/dubbogo/gost/sync"
  9. "github.com/nacos-group/nacos-sdk-go/common/logger"
  10. )
  11. import (
  12. "github.com/transaction-wg/seata-golang/pkg/base/extension"
  13. "github.com/transaction-wg/seata-golang/pkg/base/getty/readwriter"
  14. "github.com/transaction-wg/seata-golang/pkg/client/config"
  15. getty2 "github.com/transaction-wg/seata-golang/pkg/client/rpc_client"
  16. "github.com/transaction-wg/seata-golang/pkg/util/log"
  17. )
  18. type RpcClient struct {
  19. conf *config.ClientConfig
  20. gettyClients []getty.Client
  21. rpcHandler *getty2.RpcRemoteClient
  22. }
  23. func NewRpcClient() *RpcClient {
  24. rpcClient := &RpcClient{
  25. conf: config.GetClientConfig(),
  26. gettyClients: make([]getty.Client, 0),
  27. rpcHandler: getty2.InitRpcRemoteClient(),
  28. }
  29. rpcClient.init()
  30. return rpcClient
  31. }
  32. func (c *RpcClient) init() {
  33. addressList := getAvailServerList(c.conf)
  34. if len(addressList) == 0 {
  35. log.Warn("no have valid seata server list")
  36. }
  37. for _, address := range addressList {
  38. gettyClient := getty.NewTCPClient(
  39. getty.WithServerAddress(address),
  40. getty.WithConnectionNumber((int)(c.conf.GettyConfig.ConnectionNum)),
  41. getty.WithReconnectInterval(c.conf.GettyConfig.ReconnectInterval),
  42. getty.WithClientTaskPool(gxsync.NewTaskPoolSimple(0)),
  43. )
  44. go gettyClient.RunEventLoop(c.newSession)
  45. c.gettyClients = append(c.gettyClients, gettyClient)
  46. }
  47. }
  48. func getAvailServerList(config *config.ClientConfig) []string {
  49. reg, err := extension.GetRegistry(config.RegistryConfig.Mode)
  50. if err != nil {
  51. logger.Errorf("Registry can not connect success, program is going to panic.Error message is %s", err.Error())
  52. panic(err.Error())
  53. }
  54. addrs, err := reg.Lookup()
  55. if err != nil {
  56. logger.Errorf("no hava valid server list", err.Error())
  57. return nil
  58. }
  59. return addrs
  60. }
  61. func (c *RpcClient) newSession(session getty.Session) error {
  62. var (
  63. ok bool
  64. tcpConn *net.TCPConn
  65. )
  66. if c.conf.GettyConfig.GettySessionParam.CompressEncoding {
  67. session.SetCompressType(getty.CompressZip)
  68. }
  69. if tcpConn, ok = session.Conn().(*net.TCPConn); !ok {
  70. panic(fmt.Sprintf("%s, session.conn{%#v} is not tcp connection\n", session.Stat(), session.Conn()))
  71. }
  72. tcpConn.SetNoDelay(c.conf.GettyConfig.GettySessionParam.TCPNoDelay)
  73. tcpConn.SetKeepAlive(c.conf.GettyConfig.GettySessionParam.TCPKeepAlive)
  74. if c.conf.GettyConfig.GettySessionParam.TCPKeepAlive {
  75. tcpConn.SetKeepAlivePeriod(c.conf.GettyConfig.GettySessionParam.KeepAlivePeriod)
  76. }
  77. tcpConn.SetReadBuffer(c.conf.GettyConfig.GettySessionParam.TCPRBufSize)
  78. tcpConn.SetWriteBuffer(c.conf.GettyConfig.GettySessionParam.TCPWBufSize)
  79. session.SetName(c.conf.GettyConfig.GettySessionParam.SessionName)
  80. session.SetMaxMsgLen(c.conf.GettyConfig.GettySessionParam.MaxMsgLen)
  81. session.SetPkgHandler(readwriter.RpcPkgHandler)
  82. session.SetEventListener(c.rpcHandler)
  83. session.SetReadTimeout(c.conf.GettyConfig.GettySessionParam.TCPReadTimeout)
  84. session.SetWriteTimeout(c.conf.GettyConfig.GettySessionParam.TCPWriteTimeout)
  85. session.SetCronPeriod((int)(c.conf.GettyConfig.HeartbeatPeriod.Nanoseconds() / 1e6))
  86. session.SetWaitTime(c.conf.GettyConfig.GettySessionParam.WaitTimeout)
  87. log.Debugf("rpc_client new session:%s\n", session.Stat())
  88. return nil
  89. }