onlineStatus.go 1.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. package loadbalance
  2. import (
  3. "net/http"
  4. "time"
  5. )
  6. // Return the last ping status to see if the target is online
  7. func (m *RouteManager) IsTargetOnline(matchingDomainOrIp string) bool {
  8. value, ok := m.LoadBalanceMap.Load(matchingDomainOrIp)
  9. if !ok {
  10. return false
  11. }
  12. isOnline, ok := value.(bool)
  13. return ok && isOnline
  14. }
  15. func (m *RouteManager) SetTargetOffline() {
  16. }
  17. // Ping a target to see if it is online
  18. func PingTarget(targetMatchingDomainOrIp string, requireTLS bool) bool {
  19. client := &http.Client{
  20. Timeout: 10 * time.Second,
  21. }
  22. url := targetMatchingDomainOrIp
  23. if requireTLS {
  24. url = "https://" + url
  25. } else {
  26. url = "http://" + url
  27. }
  28. resp, err := client.Get(url)
  29. if err != nil {
  30. return false
  31. }
  32. defer resp.Body.Close()
  33. return resp.StatusCode >= 200 && resp.StatusCode <= 600
  34. }
  35. // StartHeartbeats start pinging each server every minutes to make sure all targets are online
  36. // Active mode only
  37. /*
  38. func (m *RouteManager) StartHeartbeats(pingTargets []*FallbackProxyTarget) {
  39. ticker := time.NewTicker(1 * time.Minute)
  40. defer ticker.Stop()
  41. fmt.Println("Heartbeat started")
  42. go func() {
  43. for {
  44. select {
  45. case <-m.onlineStatusTickerStop:
  46. ticker.Stop()
  47. return
  48. case <-ticker.C:
  49. for _, target := range pingTargets {
  50. go func(target *FallbackProxyTarget) {
  51. isOnline := PingTarget(target.MatchingDomainOrIp, target.RequireTLS)
  52. m.LoadBalanceMap.Store(target.MatchingDomainOrIp, isOnline)
  53. }(target)
  54. }
  55. }
  56. }
  57. }()
  58. }
  59. */