Autumn SALE
Proxy

Proxy in Go

Proxy is a structural design pattern that provides an object that acts as a substitute for a real service object used by a client. A proxy receives client requests, does some work (access control, caching, etc.) and then passes the request to a service object.

The proxy object has the same interface as a service, which makes it interchangeable with a real object when passed to a client.

Conceptual Example

A web server such as Nginx can act as a proxy for your application server:

  • It provides controlled access to your application server.
  • It can do rate limiting.
  • It can do request caching.

server.go: Subject

package main type server interface {	handleRequest(string, string) (int, string) } 

nginx.go: Proxy

package main type Nginx struct {	application *Application	maxAllowedRequest int	rateLimiter map[string]int } func newNginxServer() *Nginx {	return &Nginx{	application: &Application{},	maxAllowedRequest: 2,	rateLimiter: make(map[string]int),	} } func (n *Nginx) handleRequest(url, method string) (int, string) {	allowed := n.checkRateLimiting(url)	if !allowed {	return 403, "Not Allowed"	}	return n.application.handleRequest(url, method) } func (n *Nginx) checkRateLimiting(url string) bool {	if n.rateLimiter[url] == 0 {	n.rateLimiter[url] = 1	}	if n.rateLimiter[url] > n.maxAllowedRequest {	return false	}	n.rateLimiter[url] = n.rateLimiter[url] + 1	return true } 

application.go: Real subject

package main type Application struct { } func (a *Application) handleRequest(url, method string) (int, string) {	if url == "/app/status" && method == "GET" {	return 200, "Ok"	}	if url == "/create/user" && method == "POST" {	return 201, "User Created"	}	return 404, "Not Ok" } 

main.go: Client code

package main import "fmt" func main() {	nginxServer := newNginxServer()	appStatusURL := "/app/status"	createuserURL := "/create/user"	httpCode, body := nginxServer.handleRequest(appStatusURL, "GET")	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)	httpCode, body = nginxServer.handleRequest(appStatusURL, "GET")	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)	httpCode, body = nginxServer.handleRequest(appStatusURL, "GET")	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)	httpCode, body = nginxServer.handleRequest(createuserURL, "POST")	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body)	httpCode, body = nginxServer.handleRequest(createuserURL, "GET")	fmt.Printf("\nUrl: %s\nHttpCode: %d\nBody: %s\n", appStatusURL, httpCode, body) } 

output.txt: Execution result

Url: /app/status HttpCode: 200 Body: Ok Url: /app/status HttpCode: 200 Body: Ok Url: /app/status HttpCode: 403 Body: Not Allowed Url: /app/status HttpCode: 201 Body: User Created Url: /app/status HttpCode: 404 Body: Not Ok 

Proxy in Other Languages

Proxy in C# Proxy in C++ Proxy in Java Proxy in PHP Proxy in Python Proxy in Ruby Proxy in Rust Proxy in Swift Proxy in TypeScript