SpringCloud系列:Spring Cloud GateWay初体验

举报
云享专家 发表于 2019/08/31 16:55:30 2019/08/31
【摘要】 在上面的myRoutes方法中,使用了一个RouteLocatorBuilder的bean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicates和filters,predicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

这篇文章讲述了如何简单地使用Spring Cloud Gateway,来源于Spring Cloud官方案例,地址:

https://spring.io/guides/gs/gateway 

简介

Spring Cloud GatewaySpring Cloud官方推出的第二代网关框架,取代Zuul网关。网关作为流量的,在微服务系统中有着非常作用,网关常见的功能有路由转发、权限校验、限流控制等作用。本文首先用官方的案例带领大家来体验下Spring Cloud的一些简单的功能,在后续文章我会使用详细的案例和源码解析来详细讲解Spring Cloud Gateway.

创建工程

本案例的的源码下载于官方案例,也可以在我的Github上下载。工程使用的Spring Boot版本为2.0.5.RELEASESpring Cloud版本为Finchley.SR1

新建一个工程,取名为sc-f-gateway-first-sight在工程的pom文件引用工程所需的依赖,包括spring bootspring cloud,以及gateway的起步依赖spring-cloud-starter-gateway,代码如下:

1.     <parent>

2.          <groupId>org.springframework.boot</groupId>

3.          <artifactId>spring-boot-starter-parent</artifactId>

4.          <version>2.0.5.RELEASE</version>

5.      </parent>

6.

7.      <dependencyManagement>

8.          <dependencies>

9.              <dependency>

10.                  <groupId>org.springframework.cloud</groupId>

11.                  <artifactId>spring-cloud-dependencies</artifactId>

12.                  <version>Finchley.SR1</version>

13.                  <type>pom</type>

14.                  <scope>import</scope>

15.              </dependency>

16.          </dependencies>

17.      </dependencyManagement>

18.   <dependency>

19.              <groupId>org.springframework.cloud</groupId>

20.              <artifactId>spring-cloud-starter-gateway</artifactId>

21.  </dependency>

注:详细的pom文件依赖,可以见源码。*

创建一个简单的路由

spring cloud gateway中使用RouteLocatorBean进行路由转发,将请求进行处理,最后转发到目标的下游服务。在本案例中,会将请求转发到http://httpbin.org:80这个地址上。代码如下:

1.  @SpringBootApplication

2.  @RestController

3.  publicclassApplication{

4.


5.      publicstaticvoidmain(String[]args){

6.          SpringApplication.run(Application.class,args);

7.      }

8.      @Bean

9.      publicRouteLocatormyRoutes(RouteLocatorBuilderbuilder){

10.         returnbuilder.routes()

11.          .route(p ->p

12.              .path("/get")

13.              .filters(f ->f.addRequestHeader("Hello","World"))

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

15.          .build();

16.      }

17.


18.      }

在上面的myRoutes方法中,使用了一个RouteLocatorBuilderbean去创建路由,除了创建路由RouteLocatorBuilder可以让你添加各种predicatesfilterspredicates断言的意思,顾名思义就是根据具体的请求的规则,由具体的route去处理,filters是各种过滤器,用来对请求做各种判断和修改。

上面创建的route可以让请求“/get”请求都转发到“http://httpbin.org/get”。在route配置上,我们添加了一个filter,该filter会将请求添加一个header,keyhellovalueworld

启动springboot项目,在浏览器上http://localhost:8080/get,浏览器显示如下:

1.  {

2.    "args":{},



3.    "headers":{

4.      "Accept":"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",


5.      "Accept-Encoding":"gzip, deflate, br",

6.      "Accept-Language":"zh-CN,zh;q=0.9,en;q=0.8",

7.      "Cache-Control":"max-age=0",

8.      "Connection":"close",

9.      "Cookie":"_ga=GA1.1.412536205.1526967566; JSESSIONID.667921df=node01oc1cdl4mcjdx1mku2ef1l440q1.node0; screenResolution=1920x1200",

10.      "Forwarded":"proto=http;host=\"localhost:8080\";for=\"0:0:0:0:0:0:0:1:60036\"",

11.      "Hello":"World",

12.      "Host":"httpbin.org",

13.      "Upgrade-Insecure-Requests":"1",

14.      "User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36",

15.      "X-Forwarded-Host":"localhost:8080"

16.    },

17.    "origin":"0:0:0:0:0:0:0:1, 210.22.21.66",

18.    "url":"http://localhost:8080/get"

19.  }

可见当我们向gateway工程请求“/get”,gateway会将工程的请求转发到“http://httpbin.org/get”,并且在转发之前,加上一个filter,该filter会将请求添加一个header,keyhellovalueworld

注意HTTPBin展示了请求的header hello和值world

使用Hystrix

spring cloud gateway中可以使用HystrixHystrixspring cloud中一个服务熔断降级的组件,在微服务系统有着十分重要的作用。Hystrixspring cloud gateway中是以filter的形式使用的,代码如下:

1.     @Bean

2.      publicRouteLocatormyRoutes(RouteLocatorBuilderbuilder){

3.          StringhttpUri ="http://httpbin.org:80";

4.          returnbuilder.routes()

5.              .route(p ->p

6.                  .path("/get")

7.                  .filters(f ->f.addRequestHeader("Hello","World"))

8.                  .uri(httpUri))

9.              .route(p ->p

10.                  .host("*.hystrix.com")

11.                  .filters(f ->f

12.                      .hystrix(config ->config

13.                          .setName("mycmd")

14.                          .setFallbackUri("forward:/fallback")))

15.                  .uri(httpUri))

16.              .build();

17.      }

在上面的代码中,我们使用了另外一个router,该router使用host去断言请求是否进入该路由,当请求的host“*.hystrix.com”,都会进入该router,该router中有一个hystrixfilter,filter可以配置名称、和指向性fallback的逻辑的地址,比如本案例中重定向到了“/fallback”

现在写的一个“/fallback”l逻辑:

1.   @RequestMapping("/fallback")

2.      publicMono<String>fallback(){

3.          returnMono.just("fallback");

4.      }

Mono是一个Reactive stream,对外输出一个“fallback”字符串。

使用curl执行以下命令:

1.   curl --dump-header---header'Host: www.hystrix.com'http://localhost:8080/delay/3

返回的响应为:

1.  fallback

可见,带hostwww.hystrix.com的请求执行了hystrixfallback的逻辑。

总结

本文通过官方的一个简单的案例,来讲解了spring cloud gateway的简单用法,在spring cloud gateway中有2个重要的概念predicatesfilters,将会在后续文章讲解。敬请期待。

源码下载

https://github.com/forezp/SpringCloudLearning/tree/master/sc-f-gateway-first-sight

 

 原创作者:方志朋

方志朋简介:SpringCloud中国社区联合创始人,博客访问量突破一千万,爱好开源,热爱分享,活跃于各大社区,保持着非常强的学习驱动力,终身学习践行者,终身学习受益者。目前就职于国内某家知名互联网保险公司,担任DEVOPS工程师,对微服务领域和持续集成领域研究较深,精通微服务框架SpringCloud

 

 


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。