main.go 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. etcdclient "github.com/rpcxio/rpcx-etcd/client"
  7. "log"
  8. "strings"
  9. "dashoo.cn/gateway/gin"
  10. gateway "github.com/rpcxio/rpcx-gateway"
  11. "github.com/smallnest/rpcx/client"
  12. )
  13. var (
  14. addr = flag.String("addr", ":9981", "http server address")
  15. registry = flag.String("registry", "peer2peer://127.0.0.1:8972", "registry address")
  16. basePath = flag.String("basepath", "/dashoo", "basepath for consul")
  17. failmode = flag.Int("failmode", int(client.Failover), "failMode, Failover in default")
  18. selectMode = flag.Int("selectmode", int(client.RoundRobin), "selectMode, RoundRobin in default")
  19. allowKeyNotFound = flag.Bool("key", true, "key, allow key not found")
  20. )
  21. type ServiceDiscovery struct {
  22. BasePath string
  23. SrvDiscovery client.ServiceDiscovery
  24. }
  25. func main() {
  26. flag.Parse()
  27. discoverys, err := createServiceDiscovery()
  28. if err != nil {
  29. log.Fatal(err)
  30. }
  31. httpServer := gin.New(*addr)
  32. var gws map[string]*gateway.Gateway
  33. gws = make(map[string]*gateway.Gateway)
  34. for key, value := range discoverys {
  35. if strings.HasPrefix(key, "/") {
  36. key = key[1:]
  37. }
  38. srvPath := "/" + key
  39. gws[srvPath] = gateway.NewGateway(srvPath, httpServer, value, client.FailMode(*failmode), client.SelectMode(*selectMode), client.DefaultOption)
  40. }
  41. // 启动服务
  42. if err := httpServer.Serve(); err != nil {
  43. log.Fatal(err)
  44. }
  45. }
  46. func createServiceDiscovery() (map[string]client.ServiceDiscovery, error) {
  47. var serviceDiscoverys map[string]client.ServiceDiscovery
  48. serviceDiscoverys = make(map[string]client.ServiceDiscovery)
  49. regAddr := *registry
  50. i := strings.Index(regAddr, "://")
  51. if i < 0 {
  52. return nil, errors.New("错误的 peer2peer registry 或 basepath参数. peer2peer微服务数量和basepath数量不同 ")
  53. }
  54. regType := regAddr[:i]
  55. regAddr = regAddr[i+3:]
  56. switch regType {
  57. case "peer2peer": // peer2peer://127.0.0.1:8972
  58. regAddrs := strings.Split(regAddr, ",")
  59. basePaths := strings.Split(*basePath, ",")
  60. if len(regAddrs) != len(basePaths) {
  61. return nil, errors.New("registry参数格式错误. 正确格式为:[registry_type://address]")
  62. }
  63. for index, path := range basePaths {
  64. discovery, err := client.NewPeer2PeerDiscovery("tcp@"+regAddrs[index], "")
  65. if err != nil {
  66. return nil, err
  67. }
  68. serviceDiscoverys[path] = discovery
  69. }
  70. //serviceDiscoverys["dashoo.biobank.adapter-0.1"] = discovery
  71. //return serviceDiscoverys, err
  72. return serviceDiscoverys, nil
  73. case "consul":
  74. basePaths := strings.Split(*basePath, ",")
  75. for _, path := range basePaths {
  76. discovery, err := client.NewConsulDiscoveryTemplate(path, []string{regAddr}, nil)
  77. if err != nil {
  78. return nil, err
  79. }
  80. serviceDiscoverys[path] = discovery
  81. }
  82. return serviceDiscoverys, nil
  83. case "etcd":
  84. basePaths := strings.Split(*basePath, ",")
  85. for _, path := range basePaths {
  86. discovery, err := etcdclient.NewEtcdDiscoveryTemplate(path, []string{regAddr}, *allowKeyNotFound, nil)
  87. if err != nil {
  88. return nil, err
  89. }
  90. serviceDiscoverys[path] = discovery
  91. }
  92. return serviceDiscoverys, nil
  93. case "etcdv3":
  94. basePaths := strings.Split(*basePath, ",")
  95. for _, path := range basePaths {
  96. discovery, err := etcdclient.NewEtcdV3DiscoveryTemplate(path, []string{regAddr}, *allowKeyNotFound, nil)
  97. if err != nil {
  98. return nil, err
  99. }
  100. serviceDiscoverys[path] = discovery
  101. }
  102. return serviceDiscoverys, nil
  103. default:
  104. return nil, fmt.Errorf("错误的registry类型 %s. 只支持peer2peer,multiple,consul,etcd,etcdv3", regType)
  105. }
  106. }