时间:2021-05-02
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的特征:
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。
客户端的访问
上述实现的功能,读者可以自行下载源码进行尝试。笔者这里只展示访问用户服务的结果:
网关成功负载均衡到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/
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
springcloudgateway的包结构(在Idea2019.3中展示)这个包是spring-cloud-gateway-core.这里是真正的spring
在Spring-Cloud-Gateway之请求处理流程文中我们了解最终网关是将请求交给过滤器链表进行处理,接下来我们阅读Spring-Cloud-Gatewa
1.官方文档https://cloud.spring.io/spring-cloud-static/spring-cloud-openfeign/2.2.2.R
文档地址https://github.com/alibaba/spring-cloud-alibaba/blob/master/spring-cloud-ali
引入依赖org.springframework.cloudspring-cloud-dependencies${spring-cloud.version}pom