module_random.go 1.3 KB

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