nacos gateway动态路由实战

目录
  • nacos gateway动态路由
    • 一、引入本次测试需要的pom依赖
    • 二、配置文件设置(*配置文件不生效的把名字改为bootstrap.yml)
    • 三、动态路由实现
    • 四、nacos配置中心设置
    • 五、测试
  • gateway网关相关配置
    • 在启动类中添加注解@EeableDiscoveryClient
    • 配置nacos注册中心地址
    • bootstrap.properties 填写配置中心地址
    • nacos里创建命名空间gateway
    • 在主类中屏蔽数据源
    • 在项目里创建application.yml

nacos gateway动态路由

说明:本次测试使用的gateway是2.2.2.RELEASE版本,其他版本可能存在不同

一、引入本次测试需要的pom依赖

       <!--gateway网关依赖-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-gateway</artifactId>
        </dependency>
        <!--nacos依赖-->
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
        </dependency>
        <dependency>
            <groupId>com.alibaba.cloud</groupId>
            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
        </dependency>
        <!--json工具包-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.47</version>
        </dependency>

二、配置文件设置(*配置文件不生效的把名字改为bootstrap.yml)

server:
  port: 8200

spring:
  application:
    name: lc-gateway

  cloud:
    nacos:
      discovery:
        #注册中心地址
        server-addr: 106.12.146.239:8848
      config:
        server-addr: 106.12.146.239:8848
        # 配置中心-指定命名空间
        namespace: bb79a8c4-e4e1-4a27-bceb-0810f278b5aa
        # 指定配置文件后缀
        file-extension: yaml
        #配置组
        group: DEFAULT_GROUP
        #配置dateId
        data-id: lc-gateway
        #获取配置超时时间
        timeout: 5000

    gateway:
      #设置超时时间默认
      httpclient:
        connect-timeout: 1000
        response-timeout: 5s

ps:这里集成了nacos配置中心想了解详情请移步spring cloud集成nacos配置中心

三、动态路由实现

package com.lc.api.gateway.config;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.NacosFactory;
import com.alibaba.nacos.api.config.ConfigService;
import com.alibaba.nacos.api.config.listener.Listener;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.gateway.event.RefreshRoutesEvent;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.context.ApplicationEventPublisherAware;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Mono;
import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Executor;

/**
 * 动态路由,可以通过获取Bean才做该类,提供增删改查已经发布功能
 *
 * @Author: lc
 * @Date: 2020/7/8 15:49
 */
@Service
public class DynamicRouteConfig implements ApplicationEventPublisherAware {
    private static final Logger logger = LoggerFactory.getLogger(DynamicRouteConfig.class);
    @Autowired
    private RouteDefinitionWriter routedefinitionWriter;
    private ApplicationEventPublisher publisher;
    @Value("${spring.cloud.nacos.config.data-id}")
    private String dataId;
    @Value("${spring.cloud.nacos.config.group}")
    private String group;
    @Value("${spring.cloud.nacos.config.server-addr}")
    private String serverAddr;
    @Value("${spring.cloud.nacos.config.namespace}")
    private String namespace;
    @Value("${spring.cloud.nacos.config.timeout}")
    private long timeout;
    private static final List<String> ROUTE_LIST = new ArrayList<>();

