module_hash.go 1.3 KB

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