最近在学习微服务相关组件,今天和大家分享下Gateway的基础配置也作为自己的一个学习记录。
Gateway搭建其实很简单,至于它背后用了多牛逼的技术比zuul好了多少暂不讨论网上这类理论性的文章也是一把一把的,有兴趣可以自己找,今天只分析动手的过程。
一、工程搭建
本工程是基于springboot搭建,在一个父工程下包含两个子gateway和consume模块(module),gateway负责映射consumer html接口,以下为了使文章更简洁易懂仅给出Gateway搭建的重点步骤其余常规部分不做赘述
第一步 引入依赖
<!--gateway 网关依赖,内置webflux 依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency>
第二步 配置路由
新建application.yml,配置文件中路由分成两种,第一种匹配后是通过服务名作为映射地址转发,第二种匹配后是直接通过url映射转发
spring:
application:
name: gateway
cloud:
gateway:
discovery:
locator:
enabled: true # 开启动态路由(以服务名为uri)
routes:
- id: nacos-consumer # 路由ID,建议与服务名一致
uri: lb://nacos-consumer # 匹配后提供路由地址
predicates:
- Path=/consumer/** # 断言,路径匹配后进入路由
- id: 163 # 路由ID,建议与服务名一致
uri: https://www.163.com/ # 匹配后提供路由地址
predicates:
- Path=/163/** # 断言,路径匹配后进入路由
server:
port: 9000
二、实现全局过滤器
新建 GlobalLogFileter 全局过滤器类,过滤器实现在请求到达后端前对请求进行拦截,同时在后端返回响应时对响应也进行拦截
package microapps.cn.gateway.filter;
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
@Component
public class GlobalLogFileter implements GlobalFilter, Ordered {
@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
System.out.println("******************* 请求到达后端前 *********************");
return chain.filter(exchange).then(Mono.fromRunnable(()->{
System.out.println("******************* 请求从后端返回后 *********************");}
));
}
@Override
public int getOrder() {
return 0; // 过滤器优先级,数值越小优先级越高
}
}