{"id":22332747,"url":"https://github.com/xgfone/go-loadbalancer","last_synced_at":"2026-02-15T12:36:51.884Z","repository":{"id":57596811,"uuid":"376222845","full_name":"xgfone/go-loadbalancer","owner":"xgfone","description":"A set of the loadbalancer functions.","archived":false,"fork":false,"pushed_at":"2024-12-14T15:03:58.000Z","size":224,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-23T23:35:40.447Z","etag":null,"topics":["backend","forward","forwarder","forwarding","go","golang","health-check","healthcheck","load-balance","load-balancer","loadbalance","loadbalancer","upstream"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/xgfone.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2021-06-12T06:51:46.000Z","updated_at":"2024-12-20T03:11:16.000Z","dependencies_parsed_at":"2024-02-20T14:51:30.031Z","dependency_job_id":"8d05a18d-d559-46af-b53d-b1740cc75f23","html_url":"https://github.com/xgfone/go-loadbalancer","commit_stats":null,"previous_names":[],"tags_count":14,"template":false,"template_full_name":null,"purl":"pkg:github/xgfone/go-loadbalancer","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xgfone%2Fgo-loadbalancer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xgfone%2Fgo-loadbalancer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xgfone%2Fgo-loadbalancer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xgfone%2Fgo-loadbalancer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/xgfone","download_url":"https://codeload.github.com/xgfone/go-loadbalancer/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/xgfone%2Fgo-loadbalancer/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29478354,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T11:35:25.641Z","status":"ssl_error","status_checked_at":"2026-02-15T11:34:57.128Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","forward","forwarder","forwarding","go","golang","health-check","healthcheck","load-balance","load-balancer","loadbalance","loadbalancer","upstream"],"created_at":"2024-12-04T04:19:37.144Z","updated_at":"2026-02-15T12:36:51.841Z","avatar_url":"https://github.com/xgfone.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Go LoadBalancer\n\n[![Build Status](https://github.com/xgfone/go-loadbalancer/actions/workflows/go.yml/badge.svg)](https://github.com/xgfone/go-loadbalancer/actions/workflows/go.yml)\n[![GoDoc](https://pkg.go.dev/badge/github.com/xgfone/go-loadbalancer)](https://pkg.go.dev/github.com/xgfone/go-loadbalancer)\n[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg?style=flat-square)](https://raw.githubusercontent.com/xgfone/go-loadbalancer/master/LICENSE)\n![GitHub release (latest SemVer)](https://img.shields.io/github/v/tag/xgfone/go-loadbalancer?sort=semver)\n\nRequire Go `1.21+`.\n\n## Install\n\n```shell\n$ go get -u github.com/xgfone/go-loadbalancer\n```\n\n## Example\n\n### Mini API Gateway\n\n```go\npackage main\n\nimport (\n\t\"encoding/json\"\n\t\"flag\"\n\t\"net/http\"\n\n\t\"github.com/xgfone/go-loadbalancer\"\n\t\"github.com/xgfone/go-loadbalancer/balancer\"\n\t\"github.com/xgfone/go-loadbalancer/forwarder\"\n\t\"github.com/xgfone/go-loadbalancer/httpx\"\n)\n\nvar listenAddr = flag.String(\"listenaddr\", \":80\", \"The address that api gateway listens on.\")\n\nfunc main() {\n\tflag.Parse()\n\thttp.HandleFunc(\"/admin/route\", registerRouteHandler)\n\t_ = http.ListenAndServe(*listenAddr, nil)\n}\n\nfunc registerRouteHandler(w http.ResponseWriter, r *http.Request) {\n\tif r.Method != http.MethodPost {\n\t\tw.WriteHeader(http.StatusMethodNotAllowed)\n\t\treturn\n\t}\n\n\tvar req struct {\n\t\t// Route Matcher\n\t\tPath   string `json:\"path\" validate:\"required\"`\n\t\tMethod string `json:\"method\" validate:\"required\"`\n\n\t\t// Upstream Endpoints\n\t\tUpstream struct {\n\t\t\tForwardPolicy string `json:\"forwardPolicy\" default:\"weight_random\"`\n\t\t\tServers       []struct {\n\t\t\t\tHost   string `json:\"host\" validate:\"host\"`\n\t\t\t\tPort   uint16 `json:\"port\" validate:\"ranger(1,65535)\"`\n\t\t\t\tWeight int    `json:\"weight\" default:\"1\" validate:\"min(1)\"`\n\t\t\t} `json:\"servers\"`\n\t\t} `json:\"upstream\"`\n\t}\n\n\t// Notice: here we don't validate whether the values are valid.\n\tif err := json.NewDecoder(r.Body).Decode(\u0026req); err != nil {\n\t\thttp.Error(w, \"invalid request route paramenter: \"+err.Error(), 400)\n\t\treturn\n\t}\n\n\t// Build the upstream backend servers.\n\tstatic := loadbalancer.NewStaticWithCap(len(req.Upstream.Servers))\n\tfor _, server := range req.Upstream.Servers {\n\t\tc := httpx.Config{Host: server.Host, Port: server.Port, Weight: server.Weight}\n\t\tstatic.Append(c.NewEndpoint())\n\t}\n\n\t// Build the loadbalancer forwarder.\n\tbalancer := balancer.Get(req.Upstream.ForwardPolicy) // not check it is nil\n\tforwarder := forwarder.New(req.Method+\"@\"+req.Path, balancer, static)\n\n\t// Register the route and forward the request to forwarder.\n\thttp.HandleFunc(req.Path, func(w http.ResponseWriter, r *http.Request) {\n\t\tif r.Method != req.Method {\n\t\t\tw.WriteHeader(http.StatusMethodNotAllowed)\n\t\t} else {\n\t\t\t// You can use forwarder.ForwardHTTP to control the request and response.\n\t\t\tforwarder.ServeHTTP(w, r)\n\t\t}\n\t})\n}\n```\n\n```shell\n# Run the mini API-Gateway on the host 192.168.1.10\n$ nohup go run main.go \u0026\n\n# Add the route\n# Notice: remove the characters from // to the line end.\n$ curl -XPOST http://127.0.0.1/admin/route -H 'Content-Type: application/json' -d '\n{\n    \"path\": \"/path\",\n    \"method\": \"GET\",\n    \"upstream\": {\n        \"forwardPolicy\": \"weight_round_robin\",\n        \"servers\": [\n            {\"host\": \"192.168.1.11\", \"port\": 80, \"weight\": 10}, // 33.3% requests\n            {\"host\": \"192.168.1.12\", \"port\": 80, \"weight\": 20}  // 66.7% requests\n        ]\n    }\n}'\n\n# Access the backend servers by the mini API-Gateway:\n# 2/6(33.3%) requests -\u003e 192.168.1.11\n# 4/6(66.7%) requests -\u003e 192.168.1.12\n$ curl http://192.168.1.10/path\n192.168.1.11/backend/path\n\n$ curl http://192.168.1.10/path\n192.168.1.12/backend/path\n\n$ curl http://192.168.1.10/path\n192.168.1.12/backend/path\n\n$ curl http://192.168.1.10/path\n192.168.1.11/backend/path\n\n$ curl http://192.168.1.10/path\n192.168.1.12/backend/path\n\n$ curl http://192.168.1.10/path\n192.168.1.12/backend/path\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxgfone%2Fgo-loadbalancer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fxgfone%2Fgo-loadbalancer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fxgfone%2Fgo-loadbalancer/lists"}