Gateway网关
一、搭建网关服务
1.创建新的moudle,引入SpringCloudGateway的依赖和nacos的服务发现依赖
1 <!--nacos服务发现依赖--> 2 <dependency> 3 <groupId>com.alibaba.cloud</groupId> 4 <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 5 </dependency> 6 <!--网关依赖--> 7 <dependency> 8 <groupId>org.springframework.cloud</groupId> 9 <artifactId>spring-cloud-starter-gateway</artifactId> 10 </dependency>
2.编写路由配置及nacos地址
1 server: 2 port: 10010 # 网关端口 3 spring: 4 application: 5 name: gateway # 服务名称 6 cloud: 7 nacos: 8 server-addr: localhost:8848 # nacos地址 9 gateway: 10 routes: #网关路由配置 11 - id: user-service # 路由标识,自定义,唯一即可 12 uri: lb://userservice # 路由的目标地址,lb就是负载均衡,后面跟服务名称 13 predicates: # 路由断言,判断请求是否符合规律的条件 14 - Path=/user/** # 按照路径匹配,只要以/user/开头就符合要求 15 - id: order-service 16 uri: lb://orderservice 17 predicates: 18 - Path=/order/**
二、过滤器工厂
1.过滤器
给所有进入userservice的请求添加一个请求头
spring:
application:
name: gateway # 服务名称
cloud:
nacos:
server-addr: localhost:8848 # nacos地址
gateway:
routes: #网关路由配置
- id: user-service # 路由标识,自定义,唯一即可
uri: lb://userservice # 路由的目标地址,lb就是负载均衡,后面跟服务名称
predicates: # 路由断言,判断请求是否符合规律的条件
- Path=/user/** # 按照路径匹配,只要以/user/开头就符合要求
filters:
- AddRequestHeader=Truth,Itcast is freaking awesome! # 添加请求头
- id: order-service
uri: lb://orderservice
predicates:
- Path=/order/**
2.默认过滤器
如果要对所偶的路由都生效,则可以将过滤器工厂写到default下
1 spring: 2 application: 3 name: gateway # 服务名称 4 cloud: 5 nacos: 6 server-addr: localhost:8848 # nacos地址 7 gateway: 8 routes: #网关路由配置 9 - id: user-service # 路由标识,自定义,唯一即可 10 uri: lb://userservice # 路由的目标地址,lb就是负载均衡,后面跟服务名称 11 predicates: # 路由断言,判断请求是否符合规律的条件 12 - Path=/user/** # 按照路径匹配,只要以/user/开头就符合要求 13 - id: order-service 14 uri: lb://orderservice 15 predicates: 16 - Path=/order/** 17 default-filters: 18 - AddRequestHeader=Truth,Itcast is freaking awesome! # 添加请求头
三、全局过滤器 GlobalFilter
全局过滤器的作用也是处理一切进入网关的请求和微服务响应,与GatewayFilter的作用一样
区别:GatewayFilter通过配置定义,处理逻辑是固定的,而GlobalFilter的逻辑需要在自己写代码实现,定义方式是实现GlobalFilter接口
步骤:自定义类,实现GlobalFilter接口,添加@Order注解或实现Ordered接口
1 @Component 2 //@Order(-1) 3 public class AuthorizeFilter implements GlobalFilter , Ordered { 4 @Override 5 public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) { 6 //1.获取请求参数 7 ServerHttpRequest request = exchange.getRequest(); 8 MultiValueMap<String, String> params = request.getQueryParams(); 9 // 2.获取请求中的authorization参数 10 String auto = params.getFirst("authorization"); 11 // 3.判断参数是否等于admin: 12 // 是,放行 13 if("admin".equals(auto)) { 14 return chain.filter(exchange); 15 } 16 // 否,拦截 17 //设置状态码 18 exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED); 19 return exchange.getResponse().setComplete(); 20 } 21 22 @Override 23 public int getOrder() { 24 return -1; 25 } 26 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本