1、创建新的module
2、填入pom
<dependencies>
<!--gateway 此模块已包含 starte-web-->
<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>
<version>2.2.0.RELEASE</version>
</dependency>
</dependencies>
3、新建主启动类
4、新建application.yml、配置基础的信息
server:
port: 7000
spring:
application:
name: api-gateway
cloud:
gateway:
discovery:
locator:
enabled: true #让gateway从nacos中获取服务信息
routes: #路由数组
- id: order_route #订单路由
# uri: http://localhost:7001 #转发的地址
uri: lb://service-order-provider-7001 #lb 指的是负载均衡 后面是nacos的服务名
order: 1 #路由优先级 数字越小越大
predicates: #断言数组(条件判断,返回值boolean ,转发请求满足条件的)
- Path=/api-order/**
filters: #过滤器 数组 (在请求传递过程中,对请求做修改)
- StripPrefix=1 #在请求转发之前去掉 gateway的一层路径
nacos:
discovery:
server-addr: localhost:8848 #将gateway 注册到nacos
5、运行微服务与nacos、即可实现调用
6、新建一个基础的 自定义全局过滤器
package com.zhuanghw.filters;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
/**
* @author zhuanghw
* @date 2020/4/15 15:06
* <p>
* 全局鉴权 过滤器
*/
@Slf4j
@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {
//过滤器逻辑
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//统一鉴权逻辑
String token = exchange.getRequest().getQueryParams().getFirst("token");
if (!StringUtils.equals("admin", token)) {
log.error("认证失败");
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401
return exchange.getResponse().setComplete();
}
//放行
return chain.filter(exchange);
}
//优先级 数值越小越高
@Override
public int getOrder() {
return 0;
}
}
此时调用api gateway时 必须携带token 才能成功访问