SpringCloud GateWay新一代网关

tech2024-09-30  20

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参数才能正常访问了

最新回复(0)