visit
This is all the code you actually require… Choosing a Programming Language for a project shouldn’t be like declaring who your favourite team is. it should be a matter of pragmatism and choosing the right tool for the right job. In this post I want to show you when and why Go shines as a language. Specifically I want to show you how rock solid their standard lib is for basic internet programming. Even more specifically… were gonna write a Reverse Proxy!
“Go has a lot going for it but where it really struts it stuff is in these lower level network plumbing tasks, there’s no better language.”
What is a reverse proxy? A big fancy way of saying a traffic forwarder. I get a request send from a client, send that request to another server, receive a response from the server and forward it back to the client. The reverse part of this simply means the proxy itself determines where to send traffic and when
Just beautiful 😍… Why is it useful? Because the concept is so simple it can be applied to assist in many different cases: Load balancing, A/B Testing, Caching, Authentication etc… By the end of this short post you will have learned how to:
2. Reads the body of a request, specifically the proxy_condition
field
3. If the proxy domain is equal to A
send traffic to URL 1
4. If the proxy domain is equal to B
send traffic to URL 2
I find the best approach is to create a .env
file that contains the desired environment variables.
This is a habit I picked up from the
After you save your .env
file you can run:
Next lets create a file called main.go
that does the following:
1. When started logs the PORT
, A_CONDITION_URL
, B_CONDITION_URL
, and DEFAULT_CONDITION_URL
environment variables to the console
2. Listen for requests on the path: /
💀Let’s get the skeletons out of the closet so we can move onto the fun stuff. Now you should be able to run
Now that we have the skeleton of our project together we want to start creating the logic that will handle parsing the request body. Start by updating handleRequestAndRedirect
to parse the proxy_condition
value from the request body.
Basic parsing of a JSON blob to a struct in Go.
proxy_condition
to determine where we send trafficNow that we have the value of the proxy_condition
from the request we will use it to decide where we direct our reverse proxy to. Remember from earlier that we have three cases:
proxy_condition
is equal to A
then we send traffic to A_CONDITION_URL
proxy_condition
is equal to B
then we send traffic to B_CONDITION_URL
DEFAULT_CONDITION_URL
The one time in the project it felt like Go was truly getting out of my way.
Ok now that we have this all wired up setup our application on port 1330
and our 3 simple servers on ports 1331–1333
(all in separate terminals):
source .env && go install && $GOPATH/bin/reverse-proxy-demo
2. http-server -p 1331
3. http-server -p 1332
4. http-server -p 1333
"proxy\_condition": "a"
}'
If your looking for a great HTTP request client I cannot recommend enough.
and Viola we can start to see our reverse proxy directing traffic to one of our 3 servers based on what we set in the proxy_condition
field!
Its alive!!!
🧞 This is open source! you can
❤️ I only write about programming and remote work. If you I won’t waste your time.