Run the 3 application classes as spring boot applications.
ZuulGatewayApplication
: runs zuul on port 8080FooApplication
: hosts a/foo
service on port 9080BarApplication
: hosts a/foo
service with a different implementation on port 7080
There are a number of filters are implemented:
AddResponseHeaderFilter
: adds a randomX-Foo
header to the responseModifyResponseBodyFilter
: Adds a prefix to the response usingRequestContext.setResponseBody(String)
. Only runs ifservice
query parameter is NOT set.ModifyResponseDataStreamFilter
: Adds a prefix to the response usingRequestContext.setResponseDataStream(InputStream)
. Only runs ifservice
query parameter is set.PrefixRequestEntityFilter
: Adds a prefix to the request body by using a request wrapper andRequestContext.setRequest()
. Only runs ifservice
query parameter is set.QueryParamPortPreFilter
: sets the port of theRequestContext.getRouteHost
to the value of theport
query parameter. Only runs ifport
query parameter is set.QueryParamServiceIdPreFilter
: sets theserviceId
to the value of theservice
query parameter.UppercaseRequestEntityFilter
: Upper cases the request body by settingRequestContext.setRequest("requestEntity")
. Only runs ifservice
query parameter is NOT set.
All examples use HTTPie(A better curl replacement).
$ http :8080/foo
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Date: Wed, 22 Mar 2017 20:06:45 GMT
Transfer-Encoding: chunked
X-Application-Context: application
X-Foo: 41e04412-84e8-48ac-8d71-cec209eda9ca
Modified via setResponseBody(): foo from FooApplication$$EnhancerBySpringCGLIB$$82229332
The application is routed to FooApplication
because the response contains foo from FooApplication
.
The AddResponseHeaderFilter
ran because of the X-Foo: 41e04412-84e8-48ac-8d71-cec209eda9ca
header was added to the response.
The ModifyResponseBodyFilter
was run because the body was prefixed with Modified via setResponseBody():
.
$ http ":8080/foo?service=bar"
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Date: Wed, 22 Mar 2017 20:09:23 GMT
Transfer-Encoding: chunked
X-Application-Context: application
X-Foo: 9dc2e5fa-a43f-445d-a289-d3e62319413a
Modified via setResponseDataStream(): bar from BarApplication$$EnhancerBySpringCGLIB$$a78c1598
The application is routed to BarApplication
because the response contains bar from BarApplication
.
The AddResponseHeaderFilter
ran because of the X-Foo: 9dc2e5fa-a43f-445d-a289-d3e62319413a
header was added to the response.
The ModifyResponseDataStreamFilter
was run because the body was prefixed with Modified via setResponseDataStream():
.
$ echo -n "hello" | http POST :8080/foo
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Date: Wed, 22 Mar 2017 21:48:46 GMT
Transfer-Encoding: chunked
X-Application-Context: application
X-Foo: 69866ea1-db9a-4275-a8f1-5e20d87e5065
Modified via setResponseBody(): foo recieved: HELLO
UppercaseRequestEntityFilter
was run because foo recieved: HELLO
was in the response body.
$ echo -n "hello" | http POST ":8080/foo?service=bar"
HTTP/1.1 200
Content-Type: application/json;charset=UTF-8
Date: Wed, 22 Mar 2017 21:49:02 GMT
Transfer-Encoding: chunked
X-Application-Context: application
X-Foo: 97aebe27-6845-4dc3-9ef6-80ccdf14059d
Modified via setResponseDataStream(): bar recieved: request body modified via request wrapper: hello
PrefixRequestEntityFilter
was run because foo recieved: HELLO
was in the response body.
$ http :8080/hello
HTTP/1.1 500
Connection: close
Content-Type: application/json;charset=UTF-8
Date: Fri, 24 Mar 2017 21:05:04 GMT
Transfer-Encoding: chunked
X-Application-Context: application
{
"error": "Internal Server Error",
"exception": "org.apache.http.conn.HttpHostConnectException",
"message": "Connect to localhost:80 [localhost/127.0.0.1, localhost/0:0:0:0:0:0:0:1, localhost/fe80:0:0:0:0:0:0:1%1] failed: Connection refused",
"status": 500,
"timestamp": 1490389504014
}
Uses a bad port, QueryParamPortPreFilter
not run.
$ http ":8080/hello?port=9080"
HTTP/1.1 200
Content-Type: text/plain;charset=UTF-8
Date: Fri, 24 Mar 2017 21:07:07 GMT
Transfer-Encoding: chunked
X-Application-Context: application
X-Foo: 50774952-b947-47cd-902b-2889d02feece
Modified via setResponseBody(): hello from FooApplication$$EnhancerBySpringCGLIB$$82229332
QueryParamPortPreFilter
was run because response contains hello from FooApplication
.