一、概念
功能:身份认证、权限校验、服务路由、负载均衡、请求限流。
实现:gateway、zuul
zuul:基于Servlet实现,属于阻塞式编程
gateway:基于Spring5中WebFlux,属于响应式编程。性能好
二、搭建
1、依赖(注册中心(nacos、eureka)、网关依赖(gateway、zuul))
<!--spring-cloud-starter-netflix-eureka-server -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- gateway -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
2、配置文件
server:
port: 8004
spring:
application:
name: gateway-server
#gateway配置
cloud:
gateway:
routes: #路由配置
- id: user-server #路由id,自定义,唯一
uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
predicates: #路由断言,判断请求是否符合路由规则条件
- Path=/user/** #只要以user开头就符合
- id: order-server #路由id,自定义,唯一
uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
predicates: #路由断言,判断请求是否符合路由规则条件
- Path=/order/** #只要以user开头就符合
eureka:
client:
service-url:
defaultZone: http://localhost:8001/eureka/
instance:
prefer-ip-address: true #使用ip地址进行注册
instance-id: gateway-server:8004 #实例ID
3、启动类添加注解@EnableDiscoveryClient,不是@EnableEurekaClient
三、路由断言工厂RoutePredicateFactory
此部分的目标是配置文件中的spring.cloud.gateway.routes.predicates,这个配置中的文字会被RoutePredicateFactory进行处理。
在Spring中有11中Predicate工厂,这些配置可以在官方网站查看
四、路由过滤器GatewayFilter
网关中提供的一种过滤器,可以对进入网关的请求和微服务返回的响应做处理。
在Spring中有31种不同的路由过滤器工厂,这些配置可以在官方网站查看。
使用实例
配置文件:
spring:
application:
name: gateway-server
#gateway配置
cloud:
gateway:
routes: #路由配置
- id: user-server #路由id,自定义,唯一
uri: lb://user-server #路由目标地址,lb是负载均衡,后面是服务名
predicates: #路由断言,判断请求是否符合路由规则条件
- Path=/user/** #只要以user开头就符合
filter: #路由过滤器配置
- AddRequestHeader=ttt, wdnmd
- id: order-server #路由id,自定义,唯一
uri: lb://order-server #路由目标地址,lb是负载均衡,后面是服务名
predicates: #路由断言,判断请求是否符合路由规则条件
- Path=/order/** #只要以user开头就符合
# default-filters: #配置所有路径
# - AddRequestHeader=ttt, wdnmd
接口:
@GetMapping("/getUsername")
public String getUserName(@RequestHeader(value = "ttt", required = false)String name){
System.out.println("name");
return "this is name";
}
五、全局过滤器
全局过滤器的作用是处理一切进入网关的请求和微服务响应。GlobalFilter的逻辑需要自己写代码实现,定义方式是实现GlobalFilter接口。
实例:
@Order(1)//拦截器执行顺序,数字越小越靠前执行,也可以实现Ordered接口
@Component
public class AuthorizeFilter implements GlobalFilter {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
//获取请求参数
ServerHttpRequest request = exchange.getRequest();
//获取请求头中的参数
HttpHeaders headers = request.getHeaders();
String token = headers.getFirst("token");
// MultiValueMap<String, String> queryParams = request.getQueryParams();
//获取参数中的指定参数
// String token = queryParams.getFirst("token");
//判断token是否失效
if("1".equals(token)){
//放行
return chain.filter(exchange);
}
//设置状态码
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
//拦截请求
return exchange.getResponse().setComplete();
}
}
六、跨域
1、跨域概念
域名不一致或者端口不一致
域名:www.taoobao.com和www.taoobao.org
端口:127.0.0.1:8080和127.0.0.1:8081
2、处理方式,配置文件
spring:
application:
name: gateway-server
#gateway配置
cloud:
gateway:
#跨域
globalcors: #全局的跨域处理
add-to-simple-url-handler-mapping: true #解决options请求被拦截问题
cors-configurations:
'[/**]':
allowedOrigins: #允许那些网站的跨域请求
- "https://www.baidu.com"
allowedMethods: #允许跨域的请求方式
- "GET"
- "POST"
allowedHeaders: "*" #允许在请求头中携带的头信息
allowedCredentials: true # 是否允许携带cookie
maxAge: 36000 #跨域监测有效期