gateway网关配合nacos做动态路由

如题所述

第1个回答  2022-07-02
通过gateway配合nacos做动态路由一共两种方式,第一种时通过json,解析json进行动态路由,另一种通过设置properties文件进行路由

gateway的动态路由可以配置在nacos的配置中心上,gateway启动的时候来读取配置,对各个请求进行路由

配置文件如下所示

server:

port:9537

spring:

application:

name: cloud-alibaba-gateway

cloud:

nacos:

discovery:

server-addr: localhost:8848

config:

server-addr: localhost:8848

file-extension: json

group: DEFAULT_GROUP#nacos分组

    gateway:#路由

      discovery:

locator:

enabled:true      #开启从注册中心动态创建路由的功能,利用微服务名进行路由

management:

endpoints:

web:

exposure:

include: cloud-alibaba-gateway

package com.gateway.springcloud.config;

import com.alibaba.fastjson.JSONObject;

import com.alibaba.nacos.api.NacosFactory;

import com.alibaba.nacos.api.PropertyKeyConst;

import com.alibaba.nacos.api.config.ConfigService;

import com.alibaba.nacos.api.config.listener.Listener;

import com.alibaba.nacos.api.exception.NacosException;

import org.springframework.beans.factory.annotation.Autowired;

import org.springframework.beans.factory.annotation.Value;

import org.springframework.cloud.context.config.annotation.RefreshScope;

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.context.annotation.Configuration;

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;

/**

* 配置动态路由

*/

@Configuration

public class NacosDynamicRouteServiceimplements ApplicationEventPublisherAware {

private StringdataId ="cloud-alibaba-gateway";

    private Stringgroup ="DEFAULT_GROUP";

    @Value("${spring.cloud.nacos.config.server-addr}")

private StringserverAddr;

    @Autowired

    private RouteDefinitionWriterrouteDefinitionWriter;

    private ApplicationEventPublisherapplicationEventPublisher;

    private static final ListROUTE_LIST =new ArrayList<>();

    @PostConstruct

