Spring cloud gateway的三个外围概念

route 路由

能够了解为一条转发规定,蕴含:

  • id
  • 指标url
  • 断言(predicate)
  • 过滤器(filter)
    若断言为true,则申请将经由 filter 被路由到指标 url。

predicate 断言

能够了解为一个条件判断,对以后的http申请进行指定规定的匹配,当匹配上规定时,断言才为true,此时申请会被路由到指标地址,服务或者过滤器

filter 过滤器

对申请进行解决的逻辑局部。当申请的断言为true 时,会被路由到设置好的过滤器, 以对申请进行解决。例如,能够为申请增加一个申请头,或增加一个申请参数,或对申请URI 进行批改等。

Nacos作为路由规定的配置核心

nacos的配置和运行如下

  • MySQL配置运行
  • 运行MySQL

    docker run -p 3306:3306 --name mysql \-v /Users/wangbin/dockerall/mysql/log:/var/log/mysql \-v /Users/wangbin/dockerall/mysql/data:/var/lib/mysql \-v /Users/wangbin/dockerall/mysql/conf:/etc/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7docker exec -it mysql bashmysql -prootcreate database nacos_config;use nacos_config;
  • 执行SQL
    SQL内容
  • 新建/xxxxx/nacos_docker/init.d/目录并生成custom.properties文件。文件内容如下

    management.endpoints.web.exposure.include=*server.contextPath=/nacosserver.servlet.contextPath=/nacosserver.port=8848spring.datasource.platform=mysqldb.num=1db.url.0=jdbc:mysql://127.0.0.1:3306/nacos_config?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=truedb.user=rootdb.password=rootnacos.cmdb.dumpTaskInterval=3600nacos.cmdb.eventTaskInterval=10nacos.cmdb.labelTaskInterval=300nacos.cmdb.loadDataAtStart=falsemanagement.metrics.export.elastic.enabled=falsemanagement.metrics.export.influx.enabled=falseserver.tomcat.accesslog.enabled=trueserver.tomcat.accesslog.pattern=%h %l %u %t "%r" %s %b %D %{User-Agent}inacos.security.ignore.urls=/,/**/*.css,/**/*.js,/**/*.html,/**/*.map,/**/*.svg,/**/*.png,/**/*.ico,/console-fe/public/**,/v1/auth/login,/v1/console/health/**,/v1/cs/**,/v1/ns/**,/v1/cmdb/**,/actuator/**,/v1/console/server/**nacos.naming.distro.taskDispatchThreadCount=1nacos.naming.distro.taskDispatchPeriod=200nacos.naming.distro.batchSyncKeyCount=1000nacos.naming.distro.initDataRatio=0.9nacos.naming.distro.syncRetryDelay=5000nacos.naming.data.warmup=truenacos.naming.expireInstance=true
  • 新建logs目录
  • 运行Nacos

    docker run--name nacos -d-p 8848:8848--privileged=true--restart=always-e JVM_XMS=256m-e JVM_XMX=256m-e MODE=standalone-e PREFER_HOST_MODE=hostname-v /xxxxx/nacos_docker/init.d/custom.properties:/home/nacos/init.d/custom.properties-v /xxxxx/nacos_docker/logs:/home/nacos/logsnacos/nacos-server
  • 拜访 http://localhost:8848
  • 输出 nacos/nacos登陆

新建配置内容

内容如下

[{    "id":"user-router",    "predicates":[      {        "args":{          "pattern": "/usr/**"        },        "name": "Path"      }    ],    "filters": [      {        "name": "StripPrefix",        "args": {          "parts": "1"        }      }    ],    "uri": "lb://user-service"}]

对应的yml内容如route局部

spring:  application:    name: dynamicgateway  cloud:    nacos:      discovery:        server-addr: localhost:8848 #配置Nacos地址      config:        server-addr: localhost:8848    gateway:      discovery:        locator:          enabled: true      routes:        - id: user-router          uri: lb://user-service          predicates:            - Path=/usr/**      filters:        - StripPrefix=1 # 示意在转发时去掉usr

新建我的项目
因为应用了Spring cloud,Spring Cloud Alibaba,Nacos之间的版本依赖关系如下
版本依赖关系

新建DynamicGatewayRouteConfig

@Componentpublic class DynamicGatewayRouteConfig implements ApplicationEventPublisherAware {    private String dataId = "gateway-router";    private String group = "DEFAULT_GROUP";    @Value("${spring.cloud.nacos.config.server-addr}")    private String serverAddr;    @Autowired    private RouteDefinitionWriter routeDefinitionWriter;    private ApplicationEventPublisher applicationEventPublisher;    private static final List<String> ROUTE_LIST = new ArrayList<String>();    @PostConstruct    public void dynamicRouteByNacosListener() {        try {            ConfigService configService = NacosFactory.createConfigService(serverAddr);            configService.getConfig(dataId, group, 5000);            configService.addListener(dataId, group, new Listener() {                public void receiveConfigInfo(String configInfo) {                    clearRoute();                    try {                        List<RouteDefinition> gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class);                        for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {                            addRoute(routeDefinition);                        }                        publish();                    } catch (Exception e) {                        e.printStackTrace();                    }                }                public Executor getExecutor() {                    return null;                }            });        } catch (NacosException e) {            e.printStackTrace();        }    }    private void clearRoute() {        for (String id : ROUTE_LIST) {            this.routeDefinitionWriter.delete(Mono.just(id)).subscribe();        }        ROUTE_LIST.clear();    }    private void addRoute(RouteDefinition definition) {        try {            routeDefinitionWriter.save(Mono.just(definition)).subscribe();            ROUTE_LIST.add(definition.getId());        } catch (Exception e) {            e.printStackTrace();        }    }    private void publish() {        this.applicationEventPublisher.publishEvent(new RefreshRoutesEvent(this.routeDefinitionWriter));    }    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {        this.applicationEventPublisher = applicationEventPublisher;    }}

在nacos的route内容发生变化时会主动调用更新

bootstrap.yml内容如下

spring:  application:    name: dynamicgateway  cloud:    nacos:      discovery:        server-addr: localhost:8848 #配置Nacos地址 config:        server-addr: localhost:8848    gateway:      discovery:        locator:          enabled: truemanagement:  endpoints:    web:      exposure:        include: '*' endpoint:    health:      show-details: always

具体代码
代码