gpt4 book ai didi

Spring Cloud Gateway入门解读

转载 作者:qq735679552 更新时间:2022-09-27 22:32:09 26 4
gpt4 key购买 nike

CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.

这篇CFSDN的博客文章Spring Cloud Gateway入门解读由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.

spring cloud gateway介绍 。

前段时间刚刚发布了spring boot 2正式版,spring cloud gateway基于spring boot 2,是spring cloud的全新项目,该项目提供了一个构建在spring 生态之上的api网关,包括:spring 5,spring boot 2和project reactor。 spring cloud gateway旨在提供一种简单而有效的途径来发送api,并为他们提供横切关注点,例如:安全性,监控/指标和弹性。当前最新的版本是v2.0.0.m8,正式版最近也会到来.

spring cloud gateway的特征:

  1. java 8
  2. spring framework 5
  3. spring boot 2
  4. 动态路由
  5. 内置到spring handler映射中的路由匹配
  6. 基于http请求的路由匹配 (path, method, header, host, etc…​)
  7. 过滤器作用于匹配的路由
  8. 过滤器可以修改下游http请求和http响应 (add/remove headers, add/remove parameters, rewrite path, set path, hystrix, etc…​)
  9. 通过api或配置驱动
  10. 支持spring cloud discoveryclient配置路由,与服务发现与注册配合使用

vs netflix zuul 。

zuul基于servlet 2.5(使用3.x),使用阻塞api。 它不支持任何长连接,如websockets。而gateway建立在spring framework 5,project reactor和spring boot 2之上,使用非阻塞api。 websockets得到支持,并且由于它与spring紧密集成,所以将会是一个更好的开发体验.

spring cloud gateway入门实践 。

笔者最近研读了spring cloud gateway的源码,大部分功能的实现也写了源码分析的文章,但毕竟正式版没有发布,本文算是一篇入门实践,展示常用的几个功能,期待最近的正式版本发布.

示例启动两个服务:gateway-server和user-server。模拟的场景是,客户端请求后端服务,网关提供后端服务的统一入口。后端的服务都注册到服务发现consul(搭建zk,eureka都可以,笔者比较习惯使用consul)。网关通过负载均衡转发到具体的后端服务.

用户服务 。

用户服务注册到consul上,并提供一个接口/test.

依赖 。

需要的依赖如下:

?
1
2
3
4
5
6
7
8
<dependency>
   <groupid>org.springframework.cloud</groupid>
   <artifactid>spring-cloud-starter-consul-discovery</artifactid>
</dependency>
<dependency>
   <groupid>org.springframework.boot</groupid>
   <artifactid>spring-boot-starter-web</artifactid>
</dependency>

配置文件 。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
  application:
   name: user-service
  cloud:
   consul:
    host: 192.168 . 1.204
    port: 8500
    discovery:
     ip-address: ${host_address:localhost}
     port: ${server_port:${server.port}}
     healthcheckpath: /health
     healthcheckinterval: 15s
     instance-id: user-${server.port}
     service-name: user
server:
  port: 8005
management:
  security:
   enabled: false

暴露接口 。

?
1
2
3
4
5
6
7
8
9
10
11
12
@springbootapplication
@restcontroller
@enablediscoveryclient
public class gatewayuserapplication {
   public static void main(string[] args) {
     springapplication.run(gatewayuserapplication. class , args);
   }
   @getmapping ( "/test" )
   public string test() {
     return "ok" ;
   }
}

暴露/test接口,返回ok即可.

网关服务 。

网关服务提供多种路由配置、路由断言工厂和过滤器工厂等功能.

依赖 。

需要引入的依赖:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<dependency>
   <groupid>org.springframework.boot</groupid>
   <artifactid>spring-boot-actuator</artifactid>
</dependency>
//依赖于webflux,必须引入
<dependency>
   <groupid>org.springframework.boot</groupid>
   <artifactid>spring-boot-starter-webflux</artifactid>
</dependency>
<dependency>
   <groupid>org.springframework.cloud</groupid>
   <artifactid>spring-cloud-gateway-core</artifactid>
</dependency>
//服务发现组件,排除web依赖
<dependency>
   <groupid>org.springframework.cloud</groupid>
   <artifactid>spring-cloud-starter-consul-discovery</artifactid>
   <version> 2.0 . 0 .m6</version>
   <exclusions>
     <exclusion>
       <groupid>org.springframework.boot</groupid>
       <artifactid>spring-boot-starter-web</artifactid>
     </exclusion>
   </exclusions>
</dependency>
//kotlin依赖
<dependency>
   <groupid>org.jetbrains.kotlin</groupid>
   <artifactid>kotlin-stdlib</artifactid>
   <version>${kotlin.version}</version>
   <optional> true </optional>
</dependency>
<dependency>
   <groupid>org.jetbrains.kotlin</groupid>
   <artifactid>kotlin-reflect</artifactid>
   <version>${kotlin.version}</version>
   <optional> true </optional>
</dependency>

如上引入了kotlin相关的依赖,这里需要支持kotlin的路由配置。spring cloud gateway的使用需要排除web相关的配置,引入的是webflux的引用,应用启动时会检查,必须引入.

