分布式微服务 SpringCloud Alibaba 中 Gateway 网关 组件搭建

子项目结构图

在这里插入图片描述

导入Gateway所需要的jar包

		<dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>

注意:网关服务器是不需要”spring-boot-starter-web“包的

编写Application.yaml配置文件

#端口
server:
  port: 7783

#服务名
spring:
  application:
    name: gateway-server

#    注册到Nacos
  cloud:
    nacos:
      discovery:
        server-addr: localhost:8848
        
#        网关配置
    gateway:
      discovery:
        locator:
          enabled: false
          
#        路由配置
      routes:
        - id: consumer
#          服务提供者的地址
          uri: lb://user-consumer
          predicates:
#          Path:只要访问包含/api/nacos/,会转换到 user-consumer 服务中
#          Between:在 bagin 到 end 时间内访问才可通过
#          SumTest自定义断言
            - Path=/api/nacos/**
            - Between=2022-02-28T19:00:00.786182+08:00[Asia/Shanghai],2022-02-28T21:00:00.786182+08:00[Asia/Shanghai]
            - SumTest=3,1
          filters:
#          StripPrefix:过滤第一个节点文件“api”
            - StripPrefix=1
            
        - id: consumer2
          uri: lb://user-consumer2
          predicates:
            - Path=/api/nacos2/**
            - Between=2022-02-28T19:00:00.786182+08:00[Asia/Shanghai],2022-02-28T21:00:00.786182+08:00[Asia/Shanghai]
            - SumTest=3,1
          filters:
            - StripPrefix=1
        ....
  1. 网关参数解析
    gateway.discovery.locator.enabled = true: 可以通过服务名访问 http://127.0.0.1:7783/user-consumer/nacos/getUser/1建议不开启,避免服务名泄露

  2. 路由参数解析
    routes.id: 见名起意(随意)
    routes.uri: 服务器地址 (http://localhost:24101/,lb://user-consumer) 使用服务名就需要配置负载均衡 lb

断言

  1. routes.predicates: 断言参数解析
    (断言就是条件判断)看你满足哪一个条件给你路由到相对应的微服务
  • 内置断言
    在这里插入图片描述

路由

命名规则:BetweenRoutePredicateFactory
Between:断言名字
RoutePredicateFactory:固定写法

  • 自定义断言
    需要继承AbstractRoutePredicateFactory
    编写自定义类:
@Component
public class SumTestRoutePredicateFactory extends AbstractRoutePredicateFactory<SumTestRoutePredicateFactory.Config> {

    public static final String MAX_KEYS = "max";
    public static final String MIN_KEYS = "min";

    public SumTestRoutePredicateFactory() {
        super(Config.class);
    }

    @Override
    public List<String> shortcutFieldOrder() {
        return Arrays.asList(MAX_KEYS, MIN_KEYS);
    }

    @Override
    public Predicate<ServerWebExchange> apply(Config config) {
        return new GatewayPredicate() {
            @Override
            public boolean test(ServerWebExchange serverWebExchange) {
                String sum = serverWebExchange.getRequest().getQueryParams().getFirst("sum");
                System.out.println(config.max);
                System.out.println(config.min);
                System.out.println(Integer.parseInt(sum));
                if(config.max >= Integer.parseInt(sum) && config.min <= Integer.parseInt(sum)){
                    return true;
                }
                return false;
            }

            @Override
            public String toString() {
                return String.format("Between: %s and %s", config.max,config.min);
            }
        };
    }

    @Validated
    public static class Config {

        @NotNull
        private Integer max;
        private Integer min;

        public Integer getMax() {
            return max;
        }

        public void setMax(Integer max) {
            this.max = max;
        }

        public Integer getMin() {
            return min;
        }

        public void setMin(Integer min) {
            this.min = min;
        }
    }
}

过滤器

  1. routes.filters: 过滤器参数解析
    (过滤器就是过滤某些值)在给你路由到相对应的微服务之前对某些值进行操作,我这里使用了StripPrefix,过滤第一个路径文件”api“,真正调用的地址是不包含api的

在这里插入图片描述命名规则:StripPrefixGatewayFilterFactory****StripPrefix:过滤器名字GatewayFilterFactory:固定写法

编写Application.yaml配置文件

@SpringBootApplication
public class GatewayApplication7783 {
    public static void main(String[] args) {
        SpringApplication.run(GatewayApplication7783.class,args);
    }
}

运行网关成功注册
在这里插入图片描述
访问网关路径:http:127.0.0.1:网关端口/api/user/getUser/1?sum=1
sum=1满足我自定义断言的条件添加的
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值