clientutil.go 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /**
  2. 客户端封装
  3. */
  4. package util
  5. import (
  6. "app.yhyue.com/BP/servicerd/proto"
  7. "context"
  8. "errors"
  9. "google.golang.org/grpc"
  10. "log"
  11. "time"
  12. )
  13. const (
  14. //TODO 目前实现前2中
  15. ERROR_ERTRY_TYPE_FIRST = iota //1次,找到第一个服务提供者,出错即返回
  16. ERROR_ERTRY_TYPE_FIRST_5 //5次尝试,找到第一个服务提供者
  17. ERROR_ERTRY_TYPE_OVER_ALL //尝试遍历所有服务,直至又一个提供正常返回
  18. )
  19. //调用
  20. type CallFn func(conn *grpc.ClientConn, args ...interface{}) (interface{}, error)
  21. type ClientUtil struct {
  22. RdServer string
  23. serviceConn *grpc.ClientConn
  24. serviceClient proto.ServiceClient
  25. }
  26. func NewClient(rdServer string) (*ClientUtil, error) {
  27. c := &ClientUtil{RdServer: rdServer}
  28. conn, err := grpc.Dial(rdServer, grpc.WithInsecure())
  29. if err != nil {
  30. return nil, err
  31. }
  32. client := proto.NewServiceClient(conn)
  33. c.serviceConn = conn
  34. c.serviceClient = client
  35. return c, nil
  36. }
  37. func (cu *ClientUtil) Run(serviceName string, errRetryTime int, fn CallFn, args ...interface{}) (interface{}, error) {
  38. defer func() {
  39. if err := recover(); err != nil {
  40. log.Println("捕获异常:", err)
  41. }
  42. }()
  43. for i := 0; i < errRetryTime; i++ {
  44. repl, err := cu.serviceClient.Apply(context.Background(), &proto.ApplyReqData{Name: serviceName, Balance: 0})
  45. if err != nil {
  46. log.Println("client-util", "无可用服务", err.Error())
  47. time.Sleep(1 * time.Second)
  48. continue
  49. }
  50. //TODO 业务调用
  51. conn, err := grpc.Dial(repl.Addr, grpc.WithInsecure())
  52. if err != nil {
  53. log.Println("client-util", "连接到服务节点失败:", repl.Addr, err.Error())
  54. time.Sleep(1 * time.Second)
  55. continue
  56. }
  57. ret, err := fn(conn, args...)
  58. conn.Close()
  59. return ret, err
  60. }
  61. return nil, errors.New("远程服务调用失败")
  62. }