gateway.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package main
  2. import (
  3. "errors"
  4. "flag"
  5. "fmt"
  6. "log"
  7. "strings"
  8. etcdclient "github.com/rpcxio/rpcx-etcd/client"
  9. gateway "github.com/rpcxio/rpcx-gateway"
  10. "github.com/rpcxio/rpcx-gateway/gin"
  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", "/rpcx", "basepath for zookeeper, etcd and 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. )
  20. func main() {
  21. flag.Parse()
  22. d, err := createServiceDiscovery(*registry)
  23. if err != nil {
  24. log.Fatal(err)
  25. }
  26. httpServer := gin.New(*addr)
  27. gw := gateway.NewGateway("/", httpServer, d, client.FailMode(*failmode), client.SelectMode(*selectMode), client.DefaultOption)
  28. gw.Serve()
  29. }
  30. func createServiceDiscovery(regAddr string) (client.ServiceDiscovery, error) {
  31. i := strings.Index(regAddr, "://")
  32. if i < 0 {
  33. return nil, errors.New("wrong format registry address. The right fotmat is [registry_type://address]")
  34. }
  35. regType := regAddr[:i]
  36. regAddr = regAddr[i+3:]
  37. switch regType {
  38. case "peer2peer": // peer2peer://127.0.0.1:8972
  39. return client.NewPeer2PeerDiscovery("tcp@"+regAddr, "")
  40. case "multiple":
  41. var pairs []*client.KVPair
  42. pp := strings.Split(regAddr, ",")
  43. for _, v := range pp {
  44. pairs = append(pairs, &client.KVPair{Key: v})
  45. }
  46. return client.NewMultipleServersDiscovery(pairs)
  47. case "zookeeper":
  48. return client.NewZookeeperDiscoveryTemplate(*basePath, []string{regAddr}, nil)
  49. case "etcd":
  50. return etcdclient.NewEtcdDiscoveryTemplate(*basePath, []string{regAddr}, nil)
  51. case "etcdv3":
  52. return etcdclient.NewEtcdV3DiscoveryTemplate(*basePath, []string{regAddr}, nil)
  53. case "consul":
  54. return client.NewConsulDiscoveryTemplate(*basePath, []string{regAddr}, nil)
  55. case "redis":
  56. return client.NewRedisDiscoveryTemplate(*basePath, []string{regAddr}, nil)
  57. default:
  58. return nil, fmt.Errorf("wrong registry type %s. only support peer2peer,multiple, zookeeper, etcd, consul and mdns", regType)
  59. }
  60. }