GateWay三大核心概念
Route(路由)
路由是构建网关的基本模块,它有ID,目标URI,一系列的断言和过滤器组成,如果断言为true则匹配该路由.
Predicate(断言)
开发人员可以匹配HTTP请求中的所有内容(例如请求头或请求参数),如果请求与断言相匹配则进行路由
Filter(过滤)
指的是Spring框架中GatewayFilter的实例,使用过滤器,可以在请求被路由前或者之后对请求进行修改.
GateWay工作流程
核心逻辑: 路由转发+执行过滤器链
GateWay的入门配置
1.新建Module
2.在pom.xml中引入gateway依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-gateway</artifactId>
</dependency>
注意网关作为微服务也需要注册到服务中心,所以导入一来是也需要注册中心的相关项.;
同时gateway不需要引入web的相关依赖,否则启动会报错;
3.配置application.yml
server:
port: 9527
spring:
application:
name: cloud-gateway
eureka:
instance:
hostname: cloud-gateway-service
client:
service-url:
register-with-eureka: true
fetch-registry: true
defaultZone: http://eureka7001.com:7001/eureka
4.业务类??
网关就是看门的,没有业务类
5.写主启动类
6.给网关做路由映射
网关的理解:保护一些服务地址端口不暴露给外部,对外暴露网关端口;
外部想访问某个服务访问网关端口,由网关调用响应的服务;
网关好比看门的保安,对外阻止攻击等;
在application.yml中添加网关的配置:
spring:
application:
name: cloud-gateway
cloud:
gateway:
routes:
- id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http:localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/get/** #断言,路径相匹配的进行路由
- id: payemnt_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
uri: http://localhost:8001 #匹配后提供服务的路由地址
predicates:
- Path=/payment/lb/** #断言,路径相匹配的进行路由
通过以上配置,平时访问服务提供者需要访问:localhost:8001/payment/get/**
;
配置网关后可以访问localhost:9527/payment/get/**
也可以访问服务提供者
网关配置的两种方式
1.在配置文件yml中配置
在入门配置中用的就是yml配置方式,此种方式会随着网关的配置种类增加文件会很长
2.在代码中注入RouteLocator的Bean
通过微服务名实现动态路由
多数情况下客户端访问服务提供者时是通过ribbon实现负载均衡的,又ribbon通过某种机制调用服务提供者;现在我们通过网关实现负载均衡的功能(动态路由);
默认情况下GateWay会根据注册中心注册的服务列表.以注册中心上微服务名为路径创建动态路由进行转发,从而实现动态路由的功能
;
1.启动一个服务注册中心,两个微服务
2.在pom中添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
3.配置application.yml
Predicate(断言)的使用
Predicate就是为了实现一组匹配规则,让请求过来找对应的Route进行处理.
1.Route Predicate Factories是什么?
2.常用的Route Predicate
①After Route Predicate
获取时间格式:
public class T1 {
public static void main(String[] args) {
ZonedDateTime zonedDateTime = ZonedDateTime.now();
System.out.println(zonedDateTime);
}
}
②Before Route Predicate
③Between Route Predicate
以上三个是时间级别的
④Cookie Route Predicate
Cookie级别的
用curl
发送请求:
带cookie
curl http://localhost:9527/payment/discovery 不带cookie
⑤Header Route Predicate
⑥Host Route Predicate
⑦Method Route Predicate
⑧Path Route Predicate
⑨Query Route Predicate
3.全部的断言路由匹配规则样例
Filter的使用
路由过滤器可以用于修改进入HTTP请求和返回的HTTP响应,路由过滤器只能指定路由进行使用.
Spring Cloud Gateway 内置了多种路由过滤器,他们都由GatewayFilter的工厂类来产生.
他的生命周期只有两个:pro 和post(业务逻辑之前和之后)。有点像spring的前置通知和后置通知.
他的种类分为:GatewayFilter和GlobalFilter(单一的和全局的);
写一个自定义过滤器
自定义全局GlobalFilter
主要实现两个接口:
@Component
@Slf4j
public class MyLogGateWayFilter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
log.info("************come in MyLogGateWayFilter: "+new Date());
String uname = exchange.getRequest().getQueryParams().getFirst("uname");
if(uname==null){
log.info("*************用户名为null,非法用户");
exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
return exchange.getResponse().setComplete();
}
return chain.filter(exchange);//执行下一个过滤器链
}
@Override
public int getOrder() {
return 0; //设置优先级
}
}
此时,再次访问就必须带上uname参数才能正常访问了