第一步:创建新的module,引入springcloudgateway的依赖和nacos的服务发现依赖
<!--网关依赖-->
<dependency>
<groupid>org.springframework.cloud</groupid>
<artifactid>spring-cloud-starter-gateway</artifactid>
</dependency>
<!--nacos服务发现依赖-->
<dependency>
<groupid>com.alibaba.cloud</groupid>
<artifactid>spring-cloud-starter-alibaba-nacos-discovery</artifactid>
</dependency>
第二步:编写路由配置及nacos地址
server:
port: 10010
spring:
application:
name: gatewayserver
cloud:
nacos:
server-addr: localhost:8848
gateway:
routes:
- id: user-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
- id: order-service # 路由id,自定义,只要唯一即可
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
uri: lb://orderservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
- path=/order/** # 这个是按照路径匹配,只要以/user/开头就符合要求
基本过程:
路由配置包括:
1.路由id:路由的唯一标示 路由目标
2.(uri):路由的目标地址,http代表固定地址,lb代表根据服务名负载均衡 路由断言
3.(predicates):判断路由的规则, 路由过滤器,路由断言,判断请求是否符合要求,符合则转发到路由目的地
4.(filters):对请求或响应做处理
路由断言工厂route predicate factory
过滤器工厂 gatewayfilterfactory
实现方式一:在gateway中修改application.yml文件,给服务的路由添加过滤器:
spring:
cloud:
gateway:
routes: # 网关路由配置
- id: user-service
uri: lb://userservice predicates:
- path=/user/**
filters: # 过滤器
- addrequestheader=truth, itcast is freaking awesome! # 添加请求头
实现方式二:如果要对所有的路由都生效,则可以将过滤器工厂写到default下。格式如下:
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: # 网关路由配置
- id: user-service
uri: lb://userservice
predicates:
- path=/user/**
- id: order-service
uri: lb://orderservice
predicates:
- path=/order/**
default-filters: # 默认过滤器,会对所有的路由请求都生效
- addrequestheader=truth, itcast is freaking awesome! # 添加请求头
实现方式三:自定义类,实现globalfilter接口,添加@order注解:
@order(-1)
@component
public class authorizefilter implements globalfilter {
@override
public mono<void> filter(serverwebexchange exchange, gatewayfilterchain chain) {
// 1.获取请求参数
multivaluemap<string, string> params = exchange.getrequest().getqueryparams();
// 2.获取authorization参数
string auth = params.getfirst("authorization");
// 3.校验
if ("admin".equals(auth)) {
// 放行
return chain.filter(exchange);
}
// 4.拦截
// 4.1.禁止访问
exchange.getresponse().setstatuscode(httpstatus.forbidden);
// 4.2.结束处理
return exchange.getresponse().setcomplete();
}
}
过滤器执行顺序
1.每一个过滤器都必须指定一个int类型的order值,order值越小,优先级越高,执行顺序越靠前。
2.globalfilter通过实现ordered接口,或者添加@order注解来指定order值,由我们自己指定
3. 路由过滤器和defaultfilter的order由spring指定,默认是按照声明顺序从1递增。
4.当过滤器的order值一样时,会按照 defaultfilter > 路由过滤器 > globalfilter的顺序执行。
发表评论