路由断言工厂 。

路由断言工厂有多种类型,根据请求的时间、host、路径、方法等等。如下定义的是一个基于路径的路由断言匹配.

?
1
2
3
4
5
6
7
@bean
public routerfunction<serverresponse> testfunrouterfunction() {
   routerfunction<serverresponse> route = routerfunctions.route(
       requestpredicates.path( "/testfun" ),
       request -> serverresponse.ok().body(bodyinserters.fromobject( "hello" )));
   return route;
}

当请求的路径为/testfun时,直接返回ok的状态码,且响应体为hello字符串.

过滤器工厂 。

网关经常需要对路由请求进行过滤,进行一些操作,如鉴权之后构造头部之类的,过滤的种类很多,如增加请求头、增加请求参数、增加响应头和断路器等等功能.

?
1
2
3
4
5
6
7
8
9
10
11
12
@bean
public routelocator customroutelocator(routelocatorbuilder builder, throttlegatewayfilterfactory throttle) {
   //@formatter:off
   return builder.routes()
       .route(r -> r.path( "/image/webp" )
           .filters(f ->
               f.addresponseheader( "x-anotherheader" , "baz" ))
           .uri( "http://httpbin.org:80" )
       )
       .build();
   //@formatter:on
}

如上实现了当请求路径为/image/webp时,将请求转发到http://httpbin.org:80,并对响应进行过滤处理,增加响应的头部x-anotherheader: baz.

自定义路由 。

上面两小节属于api自定义路由,还可以通过配置进行定义:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
  cloud:
   gateway:
    locator:
     enabled: true
    default -filters:
    - addresponseheader=x-response- default -foo, default -bar
    routes:
    # =====================================
    - id: default_path_to_http
     uri: blueskykong.com
     order: 10000
     predicates:
     - path=/**

如上的配置定义了路由与过滤器。全局过滤器将所有的响应加上头部x-response-default-foo: default-bar。定义了id为default_path_to_http的路由,只是优先级比较低,当该请求都不能匹配时,将会转发到blueskykong.com.

kotlin自定义路由 。

spring cloud gateway可以使用kotlin自定义路由:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
@configuration
class additionalroutes {
  @bean
  fun additionalroutelocator(builder: routelocatorbuilder): routelocator = builder.routes {
  route(id = "test-kotlin" ) {
   path( "/image/png" )
   filters {
   addresponseheader( "x-testheader" , "foobar" )
   }
   uri( "http://httpbin.org:80" )
  }
  }
}

当请求的路径是/image/png,将会转发到http://httpbin.org:80,并设置了过滤器,在其响应头中加上了x-testheader: foobar头部.

服务发现组件 。

与服务注册于发现组件进行结合,通过serviceid转发到具体的服务实例。在前面的配置已经引入了相应的依赖.

?
1
2
3
4
@bean
public routedefinitionlocator discoveryclientroutedefinitionlocator(discoveryclient discoveryclient) {
   return new discoveryclientroutedefinitionlocator(discoveryclient);
}

将discoveryclient注入到discoveryclientroutedefinitionlocator的构造函数中,关于该路由定义定位器,后面的源码分析会讲解,此处不展开.

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
spring:
  cloud:
   gateway:
    locator:
     enabled: true
    default -filters:
    - addresponseheader=x-response- default -foo, default -bar
    routes:
    # =====================================
    - id: service_to_user
     uri: lb: //user
     order: 8000
     predicates:
     - path=/user/**
     filters:
     - stripprefix= 1

上面的配置开启了discoveryclient定位器的实现。路由定义了,所有请求路径以/user开头的请求,都将会转发到user服务,并应用路径的过滤器,截取掉路径的第一部分前缀。即访问/user/test的实际请求转换成了lb://user/test.

websocket 。

还可以配置websocket的网关路由:

?
1
2
3
4
5
6
7
8
9
10
11
spring:
  cloud:
   gateway:
    default -filters:
    - addresponseheader=x-response- default -foo, default -bar
    routes:
    - id: websocket_test
     uri: ws: //localhost:9000
     order: 9000
     predicates:
     - path=/echo

启动一个ws服务端wscat --listen 9000,将网关启动(网关端口为9090),进行客户端连接即可wscat --connect ws://localhost:9090/echo.

客户端的访问 。

上述实现的功能,读者可以自行下载源码进行尝试。笔者这里只展示访问用户服务的结果:

Spring Cloud Gateway入门解读

Spring Cloud Gateway入门解读

网关成功负载均衡到user-server,并返回了ok。响应的头部中包含了全局过滤器设置的头部x-response-default-foo: default-bar 。

总结 。

在本文中,我们探讨了属于spring cloud gateway的一些功能和组件。 这个新的api提供了用于网关和代理支持的开箱即用工具。期待spring cloud gateway 2.0正式版.

源码地址 。

https://github.com/keets2012/spring-cloud_samples 。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.

原文链接:http://blueskykong.com/2018/03/10/cloud-Gateway-1/ 。

最后此篇关于Spring Cloud Gateway入门解读的文章就讲到这里了,如果你想了解更多关于Spring Cloud Gateway入门解读的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com