文章推荐
从0到1构建微服务之基础工程创建(一)
从0到1构建微服务之服务注册-nacos(二)
从0到1构建微服务之服务通信-feign(三)
简介
前面的章节已经提前将gateway名字的工程服务创建好了,只是没引入gateway组件依赖,本章节主要引入gateway依赖,添加相应的配置并能完成服务的转发。另外会着重介绍相关配置的使用方式。
注:目前所有的代码构建肯定不是最优的,比如版本依赖的版本号抽取管理等等,后续都会一步一步去做。
1、Gateway功能简介
Gateway是网关组件,后期规划所有的服务都需要经过网关。其主要的功能有请求路由转发、权限控制以及流量限制等
2、pom添加gateway依赖
<dependency>
<!--gateway网关-->
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
<version>3.0.6</version>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</exclusion>
</exclusions>
</dependency>
3、application.yml新增配置
server:
port: 8003
spring:
main:
web-application-type: reactive
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: share-dev
gateway:
enabled: true
routes:
- id: adminbiz-server
uri: lb://adminbiz-server
# uri: http://127.0.0.1:8001
predicates:
- Path=/adminbiz/**
- id: user-server
uri: lb://user-server
# uri: http://127.0.0.1:8002
predicates:
- Path=/user/**
globalcors: # 全局的跨域处理
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
corsConfigurations:
'[/**]':
allowedOrigins: # 允许哪些网站的跨域请求
- "http://localhost:8090"
allowedMethods: # 允许的跨域ajax的请求方式
- "GET"
- "POST"
- "DELETE"
- "PUT"
- "OPTIONS"
allowedHeaders: "*" # 允许在请求中携带的头信息
allowCredentials: true # 是否允许携带cookie
maxAge: 360000 # 这次跨域检测的有效期
4、启动服务测试结果
将gateway重新启动,访问localhost:8003/biz/test/testFeign,结果是能正常访问的,和直接访问8001端口是没区别的。到此为止,我们gateway的转发服务路由功能暂时实现了。
biz服务8001
user服务8002
gateway服务8003
5、过滤器介绍
(1)默认过滤器
默认过滤器是网关提供了过滤器工厂,将其设置到路由默认项,对经过网关的请求都进行过滤。
如下yaml配置文件举例,添加default-filters项
spring:
main:
web-application-type: reactive
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: share-dev
gateway:
enabled: true
routes:
- id: adminbiz-server
uri: lb://adminbiz-server
# uri: http://127.0.0.1:8001
predicates:
- Path=/adminbiz/**
- id: user-server
uri: lb://user-server
# uri: http://127.0.0.1:8002
predicates:
- Path=/user/**
default-filters: # 默认过滤项
- AddRequestHeader=Truth, share!
(2)路由过滤器
路由过滤器和默认过滤器差不多,都是采用网关的提供的过滤器工厂,区别在于路由过滤器配置在对应的路由下,只对该路由请求生效。如下yaml配置文件举例,给biz-server添加filters项
spring:
main:
web-application-type: reactive
application:
name: gateway-server
cloud:
nacos:
discovery:
server-addr: localhost:8848
namespace: share-dev
gateway:
enabled: true
routes:
- id: adminbiz-server
uri: lb://adminbiz-server
# uri: http://127.0.0.1:8001
predicates:
- Path=/adminbiz/**
filters:
- AddRequestHeader=Truth, share!
- id: user-server
uri: lb://user-server
# uri: http://127.0.0.1:8002
predicates:
- Path=/user/**
(3)全局过滤器
如果我们需要自己定义一些处理逻辑,如授权认证等,依靠前面两种过滤器是无法实现的,此时我们就需要用到全局过滤器。定义方式是实现GlobalFilter接口。下面举例代码说明
另外,如果配置了多个全局过滤器,可以用注解@order来定义过滤链中的执行先后顺序,order越小那么执行的越靠前
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.MultiValueMap;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@order(1)
@Component
public class AuthFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
// 1.获取请求参数
MultiValueMap<String, String> params = exchange.getRequest().getQueryParams();
// 2.获取auth参数
String auth = params.getFirst("auth");
// 3.校验
if ("success".equals(auth)) {
// 放行
return chain.filter(exchange);
}
// 4.拦截
// 4.1.禁止访问,设置状态码
exchange.getResponse().setStatusCode(HttpStatus.FORBIDDEN);
// 4.2.结束处理
return exchange.getResponse().setComplete();
}
}