之前我们介绍了 zuul网关服务,今天聊聊spring cloud gateway 作为spring cloud的亲儿子网关服务。很多的想法都是参照zuul,为了考虑zuul 迁移到gateway 提供了一个便利的条件。
gateway 他的核心功能也是和zuul 类似。但是他的实现方式与zuul 却有些不一样,他的核心是基于 Spring Boot 2.x, Spring WebFlux和Project Reactor 构建的。
Spring WebFlux 响应式Web框架。
由于响应式编程的特性,Spring WebFlux和Reactor底层需要支持异步的运行环境,比如Netty和Undertow;也可以运行在支持异步I/O的 - Servlet 3.1的容器之上,比如Tomcat(8.0.23及以上)和Jetty(9.0.4及以上)。
spring-webflux上层支持两种开发模式:
- 类似于Spring WebMVC的基于注解(@Controller、@RequestMapping)的开发模式;
所以spring cloud gateway 不是基于阻塞的web 开发。他与传统的Servlet是存在冲突的。在创建功能的时候要排除掉传统的Servlet jar包引用
客户端向Spring Cloud Gateway发出请求。如果网关处理程序映射确定请求与路由匹配,则将其发送到网关Web处理程序。该处理程序运行通过特定于请求的筛选器链发送请求。筛选器由虚线分隔的原因是,筛选器可以在发送代理请求之前或之后执行逻辑。执行所有“前置”过滤器逻辑,然后发出代理请求。发出代理请求后,将执行“发布”过滤器逻辑。
注意:在没有端口的路由中定义的URI将分别将HTTP和HTTPS URI的默认端口分别设置为80和443
修改之前工程的pom 文件总pom 里面我们有一个 spring-boot-starter-web 工程引用,删除掉。在服务里面单独依赖。上面已经讲述过,传统Servlet的jar包冲突问题。
在服务消费者和 服务提供者分别添加
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> </dependencies>
我们创建工程 cloud-gateway ,修改pom
<dependencies> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
创建 bootstrap.yml
server: port: 9000 spring: profiles: active: dev application: name: cloud-gateway-demo jackson: date-format: yyyy-MM-dd HH:mm:ss time-zone: GMT+8 default-property-inclusion: non_null cloud: nacos: discovery: server-addr: 47.99.209.72:8848 # ${prefix}-${spring.profile.active}.${file-extension} config: server-addr: 47.99.209.72:8848 file-extension: yaml gateway: discovery: locator: # 是否与服务发现组件进行结合,通过serviceId转发到具体的服务实例。默认false, # 为true代表开启基于服务发现的路由规则。 enabled: true # 配置之后访问时无需大写 lower-case-service-id: true routes: - id: cloud-discovery-server uri: lb://cloud-discovery-server predicates: # 路径匹配,以 api 开头,直接配置是不生效的,看 filters 配置 - Path=/server/** filters: # 前缀过滤,默认配置下,我们的请求路径是 http://localhost:9000/myshop-service-consumer-item/** 这时会路由到指定的服务 # 此处配置去掉 1 个路径前缀,再配置上面的 Path=/api/**,就能按照 http://localhost:9000/api/** 的方式访问了 - StripPrefix=1 - id: cloud-discovery-client uri: lb://cloud-discovery-client predicates: # 路径匹配,以 api 开头,直接配置是不生效的,看 filters 配置 - Path=/client/** filters: # 前缀过滤,默认配置下,我们的请求路径是 http://localhost:9000/myshop-service-consumer-item/** 这时会路由到指定的服务 # 此处配置去掉 1 个路径前缀,再配置上面的 Path=/api/**,就能按照 http://localhost:9000/api/** 的方式访问了 - StripPrefix=1
创建main 启动类
package com.xian.cloud; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cloud.client.discovery.EnableDiscoveryClient; /** * * @Author: xlr * @Date: Created in 上午11:08 2019/11/4 */ @EnableDiscoveryClient @SpringBootApplication public class GatewayServerApplication { public static void main(String[] args) { SpringApplication.run(GatewayServerApplication.class, args); } }
启动服务 命令行curl http://localhost :9000/client/client/test
服务已经整合完毕。路由功能转发已经实现。配置文件的一些字段的说明也在注释上说明。
下一篇讲述一下 Spring Cloud Gateway 断言
如何喜欢可以关注分享本公众号。
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。转载请附带公众号二维码