module_round.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. package loadmodule
  2. import (
  3. . "bp.jydev.jianyu360.cn/BaseService/gateway/common/gatecode"
  4. "fmt"
  5. "net/url"
  6. "strings"
  7. "time"
  8. )
  9. type RoundRobinProxy struct {
  10. curIndex int
  11. rss []*url.URL
  12. }
  13. func (r *RoundRobinProxy) Add(path string) error {
  14. remoteUrl, err := url.Parse(strings.TrimSpace(path))
  15. if err != nil {
  16. return NewErrorWithCode(GATEWAY_MODULE_SERVER_ERR, fmt.Sprintf("服务地址%s ERR:%v", path, err))
  17. }
  18. r.rss = append(r.rss, remoteUrl)
  19. return nil
  20. }
  21. func (r *RoundRobinProxy) next() (url *url.URL, err error) {
  22. defer func() {
  23. //数组线程不安全处理
  24. if rec := recover(); rec != nil {
  25. err = NewErrorWithCode(GATEWAY_MODULE_SERVER_ERR, fmt.Sprintf("服务列表%v 获取服务异常%v ", r.rss, rec))
  26. }
  27. }()
  28. lens := len(r.rss)
  29. if r.curIndex >= lens {
  30. r.curIndex = 0
  31. }
  32. url = r.rss[r.curIndex]
  33. r.curIndex = (r.curIndex + 1) % lens
  34. return
  35. }
  36. func (r *RoundRobinProxy) Get(ip string) (url *url.URL, err error) {
  37. for i := 0; i < 3; i++ {
  38. url, err = r.next()
  39. if err == nil {
  40. return
  41. }
  42. time.Sleep(time.Millisecond * 500 * time.Duration(i))
  43. }
  44. return
  45. }
  46. func (r *RoundRobinProxy) Del(path string) error {
  47. var newRss []*url.URL
  48. for _, rss := range r.rss {
  49. if rss.String() == path {
  50. continue
  51. }
  52. newRss = append(newRss, rss)
  53. }
  54. r.rss = newRss
  55. return nil
  56. }