<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
gateway:
routes: #数组形式 所以可以配置多个
- id: order-service #路由唯⼀标识 一般是要转发的服务名
uri: http://127.0.0.1:8087 #想要转发到的地址 ip和对应id(服务)的端口号一致
order: 1 #优先级,数字越⼩优先级越⾼
predicates: #断⾔ 配置哪个路径才转发
- Path=/order-server/**
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第⼀层前缀 这里是去掉order-server 不然无法访问
#访问路径 http://localhost:8888/order-server/api/v1/video_order/list
#转发路径 http://localhost:8087/api/v1/video_order/list(中间的order-server已经被过滤器过滤了)
优点:可以进行负载均衡且地址不需要写死直接指向nacos的服务名即可
添加依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
启动类添加注解
@EnableDiscoveryClient
配置yml
server:
port: 8888
spring:
application:
name: api-gateway
cloud:
nacos:
discovery:
server-addr: xx.xx.xx.xx:8848 nacos运行的服务器的ip
gateway:
routes: #数组形式
- id: order-service #路由唯一标识 一般是要转发的项目名
#uri: http://127.0.0.1:8087 #想要转发到的地址 ip和对应id(服务)的端口号一致
uri: lb://xdclass-order-service #从nacos进行转发 lb的意思是负载均衡
order: 1 #优先级,数字越小优先级越高
predicates: #断言 配置哪个路径才转发
- Path=/order-server/**
filters: #过滤器,请求在传递过程中通过过滤器修改
- StripPrefix=1 #去掉第⼀层前缀
#访问路径 http://localhost:8888/order-server/api/v1/video_order/list
#转发路径 http://localhost:8087/order-server/api/v1/video_order/list
#需要过滤器去掉前面第一层
discovery:
locator:
enabled: true #开启网关拉取nacos的服务
# 访问路径 c
这时候在需要调用的同一个服务 开启两个不同的端口号(8081.8082)
访问 http://localhost:8888/order-server/api/v1/video_order/list
这时候会轮询访问8081和8082端口
predicates:
- Host=
- Path=/order-server/** 只有这个路径才转发
- before=2022-8-16T01:01:01.000+08:00 +08是东八区 这里是8.16号之前才能访问 超时之后无法访问
- Method=
- Header=
- Query=source 意思是网址后必须加?source=xxx 不然也无法访问
- Cookie=
@Component
public class UserGlobalFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//写业务逻辑
String token = exchange.getRequest().getHeaders().getFirst("token");
//TODO 根据业务开发对应的鉴权规则
if(StringUtils.isBlank("token")){
//设置状态码未授权
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//已经完成
return exchange.getResponse().setComplete();
}
// 如果成功继续往下执行
return chain.filter(exchange);
}
//过滤器的优先级 数字越小 优先级越高
@Override
public int getOrder() {
return 0;
}
}
这时候请求 如果不在Header里面传token那么就无法访问,