文章首发于公众号《程序员果果》 地址:
简介
Spring Cloud Gateway ,相比之前我们使用的 Zuul(1.x) 它有哪些优势呢?Zuul(1.x) 基于 Servlet,使用阻塞 API,它不支持任何长连接,如 WebSockets。Spring Cloud Gateway 使用非阻塞 API,支持 WebSockets,支持限流等新特性。本文首先用官方的案例带领大家来体验下Spring Cloud的一些简单的功能。
创建工程
创建工程springcloud工程,名为springcloud-gateway-hello
pom.xml 内容如下:
4.0.0 org.springframework.boot spring-boot-starter-parent 2.1.2.RELEASE com.gf springcloud-gateway-hello 0.0.1-SNAPSHOT springcloud-gateway-hello Demo project for Spring Boot 1.8 Greenwich.RELEASE org.springframework.cloud spring-cloud-starter-gateway org.springframework.boot spring-boot-starter-test test org.springframework.cloud spring-cloud-dependencies ${spring-cloud.version} pom import org.springframework.boot spring-boot-maven-plugin spring-milestones Spring Milestones https://repo.spring.io/milestone
##创建一个简单的路由 Spring Cloud Gateway 使用路由来处理对下游服务的请求。创建RouteLocator的Bean,在本案例将把所有请求路由到
@SpringBootApplicationpublic class SpringcloudGatewayHelloApplication { public static void main(String[] args) { SpringApplication.run( SpringcloudGatewayHelloApplication.class, args ); } @Bean public RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p .path("/get") .filters(f -> f.addRequestHeader("Hello", "World")) .uri("http://httpbin.org:80")) .build(); }}
上述myRoutes方法RouteLocatorBuilder可以很容易地用于创建路由。除了创建路由之外,RouteLocatorBuilder还允许你在路由中添加各种 predicates(断言) 和 filters,以便根据特定条件更改请求和响应。
上面创建的route可以让请求“/get”请求都转发到“
启动项目,访问
{ "args": { }, "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8", "Accept-Encoding": "gzip, deflate, br", "Accept-Language": "zh-CN,zh;q=0.9,zh-TW;q=0.8", "Cache-Control": "max-age=0", "Connection": "close", "Forwarded": "proto=http;host=\"127.0.0.1:8080\";for=\"127.0.0.1:55607\"", "Hello": "World", "Host": "httpbin.org", "Upgrade-Insecure-Requests": "1", "User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36", "X-Forwarded-Host": "127.0.0.1:8080" }, "origin": "127.0.0.1, 124.74.78.150", "url": "http://127.0.0.1:8080/get"}
可见当向gateway工程请求“/get”,gateway会将工程的请求转发到“
使用Hystrix
在spring cloud gateway中可以使用Hystrix。Hystrix是 spring cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。 Hystrix 在 spring cloud gateway中是以filter的形式使用的,代码如下:
@Beanpublic RouteLocator myRoutes(RouteLocatorBuilder builder) { return builder.routes() .route(p -> p .path("/get") .filters(f -> f.addRequestHeader("Hello", "World")) .uri("http://httpbin.org:80")) .route(p -> p .host("*.hystrix.com") .filters(f -> f.hystrix(config -> config .setName("mycmd") .setFallbackUri("forward:/fallback"))) .uri("http://httpbin.org:80")) .build();}
在上面的代码中,我们使用了另外一个router,该router使用host去断言请求是否进入该路由,当请求的host为 “*.hystrix.com”,都会进入该router,该router中有一个hystrix的filter,该filter可以配置名称、和指向性fallback的逻辑的地址,比如本案例中重定向到了“/fallback”。
现在写的一个“/fallback”的l逻辑:
@RequestMapping("/fallback")public String fallback() { return "fallback";}
使用curl执行以下命令:
curl --dump-header - --header 'Host: www.hystrix.com' http://localhost:8080/delay/3
返回的响应为:
HTTP/1.1 200 OKContent-Type: text/plain;charset=UTF-8Content-Length: 8fallback
可见,带host www.hystrix.com 的请求执行了hystrix的fallback的逻辑。
源码
关注我
欢迎扫码或微信搜索公众号《程序员果果》关注我,关注有惊喜~