zoukankan      html  css  js  c++  java
  • SpringCloud之Gateway原理解析(一)--准备

    一 准备阶段

      这部分比较琐碎,基本上我想到了什么就会写什么

      1 gateway的web实现是webFlux,所以Gateway的工程不能引入SpringMvc

      2 GatewayLoadBalancerClientAutoConfiguration这个是gateway负载均衡的过滤器实现的加载,他将LoadBalancerClientFilter 注入到了容器中 

    @Configuration
    
    @ConditionalOnClass({LoadBalancerClient.class, RibbonAutoConfiguration.class, DispatcherHandler.class})
    
    @AutoConfigureAfter(RibbonAutoConfiguration.class)
    
    public class GatewayLoadBalancerClientAutoConfiguration {
    
     // GlobalFilter beans
    
     @Bean
    
     @ConditionalOnBean(LoadBalancerClient.class)
    
     public LoadBalancerClientFilter loadBalancerClientFilter(LoadBalancerClient client) {
    
      return new LoadBalancerClientFilter(client);
    
     }
    
    }
    public class LoadBalancerClientFilter implements GlobalFilter, Ordered {
    
        /**
         * Filter order for {@link LoadBalancerClientFilter}.
         */
        public static final int LOAD_BALANCER_CLIENT_FILTER_ORDER = 10100;
    
        private static final Log log = LogFactory.getLog(LoadBalancerClientFilter.class);
    
        protected final LoadBalancerClient loadBalancer;
    
        private LoadBalancerProperties properties;
    LoadBalancerClient的实现类就是RibbonLoadBalancerClient,做负载均衡都离不开ribbon3 
    3 最重要的 GatewayAutoConfiguration
      这个类实在是太大了,内容也很多,比如各种断言过滤拦截的工厂类都在这里,我这里只列出部分源码看一下
    PropertiesRouteDefinitionLocator,它是负责把配置文件里的路由规则
      转成对象的类。
    public class GatewayAutoConfiguration {
    
        @Bean
        public StringToZonedDateTimeConverter stringToZonedDateTimeConverter() {
            return new StringToZonedDateTimeConverter();
        }
    
        @Bean
        public RouteLocatorBuilder routeLocatorBuilder(
                ConfigurableApplicationContext context) {
            return new RouteLocatorBuilder(context);
        }
    
        @Bean
        @ConditionalOnMissingBean
        public PropertiesRouteDefinitionLocator propertiesRouteDefinitionLocator(
                GatewayProperties properties) {
            return new PropertiesRouteDefinitionLocator(properties);
        }
    
    
    首先对比下我们的配置文件
    spring:
      application:
        name: sc-gateway-server
      cloud:
        gateway:
          discovery:
            locator:
              enabled: false
              lowerCaseServiceId: true
          routes:
          - id: service-hi
            uri: lb://SERVICE-HI
            predicates:
              - Path=/demo/**, /api-gateway/**, /hi/**
            filters:
    #          - StripPrefix=1
    #          - RequestTime=true
              #- RewritePath=/api-gateway/(?<segment>/?.*), /${segment}
    #http://localhost:8081/api-gateway/demo/hi?name=mxz123 按照这个url请求就可以,之前我一直不成功,因为cloud Finchley版本有bug
    #          - RewritePath=/api-gateway/demo, /demo
    #          - StripPrefix=1
              - name: RequestRateLimiter
                args:
                  redis-rate-limiter.replenishRate: 1
                  redis-rate-limiter.burstCapacity: 2
                  key-resolver: "#{@pathKeyResolver}"
    RouteDefinitionRouteLocator

    能够看出gateway中的路由信息正是我们的配置文件里配的

  • 相关阅读:
    Mysql 创建外键 1005 err 150
    骑车目标
    windows 如何查看端口占用进程ID 进程名称 强制结束进程
    Eclipse去除JavaScript验证错误
    MyEclipse 代码里的中文字太小设置方法
    security自动登陆
    Tomcat 7 可以修改 Session 默认的 Cookie 名 JSESSIONID 了
    windows2008 安装oracle10g“程序异常终止。发生内部错误。请将以下文件提供给oracle技术支持部门
    ORA-01652: 无法通过 128 (在表空间 TEMP 中) 扩展 temp 段(EXP-00056: 遇到 ORACLE 错误 1652 ORA-01652: unable to extend temp segment by 128 in tablespace TEMP)
    oracle数据库启动时出现ORA-01157和ORA-01110问题
  • 原文地址:https://www.cnblogs.com/juniorMa/p/14429204.html
Copyright © 2011-2022 走看看