Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb...

60
Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos [email protected]

Transcript of Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb...

Page 1: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxterStephane Maldini - @smaldini

Younjin Jeong - @YZCerberos

[email protected]

Page 2: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

2

Spencer Gibb

Page 3: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

Page 4: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

Run on Spring Framework 5+

Page 5: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

Run on Spring Boot 2+&

Feature a cloud-native pattern

Page 6: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

That cloud-native pattern isAPI Gateway

Page 7: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

What is an API Gateway ?

http://microservices.io/patterns/apigateway.html

Page 8: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

8

Page 9: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

9

Page 10: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

10

Page 11: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

11

Routing

Security

Monitoring

Canary-ing

Monolith Strangling

Resiliency

Page 12: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Gateway Types

Page 13: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

13

Appliance

Page 14: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

14

SAAS

Page 15: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

15

Web Server

Page 16: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

16

Mesh

Page 17: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Proxy Pattern

Page 18: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Sidecar Pattern

Page 19: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos
Page 20: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos
Page 21: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos
Page 22: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

22

Developer Oriented

Page 23: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

23

Zuul 1

Page 24: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

24

Zuul 1Zuul 2

https://medium.com/netflix-techblog/zuul-2-the-netflix-journey-to-asynchronous-non-blocking-

systems-45947377fb5c

Page 25: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

https://www.youtube.com/watch?v=2oXqbLhMS_A

Page 26: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Spring Cloud Gateway

Page 27: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

27

Built on…

Page 28: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

28

Page 29: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

29

Project Reactor

Page 30: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

30

Project Reactor

Page 31: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos
Page 32: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

32

Non-Blocking

Page 33: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

33

Inside the Gateway

Page 34: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

34

Inside the Gateway

Predicates

PathHostDate/TimeMethodHeadersQuery ParamsCookiesRead Body….

Page 35: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

35

Inside the Gateway

Pre-Filters

HeadersPathRate LimitingCookiesHystrixModify Body…

Page 36: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

36

Inside the Gateway

Global Filters

Netty RouterWeb SocketsLoad BalancerMetrics…

Page 37: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

37

Inside the Gateway

Post Filters

Set statusHeadersCookies…

Page 38: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

38

spring:

cloud:

gateway:

- id: foo_route

uri: lb://foo

predicates:

- Host=**.foo.org

- Path=/headers

- Method=GET

- Header=X-Request-Id, \d+

- Query=foo, ba.

- Query=baz

- Cookie=chocolate, ch.p

- After=1900-01-20T17:42:47.789-07:00[America/Denver]

filters:

- AddRequestHeader=X-Request-Foo, Bar

- AddResponseHeader=X-Response-Foo, Bar

- Hystrix=foo

- SecureHeaders

- RewritePath=/foo/(?<segment>.*), /$\{segment}

Route Configuration: YAML

Page 39: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

39

spring:

cloud:

gateway:

- id: foo_route

uri: lb://foo

predicates:

- Host=**.foo.org

- Path=/headers

- Method=GET

- Header=X-Request-Id, \d+

- Query=foo, ba.

- Query=baz

- Cookie=chocolate, ch.p

- After=1900-01-20T17:42:47.789-07:00[America/Denver]

filters:

- AddRequestHeader=X-Request-Foo, Bar

- AddResponseHeader=X-Response-Foo, Bar

- Hystrix=foo

- SecureHeaders

- RewritePath=/foo/(?<segment>.*), /$\{segment}

Route Configuration: YAML

Page 40: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

40

Route Configuration: Java@Bean

public RouteLocator customRouteLocator(RouteLocatorBuilder builder,

ThrottleGatewayFilterFactory throttle) {

return builder.routes()

.route(r -> r.host("**.abc.org").and().path("/image/png")

.filters(f -> f.addResponseHeader("X-TestHeader", "foobar"))

.uri("http://httpbin.org:80")

)

.route(r -> r.path("/image/webp")

.filters(f -> f.addResponseHeader("X-AnotherHeader", "baz"))

.uri("http://httpbin.org:80")

)

.route(r -> r.order(-1)

.host("**.throttle.org").and().path("/get")

.filters(f -> f.filter(throttle.apply(1, 1, 10,

TimeUnit.SECONDS)))

.uri("http://httpbin.org:80")

)

.build();

}

Page 41: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

41

Custom Filters

public class SetStatusWebFilterFactory implements GatewayFilterFactory {

@Override

public GatewayFilter apply(Config config) {

final HttpStatus status = parse(config.status);

return (exchange, chain) -> chain.filter(exchange)

.doOnComplete(() -> setResponseStatus(exchange, status));

}

}

Page 42: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Demo

Page 43: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Design Ideas

Page 44: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

44

Embedded

Page 45: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

45

Embedded

Sample Use Case

When latency is essential> no added network hops

Page 46: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

46

Embedded

Page 47: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

47

Embedded

Sample Use Case

Fine-grained access control for pay-per-use service or fragile backing service

Page 48: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

48

Facade

Page 49: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

49

Facade

Sample Use Cases

Prevent direct access to apps

Polyglot compatible

Page 50: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

50

Facade

Page 51: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

51

Facade

Sample Use Cases

Cross-cutting concerns

Present common API to clients

Shield clients from app refactoring (monolith → microservices)

Page 52: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

52

Cross-Cutting + App-Specific

Page 53: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

53

Cross-Cutting + App-Specific

Sample Use Case

Delegate cross-cutting concerns to a separate common gateway (and a separate dev team!)

Page 54: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

What Else Do We Have For Free ?

Page 55: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

Remember ?

55

Page 56: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

56

Spring Security

Page 57: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

57

Micrometer Support

Page 58: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

58

Micrometer Support

Page 59: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

59

Zipkin Support

Page 60: Spring Cloud Gateway - eventservice.kr · Spring Cloud Gateway Spencer Gibb - @spencerbgibb (Original) Ryan Baxter @ryanjbaxter Stephane Maldini - @smaldini Younjin Jeong - @YZCerberos

https://github.com/spring-cloud/spring-cloud-gateway

https://github.com/spring-cloud-samples/spring-cloud-gateway-sample

http://slides.com/spencer/spring-cloud-gateway

https://github.com/ryanjbaxter/gateway-s1p-2018

Spencer Gibb - @spencerbgibb

Ryan Baxter @ryanjbaxter

Stephane Maldini - @smaldini

Questions?