nacos gateway动态路由实战

网友投稿 1240 2022-12-09

nacos gateway动态路由实战

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依赖

org.springframework.cloud

spring-cloud-starter-gateway

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-config

com.alibaba.cloud

spring-cloud-starter-alibaba-nacos-discovery

com.alibaba

fastjson

1.2.47

二、配置文件设置(*配置文件不生效的把名字改为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:

#设置超时时间默认

http:// 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}")

privatehttp:// 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 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 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://xiaomi.com

predicates:

- Query=url,xiaomi

# 若参数等于断言 则跳转到指定的uri

运行结果

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:解决Spring Data Jpa 实体类自动创建数据库表失败问题
下一篇:spring cloud如何集成nacos配置中心
相关文章

 发表评论

暂时没有评论,来抢沙发吧~