    public void dynamicRouteByNacosListener() {

try {

Properties properties =new Properties();

            properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr);

            ConfigService configService = NacosFactory.createConfigService(properties);

            String config = configService.getConfig(dataId, group, 5000);

            configService.addListener(dataId, group, new Listener() {

@Override

                public void receiveConfigInfo(String configInfo) {

clearRoute();

                    try {

List gatewayRouteDefinitions = JSONObject.parseArray(configInfo, RouteDefinition.class);

                        for (RouteDefinition routeDefinition : gatewayRouteDefinitions) {

addRoute(routeDefinition);

                        }

publish();

                    }catch (Exception e) {

e.printStackTrace();

                    }

}

@Override

                public ExecutorgetExecutor() {

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));

    }

@Override

    public void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {

this.applicationEventPublisher = applicationEventPublisher;

    }

}

这一步一定要在nacos添加配置之前,因为配置类添加的监听如果nacos上的配置没有进行添加或者修改,网关是读不到配置的,因为他监听的是改变。

里面的name参数,gateway已经规定好了,不允许随意修改,值如下图所示。

本方式不需要建配置类,原理就是通过配置中心直接把动态路由的配置读到配置文件中,首先新建properties文件,

server.port=9547

spring.application.name=cloud-alibaba-gatewayaa

spring.cloud.nacos.discovery.server-addr=localhost:8848

spring.cloud.nacos.config.server-addr=localhost:8848

spring.cloud.nacos.config.file-extension=properties

spring.cloud.nacos.config.group=DEFAULT_GROUP

spring.cloud.gateway.discovery.locator.enabled=true

进入nacos,新建配置

yml配置如下所示

快速搭建一个网关服务,动态路由、鉴权看完就会(含流程图)
Nacos结合gateway-server实现动态路由,首先部署Nacos服务,使用Docker或本地启动源码皆可,具体操作参考官方文档。Nacos配置中,groupId采用网关服务名称,dataId为“routes”,配置格式以json形式呈现,需理解在json中的写法与yaml配置的一致性。实现动态路由的关键在于Nacos配置监听机制,当配置发生更改时,执行...

gateway网关配合nacos做动态路由
通过gateway配合nacos做动态路由一共两种方式,第一种时通过json,解析json进行动态路由,另一种通过设置properties文件进行路由 gateway的动态路由可以配置在nacos的配置中心上,gateway启动的时候来读取配置,对各个请求进行路由 配置文件如下所示 server:port:9537 spring:application:name: cloud-alibaba-gateway...

SpringCloud Gateway的使用 + Nacos动态路由
通过Nacos,动态路由可以实现服务添加时无需重启,只需在Nacos配置中心发布新路由,Gateway会自动检测并应用变更。具体实现步骤涉及创建路由配置接口、在Nacos中管理路由配置文件、使用`ConfigService`监控配置变化,并在项目启动时动态加载路由。测试时,可以看到路由的动态更新效果,无需重启Gateway,即可无缝接入...

...Gateway整合Nacos配置中心 JSON格式 实现动态路由与令牌桶限流 2024...
配置的Data ID需要与网关的application.name=Service-Gateway属性保持一致,配置格式也是json Nacos配置文件内容 我发现其他博主将根元素设置为JSONArray,这样会导致Nacos配置同步时出现错误,因为Nacos无法解析JSONArray,这是不正确的。根节点应该是JSONObject,否则会导致错误 parse data from Nacos error,data...

Spring Gateway 集成Nacos 实现动态路由配置
一、创建test-gateway项目,POM文件如下:二、创建项目配置文件bootstrap.yml a、test_gateway_commons.yml内容如下:三、创建网关配置类 GatewayConfig.java 四、创建动态路由服务DynamicRouteServiceImpl.java 五、创建通过Nacos读取动态路由配置服务DynamicRouteServiceImplByNacos.java 六、配置动态路由配置文件...

Spring Gateway集成nacos实现动态路由配置
一、创建Maven项目test-gateway, pom文件如下:二、创建启动类Apllication.java,内容如下:三、创建网关调用nacos配置类GatewayConfig.java 四、创建动态路由管理服务 1、创建动态路管理类DynamicRouteServiceImpl.java 2、创建通过nacos对路由动态管理类DynamicRouteServiceImplByNacos.java 1、test_gateway_...

Spring Cloud Gateway整合Nacos实现服务路由及集群负载均衡
我们都知道 Spring Cloud Gateway 是一个基于 Spring Boot 、 Spring WebFlux 、 Project Reactor 构建的高性能网关,旨在提供简单、高效的API路由。Spring Cloud Gateway基于 Netty 运行,因此在传统Servlet容器中或者打成war包是不能正常运行的。这里我们注册中心选型的是 Nacos ,如果还没有安装Nacos,请...

springboot集成Gateway & Nacos「再来一刀」
其Predicates和Filters功能使得路由策略编写更加灵活,提供了动态路由、限流和路径重写等高级功能。在实际开发中,Gateway常与Nacos这样的注册中心协同工作。例如,我们可以构建一个简单的测试环境,包括三个部分:Springboot-gateway-server作为服务端,Springboot-gateway-client-a和Springboot-gateway-client-b...

网关-Gateway
通过创建Spring Boot应用,我们可以直观看到网关的工作原理,比如配置路由规则,处理请求、路由转发,并能根据配置实现负载均衡和限流策略。集成与扩展 网关可与Nacos等配置中心集成,实现动态路由和负载均衡。同时,通过Sentinel实现网关限流,提供分组限流和自定义异常处理,确保服务的稳定性和性能。总结 网关在...

gateway的灰度发布数据如何实现
gateway的灰度发布数据如何实现实现原理另一个需求,就是我们需要考虑到在线动态的改变灰度路由的规则,而不是每次改变了规则,需要重新启动服务,这个就不对了。这个的实现可以考虑利用nacos自身的功能。去订阅nacos的配置中心的变化,从而达到动态更新。

相似回答
大家正在搜