    @PostConstruct
    public void dynamicRouteByNacosListener() {
        try {
            Properties prop = new Properties();
            prop.put("serverAddr", serverAddr);
            prop.put("namespace", namespace);
            ConfigService config = NacosFactory.createConfigService(prop);
            String content = config.getConfig(dataId, group, timeout);
            publisher(content);
            config.addListener(dataId, group, new Listener() {
                @Override
                public void receiveConfigInfo(String config) {
                    publisher(config);
                }

                @Override
                public Executor getExecutor() {
                    return null;
                }
            });
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 增加路由
     *
     * @param def
     * @return
     */
    public Boolean addRoute(RouteDefinition def) {
        try {
            routedefinitionWriter.save(Mono.just(def)).subscribe();
            ROUTE_LIST.add(def.getId());
        } catch (Exception e) {
            e.printStackTrace();
        }
        return true;
    }

    /**
     * 删除路由
     *
     * @return
     */
    public Boolean clearRoute() {
        for (String id : ROUTE_LIST) {
            routedefinitionWriter.delete(Mono.just(id)).subscribe();
        }
        ROUTE_LIST.clear();
        return Boolean.FALSE;
    }

    /**
     * 发布路由
     */
    private void publisher(String config) {
        clearRoute();
        try {
            logger.info("Start updating dynamic routing ....");
            List<RouteDefinition> routeDefinitionList = JSONObject.parseArray(config, RouteDefinition.class);
            for (RouteDefinition route : routeDefinitionList) {
                logger.info(route.toString());
                addRoute(route);
            }
            publisher.publishEvent(new RefreshRoutesEvent(this.routedefinitionWriter));
            logger.info("update completed ");
        } catch (Exception e) {
            logger.error("Failed to update routing information", e);
            e.printStackTrace();
        }
    }

    @Override
    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {
        publisher = applicationEventPublisher;
    }
}

四、nacos配置中心设置

1.说明

2.新建一个网关配置

3. 添加配置格式如下

这里我就不注释了大家应该都能看懂

[
    {
        "filters": [
            {
                "args": {
                    "parts": "1"
                },
                "name": "StripPrefix"
            }
        ],
        "id": "authent1",
        "order": -1,
        "predicates": [
            {
                "args": {
                    "pattern": "/authent/**"
                },
                "name": "Path"
            }
        ],
        "uri": "lb://lc-authenticate"
    }
]

五、测试

gateway网关相关配置

创建,使用initilizer,

  • Group:com.atguigu.gulimall
  • Artifact: gulimall-gateway
  • package:com.atguigu.gulimall.gateway

搜索gateway选中。

pom.xml里加上common依赖, 修改jdk版本

在启动类中添加注解@EeableDiscoveryClient

配置nacos注册中心地址

spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
spring.application.name=gulimall-gateway
server.port=88

bootstrap.properties 填写配置中心地址

spring.application.name=gulimall-gateway
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.cloud.nacos.config.namespace=ab66aff2-0bd5-4f80-8a68-760d6ff7d96d

nacos里创建命名空间gateway

然后在命名空间里创建文件guilmall-gateway.yml

spring:
    application:
        name: gulimall-gateway

在主类中屏蔽数据源

在项目里创建application.yml

spring:
  cloud:
    gateway:
      routes:
        - id: after_route
          uri: https://www.xiaomi.com
          predicates:
            - Query=url,xiaomi
#            若参数等于断言 则跳转到指定的uri

运行结果

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 基于Nacos实现Spring Cloud Gateway实现动态路由的方法

    简介 该文档主要介绍以Nacos为配置中心,实现Spring Cloud GateWay 实现动态路由的功能.Spring Cloud Gateway启动时候,就将路由配置和规则加载到内存里,无法做到不重启网关就可以动态的对应路由的配置和规则进行增加,修改和删除.通过nacos的配置下发的功能可以实现在不重启网关的情况下,实现动态路由. 集成 Spring Cloud GateWay集成 spring-cloud-starter-gateway:路由转发.请求过滤(权限校验.限流以及监控等) s

  • 配置gateway+nacos动态路由管理流程

    目录 配置gateway+nacos动态路由 第一步:首先是设置配置文件的配置列表 第二步:配置监听nacos监听器 第三步:配置nacos的yml文件 nacos的智能路由实现与应用 一. 概述 二. 遇到的问题 三. 智能路由的实现 四. 遇到的难点 五. 带来的收益 六. 总结 配置gateway+nacos动态路由 第一步:首先是设置配置文件的配置列表 然后在配置读取配置类上增加刷新注解@RefreshScope import lombok.extern.slf4j.Slf4j; imp

  • Spring Cloud Gateway + Nacos 实现动态路由

    本节开始介绍 SpringCloud Gateway 中动态路由的实现方法,包括: Nacos 集成动态路由配置,更新配置文件即自动更新路由 MySQL + 二级缓存实现,主要基于 Gateway 的一些特性进行重写,实现路由信息的自动更新 这篇文章主要介绍第一种方式:将配置文件放到 Nacos 进行托管,网关服务通过引入 Nacos 而自动更新路由配置信息.实现较为简单. 本节代码在:https://github.com/laolunsi/spring-boot-examples,参考例 23

  • Nacos+Spring Cloud Gateway动态路由配置实现步骤

    目录 前言 一.Nacos环境准备 1.启动Nacos配置中心并创建路由配置 2.连接Nacos配置中心 二.项目构建 1.项目结构 2.编写测试代码 三.测试动态网关配置 1.启动服务,观察注册中心 2.访问网关,观察服务日志 四.总结 前言 Nacos最近项目一直在使用,其简单灵活,支持更细粒度的命令空间,分组等为麻烦复杂的环境切换提供了方便:同时也很好支持动态路由的配置,只需要简单的几步即可.在国产的注册中心.配置中心中比较突出,容易上手,本文通过gateway.nacos-consume

  • nacos gateway动态路由实战

    目录 nacos gateway动态路由 一.引入本次测试需要的pom依赖 二.配置文件设置(*配置文件不生效的把名字改为bootstrap.yml) 三.动态路由实现 四.nacos配置中心设置 五.测试 gateway网关相关配置 在启动类中添加注解@EeableDiscoveryClient 配置nacos注册中心地址 bootstrap.properties 填写配置中心地址 nacos里创建命名空间gateway 在主类中屏蔽数据源 在项目里创建application.yml naco

  • Spring Cloud Gateway动态路由Apollo实现详解

    目录 背景 路由的加载 实现动态路由 背景 在之前我们了解的Spring Cloud Gateway配置路由方式有两种方式 通过配置文件 spring: cloud: gateway: routes: - id: test predicates: - Path=/ms/test/* filters: - StripPrefix=2 uri: http://localhost:9000 通过JavaBean @Bean public RouteLocator routeLocator(RouteL

  • GateWay动态路由与负载均衡详细介绍

    目录 概述 项目实例 1.gateway-server模块 1.1.pom.xml文件 1.2.application.yml文件 1.3.主函数类 2.login-service模块 2.1.pom.xml文件 2.2.application.yml文件 2.3.LoginController文件 2.4.主函数类 3.功能测试 概述 从之前的配置里面我们可以看到我们的 URL 都是写死的,这不符合我们微服务的要求,我们微服务是只要知道服务的名字,根据名字去找,而直接写死就没有负载均衡的效果了

  • SpringCloud Gateway动态路由配置详解

    目录 路由 动态 路由模型实体类 动态路径配置 路由模型JSON数据 路由 gateway最主要的作用是,提供统一的入口,路由,鉴权,限流,熔断:这里的路由就是请求的转发,根据设定好的某些条件,比如断言,进行转发. 动态 动态的目的是让程序更加可以在运行的过程中兼容更多的业务场景. 涉及到两个服务,一个是门户服务(作用是提供给运营人员管理入口--包括:管理路由.绑定路由),一个是网关服务(gateway组件,为门户服务提供:查询路由信息.添加路由.删除路由.编辑路由接口). 路由模型实体类 /*

  • SpringCloud Gateway使用redis实现动态路由的方法

    1. 将 actuator 端点暴露出来 management: endpoints: web: exposure: include: "*" 2. redis 配置 https://www.jb51.net/article/203766.htm 3. 将原内存路由持久化到 redis @Component public class RedisRouteDefinitionRepository implements RouteDefinitionRepository { /** * h

  • SpringCloud Gateway 利用 Mysql 实现动态路由的方法

    需求描述 标准网关动态路由功能是重要的一环,将路由.断言以及过滤器信息,持久化到 Mysql 中,通过配置后台页面实现路由.断言.以及过滤器等配置的增删改查. Spring Cloud Gateway 路由及黑白名单实现背景 Spring Cloud 路由API Spring Cloud Gateway 通过定义 RouteDefinitionRepository 来实现动态路由. //保存路由缓存 public interface RouteDefinitionWriter { Mono<Vo

随机推荐