Spring Cloud Gateway的使用

左手的ㄟ右手 2022-10-29 07:40 270阅读 0赞

官网:https://cloud.spring.io/spring-cloud-static/spring-cloud-gateway/2.1.0.RELEASE/single/spring-cloud-gateway.html#_discoveryclient_route_definition_locator
创建一个新module,引入gateway依赖:
在这里插入图片描述
然后需要引入nacos的discovery和config两个依赖(版本和其他模块对应即可,一般直接引入common模块即可):

  1. <!-- 服务注册/发现-->
  2. <dependency>
  3. <groupId>com.alibaba.cloud</groupId>
  4. <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
  5. </dependency>
  6. <!-- 配置中心来做配置管理-->
  7. <dependency>
  8. <groupId>com.alibaba.cloud</groupId>
  9. <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
  10. </dependency>

然后配置下注册中心地址和配置中心地址:
application.properties:

  1. # 应用名称
  2. spring.application.name=gulimall-gateway
  3. spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

创建个bootstrap.properties:

  1. spring.application.name=gulimall-gateway
  2. spring.cloud.nacos.config.server-addr=127.0.0.1:8848

然后启动项目:
在这里插入图片描述
因为我是引入的common模块,那个模块引入了mybatisplus相关依赖,需要配置数据库信息,解决方法直接在启动类上:
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)

再次启动即可成功。

使用示例(创建个application.yml):

  1. spring:
  2. cloud:
  3. gateway:
  4. routes:
  5. - id: to_baidu
  6. uri: https://www.baidu.com
  7. predicates:
  8. - Query=to,baidu #如果携带参数to=baidu则匹配成功,跳转至uri
  9. - id: to_qq
  10. uri: https://www.qq.com
  11. predicates:
  12. - Query=to,qq

访问即可看到效果:

  1. http://localhost:88/?to=baidu
  2. http://localhost:88/?to=qq

也可以用编码方式:

  1. package com.atguigu.springcloude.config;
  2. import org.springframework.cloud.gateway.route.RouteLocator;
  3. import org.springframework.cloud.gateway.route.builder.RouteLocatorBuilder;
  4. import org.springframework.context.annotation.Bean;
  5. import org.springframework.context.annotation.Configuration;
  6. /** * @author baikunlong * @date 2020/12/9 9:37 * 配置路由的第二种方式:采用编码 */
  7. @Configuration
  8. public class GatewayConfig {
  9. @Bean
  10. public RouteLocator myRouteLocator(RouteLocatorBuilder builder){
  11. RouteLocatorBuilder.Builder routes = builder.routes();
  12. // 如果路径包含/guonei则跳转至uri
  13. routes.route("baidu",r->r.path("/guonei").uri("http://news.baidu.com/guonei"));
  14. return routes.build();
  15. }
  16. @Bean
  17. public RouteLocator myRouteLocator2(RouteLocatorBuilder builder){
  18. RouteLocatorBuilder.Builder routes = builder.routes();
  19. routes.route("baidu2",r->r.path("/guoji").uri("http://news.baidu.com/guoji"));
  20. return routes.build();
  21. }
  22. }

可以自定义过滤器:

  1. package com.atguigu.springcloude.filter;
  2. import lombok.extern.slf4j.Slf4j;
  3. import org.springframework.cloud.gateway.filter.GatewayFilterChain;
  4. import org.springframework.cloud.gateway.filter.GlobalFilter;
  5. import org.springframework.core.Ordered;
  6. import org.springframework.http.HttpStatus;
  7. import org.springframework.stereotype.Component;
  8. import org.springframework.web.server.ServerWebExchange;
  9. import reactor.core.publisher.Mono;
  10. import java.time.LocalDateTime;
  11. /** * @author baikunlong * @date 2020/12/9 11:07 */
  12. @Component
  13. @Slf4j
  14. public class MyLogGatewayFilter implements GlobalFilter, Ordered {
  15. @Override
  16. public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
  17. log.info("进入我的过滤器:"+ LocalDateTime.now());
  18. if(exchange.getRequest().getQueryParams().getFirst("uname")==null){
  19. log.info("用户名为空,禁止访问");
  20. exchange.getResponse().setStatusCode(HttpStatus.NOT_ACCEPTABLE);
  21. return exchange.getResponse().setComplete();
  22. }
  23. return chain.filter(exchange);
  24. }
  25. @Override
  26. public int getOrder() {
  27. //过滤器的顺序,越小等级越高
  28. return 0;
  29. }
  30. }

其他示例:

  1. spring:
  2. application:
  3. name: cloud-gateway
  4. cloud:
  5. gateway:
  6. discovery:
  7. locator:
  8. enabled: true #开启从注册中心动态创建路由的功能,利用微服务名进行路由
  9. # 配置路由的第一种方式:采用yml配置(这种简单)
  10. routes:
  11. - id: payment_routh #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  12. # uri: http://localhost:8001 #匹配后提供服务的路由地址
  13. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  14. predicates:
  15. - Path=/payment/get/** # 断言,路径相匹配的进行路由
  16. - id: payment_routh2 #payment_route #路由的ID,没有固定规则但要求唯一,建议配合服务名
  17. # uri: http://localhost:8001 #匹配后提供服务的路由地址
  18. uri: lb://cloud-payment-service #匹配后提供服务的路由地址
  19. # 断言的所有规则些在该项目启动时会打印
  20. predicates:
  21. - Path=/payment/lb/** # 断言,路径相匹配的进行路由
  22. # - After=2020-12-09T10:51:37.485+08:00[Asia/Shanghai] #在多久之后才能访问系统
  23. # Between就可以做秒杀活动,只有该时间段内才能访问系统,否则都是404
  24. # - Between=2020-12-09T10:51:37.485+08:00[Asia/Shanghai],2020-12-09T11:51:37.485+08:00[Asia/Shanghai]
  25. # - Cookie=username,zzyy #必须携带username=zzyy的cookie,像这样:curl http://localhost:9527/payment/lb --cookie "username=zzyy"
  26. # - Header=X-Request-Id, \d+ # 请求头要有X-Request-Id属性并且值为整数的正则表达式,像这样curl http://localhost:9527/payment/lb -H "X-Request-Id:111"
  27. # 还有一些有用到再看

发表评论

表情:
评论列表 (有 0 条评论,270人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Spring Cloud -- GateWay

    1. 为什么需要网关 > 在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务

    相关 Spring cloud gateway

    网关核心功能是路由转发,因此不要有耗时操作在网关上处理,让请求快速转发到后端服务上。 早期的cloud中使用的是基于Zuul的网关,但是由于Zuul1.x是阻塞的,后面clo