roundRobin.go 905 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package loadmodule
  2. import (
  3. "errors"
  4. "net/url"
  5. "strings"
  6. )
  7. type RoundRobinProxy struct {
  8. curIndex int
  9. rss []*url.URL
  10. }
  11. func (r *RoundRobinProxy) Add(param string) error {
  12. urlParam := param
  13. if params := strings.Split(param, "|"); len(params) == 2 {
  14. urlParam = params[0]
  15. }
  16. if len(urlParam) == 0 {
  17. return errors.New("param len 1 at least")
  18. }
  19. remoteUrl, err := url.Parse(strings.TrimSpace(urlParam))
  20. if err != nil {
  21. return err
  22. }
  23. r.rss = append(r.rss, remoteUrl)
  24. return nil
  25. }
  26. func (r *RoundRobinProxy) Next() *url.URL {
  27. if len(r.rss) == 1 {
  28. return r.rss[0]
  29. }
  30. lens := len(r.rss)
  31. if r.curIndex >= lens {
  32. r.curIndex = 0
  33. }
  34. curAddr := r.rss[r.curIndex]
  35. r.curIndex = (r.curIndex + 1) % lens
  36. return curAddr
  37. }
  38. func (r *RoundRobinProxy) Get() *url.URL {
  39. return r.Next()
  40. }
  41. func (r *RoundRobinProxy) Len() int {
  42. return len(r.rss)
  43. }
  44. func (r *RoundRobinProxy) Update() {
  45. }