SpringCloud搭建Gateway网关
网关的作用:
- 对用户请求做身份认证、权限校验
- 将用户请求路由到微服务,并实现负载均衡
- 对用户请求做限流
开始搭建:
1、创建新的Maven的Module,引入SpringCloudGateway的依赖和Nacos的服务发现依赖
编辑pom.xml
-
<!--网关依赖-->
-
<dependency>
-
<groupId>org.springframework.cloud</groupId>
-
<artifactId>spring-cloud-starter-gateway</artifactId>
-
</dependency>
-
-
<!--nacos服务发现依赖-->
-
<dependency>
-
<groupId>com.alibaba.cloud</groupId>
-
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
-
</dependency>
创建启动类:
-
package com.demo.gateway;
-
-
import org.springframework.boot.SpringApplication;
-
import org.springframework.boot.autoconfigure.SpringBootApplication;
-
-
-
-
public class GatewayApplication {
-
-
public static void main(String[] args) {
-
SpringApplication.run(GatewayApplication.class, args);
-
}
-
-
}
2、添加配置文件application.yml,编写路由配置及nacos地址
-
server:
-
port: 10010 # 网关端口
-
spring:
-
application:
-
name: gateway # 服务名称
-
cloud:
-
nacos:
-
server-addr: localhost:8848
-
gateway:
-
routes: # 网关路由配置
-
- id: user-service # 路由id,自定义,只要唯一即可
-
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
-
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
-
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
-
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
-
- id: order-service
-
uri: lb://orderservice
-
predicates:
-
- Path=/order/**
启动并且测试
3、添加自定义的全局过滤器
添加简单的过滤器AuthorizeFilter,判断请求参数中是否有authorization并且值为admin,如果同时满足则放行,否则拦截
-
package com.demo.gateway;
-
-
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
-
import org.springframework.cloud.gateway.filter.GlobalFilter;
-
import org.springframework.core.Ordered;
-
import org.springframework.core.annotation.Order;
-
import org.springframework.http.HttpStatus;
-
import org.springframework.http.server.reactive.ServerHttpRequest;
-
import org.springframework.stereotype.Component;
-
import org.springframework.util.MultiValueMap;
-
import org.springframework.web.server.ServerWebExchange;
-
import reactor.core.publisher.Mono;
-
-
-
//@Order(-1) // 过滤器的优先级,越小优先级越高
-
-
public class AuthorizeFilter implements GlobalFilter, Ordered {
-
-
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
-
// 1.获取请求参数
-
ServerHttpRequest request = exchange.getRequest();
-
MultiValueMap<String, String> params = request.getQueryParams();
-
// 2.获取参数中的 authorization 参数
-
String authorization = params.getFirst("authorization");
-
// 3.判断参数值是否等于 admin
-
if ("admin".equals(authorization)) {
-
// 4.是,放行
-
return chain.filter(exchange);
-
}
-
// 5.否,拦截
-
// 5.1.设置状态码
-
exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);
-
// 5.2.拦截请求
-
return exchange.getResponse().setComplete();
-
}
-
-
// 通过Ordered接口实现过滤器的优先级,与通过@Order(-1)实现一样
-
-
public int getOrder() {
-
return -1;
-
}
-
}
重启gateway服务并测试
过滤器的执行顺序:
4、网关的cors跨域配置
修改配置文件
-
server:
-
port: 10010 # 网关端口
-
spring:
-
application:
-
name: gateway # 服务名称
-
cloud:
-
nacos:
-
server-addr: localhost:8848
-
gateway:
-
routes: # 网关路由配置
-
- id: user-service # 路由id,自定义,只要唯一即可
-
# uri: http://127.0.0.1:8081 # 路由的目标地址 http就是固定地址
-
uri: lb://userservice # 路由的目标地址 lb就是负载均衡,后面跟服务名称
-
predicates: # 路由断言,也就是判断请求是否符合路由规则的条件
-
- Path=/user/** # 这个是按照路径匹配,只要以/user/开头就符合要求
-
- id: order-service
-
uri: lb://orderservice
-
predicates:
-
- Path=/order/**
-
globalcors: # 全局的跨域配置
-
add-to-simple-url-handler-mapping: true # 解决options请求被拦截问题
-
corsConfigurations:
-
'[/**]': # 拦截哪些请求,/**表示拦截一切请求
-
allowedOrigins: # 允许哪些网站的跨域请求
-
- "http://localhost:8090"
-
- "http://www.百度.com"
-
allowedMethods: # 允许的跨域ajax的请求方式
-
- "GET"
-
- "POST"
-
- "DELETE"
-
- "PUT"
-
- "OPTIONS"
-
allowedHeaders: "*"
-
allowCredentials: true # 是否允许携带cookie
-
maxAge: 360000 # 这次跨域检测的有限期
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfjbajj
系列文章
更多
同类精品
更多
-
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24 -
微信小程序没声音怎么办
PHP中文网 06-15 -
微信提示登录环境异常是什么意思原因
PHP中文网 04-09 -
excel图片置于文字下方的方法
PHP中文网 06-27 -
使用云服务器搭建个人游戏加速器教程
AuroraJay 07-06 -
抖音国际版要用什么加速器能流畅刷Tiktok的加速器
TK小达人 08-02 -
微信运动停用后别人还能看到步数吗
PHP中文网 07-22 -
键盘上的负数是哪个键
PHP中文网 03-17 -
Excel筛选和排序是灰色的怎么办
PHP中文网 06-22 -
微信人名旁边有个图标有什么用
PHP中文网 03-11