Cookbook
Reverse Proxy
Forward one Zinc path prefix to an upstream service with explicit path rewriting and transport timeouts.
Forward everything under /api to another service, with timeouts on the upstream connection. Zinc stays in front, so its middleware, such as logging, auth, and rate limits, still runs for proxied requests.
package main
import ( "log" "net" "net/http" "time"
"github.com/0mjs/zinc" "github.com/0mjs/zinc/middleware")
func main() { transport := &http.Transport{ DialContext: (&net.Dialer{Timeout: 3 * time.Second}).DialContext, ResponseHeaderTimeout: 5 * time.Second, IdleConnTimeout: 90 * time.Second, }
app := zinc.New() app.UsePrefix( "/api", middleware.ProxyWithConfig(middleware.ProxyConfig{ Target: "http://127.0.0.1:9000", Rewrite: map[string]string{ "/api/*": "/*", }, Transport: transport, }), )
log.Fatal(app.Listen(":8080"))}A request to /api/users is forwarded to
http://127.0.0.1:9000/users. The client keeps talking to Zinc; this is an
internal rewrite, not a redirect.
Use Targets for round-robin upstreams, Balancer for custom selection,
ModifyResponse for response changes, and opt-in retries only for requests
whose bodies can be replayed safely. See Proxy middleware
for the complete configuration.