GateWay总结

it2025-10-06  2

一、介绍

GateWay三大核心概念:

断言、路由、过滤

举个例子:我要进学校,门口保安需要判断我是否是这里的学生,这个过程就是断言,如果我是,则可以进去,相当于进入了路由,但是进入学校之后我没有穿校服,老师不让进教室,这就是过滤。他们三者是逐步判断的过程。

当使用GateWay时,相当于对一个微服务进行了保护,把它包裹起来。先做一下对比,在不使用GateWay的时候,启动8001服务,可以查询出信息。

当使用GateWay的时候,将端口号改为GateWay的端口号 (9527),则也可以查询出8001中的信息。

 

二、实战

接下来是GateWay的使用,首先建一个module,然后修改pom,pom如下 :

<dependencies> <!--引入gateway--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-gateway</artifactId> </dependency> <!--eureka-client--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId> </dependency> <!--一般基础配置类--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>

接下来新建yml,文件内容如下:

server: port: 9527 spring: application: name: cloud-gateway cloud: gateway: discovery: locator: enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由 routes: - id: payment_routh #路由的ID,没有固定规则但要求唯一,建议配合服务名 # uri: http://localhost:8001 #匹配后提供服务的路由地址,使用eureka上的地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由 - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 # uri: http://localhost:8001 #匹配后提供服务的路由地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址 predicates: - Path=/payment/lb/** # 断言,路径相匹配的进行路由 #- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问 # - Cookie=username,zzyy #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式 eureka: instance: hostname: cloud-gateway-service client: #服务提供者provider注册进eureka服务列表内 service-url: register-with-eureka: true fetch-registry: true defaultZone: http://eureka7001.com:7001/eureka

1、路由

yml文件中路由的代码如下:

routes: - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名 # uri: http://localhost:8001 #匹配后提供服务的路由地址,使用eureka上的地址 uri: lb://cloud-payment-service #匹配后提供服务的路由地址

上面的id是对路由的唯一标识即可,uri是要保护的地址。

2、断言

yml文件中断言的代码如下:

predicates: - Path=/payment/get/** # 断言,路径相匹配的进行路由

判断匹配的路径是否正确,**代表参数。

如下的断言意思是在此时间之后才可以访问页面

- After=2020-02-21T15:51:37.485+08:00[Asia/Shanghai] #可以设置访问页面的时间,after表示在什么时间之后进行访问

下面的两个断言可以通过cmd中curl指令进行查看是否有效

- Cookie=username,zzyy #- Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式

如下是没有加上cookie断言的

当加上cookie断言时候会进行报错,无法进行访问

当在后面输入cookie之后可以正常访问:

Header断言要求Id为整数,使用如下:

断言也可以通过手写配置来操作,代码和注释如下:

@Configuration public class GateWayConfig { @Bean public RouteLocator customRouteLocator(RouteLocatorBuilder builder) { RouteLocatorBuilder.Builder routes = builder.routes(); /** * id是唯一的标识 * patterns:是通过 访问9527+后置guonei就可以访问下面的地址了。 * .uri是进行断言,如果匹配则进入这个网站 */ routes.route("path_route_atguigu", r -> r.path("/guonei") .uri("http://news.baidu.com/guonei")).build(); return routes.build(); } }

访问方式如下:

3、过滤器

@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,非法用户,o(╥﹏╥)o"); exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE); return exchange.getResponse().setComplete(); } return chain.filter(exchange); } @Override public int getOrder() { return 0; }

如果在地址上没有输入uname则无法访问,加上uname即可访问,无论uname后面的值是什么都可以

最新回复(0)