个人网站百度推广收费,域名注册哪个平台比较好,四川发布干部任前公示,制作图片app前言
在微服务架构中#xff0c;API 网关是各个服务之间的入口点#xff0c;承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理#xff0c;通常需要通过中心化的配置管理系统来实现灵活的路由更新#xff0c;而无需重启网关服务。Nacos 作为一个开源…前言
在微服务架构中API 网关是各个服务之间的入口点承担着路由、负载均衡、安全认证等重要功能。为了实现动态的路由配置管理通常需要通过中心化的配置管理系统来实现灵活的路由更新而无需重启网关服务。Nacos 作为一个开源的动态服务发现与配置管理平台可以方便地实现这一目标。本文将介绍如何利用 Nacos 配置中心来动态更新 Spring Cloud Gateway 的路由配置确保路由信息的实时更新并提升系统的可维护性和灵活性。 动态路由
监听Nacos配置变更
要实现动态路由首先要将路由配置保存到Nacos当Nacos中的路由配置变更时推送最新配置到网关实时更新网关中的路由信息。 有两件事需要做
监听Nacos配置变更的消息当配置变更时将最新的路由信息更新到网关路由表
在Nacos官网中给出了手动监听Nacos配置变更的SDK详情在文档里面 Nacos文档
如果希望 Nacos 推送配置变更可以使用 Nacos 动态监听配置接口来实现。
public void addListener(String dataId, String group, Listener listener) 参数名参数类型描述dataIdString配置 ID采用类似 package.class如com.taobao.tc.refund.log.level的命名规则保证全局唯一性class 部分建议是配置的业务含义。 全部字符小写。只允许英文字符和 4 种特殊字符“.”、“:”、“-”、“_”。不超过 256 字节。groupString配置分组建议填写产品名模块名如 Nacos:Test保证唯一性。 只允许英文字符和4种特殊字符“.”、“:”、“-”、“_”不超过128字节。listenerListener监听器配置变更进入监听器的回调函数。
示例代码
String serverAddr {serverAddr};
String dataId {dataId};
String group {group};
Properties properties new Properties();
properties.put(serverAddr, serverAddr);
//服务器地址与nacos服务做连接
ConfigService configService NacosFactory.createConfigService(properties);
//读取配置
String content configService.getConfig(dataId, group, 5000);
System.out.println(content);
configService.addListener(dataId, group, new Listener() {Overridepublic void receiveConfigInfo(String configInfo) {System.out.println(recieve1: configInfo);}Overridepublic Executor getExecutor() {return null;}
});// 测试让主线程不退出因为订阅配置是守护线程主线程退出守护线程就会退出。 正式代码中无需下面代码
while (true) {try {Thread.sleep(1000);} catch (InterruptedException e) {e.printStackTrace();}
}ConfigService类中 因此我们想要拿到ConfigService只需要拿到NacosConfigManager即可。 最终代码如下
private final NacosconfigManagernacosconfigManager;
public void initRouteConfigListener()throws NacosException {//1.注册监听器并首次拉取配置String configInfo nacosConfigManager.getConfigService().getConfigAndSignListener(dataId,group,5000,new Listener(){0verridepublic Executor getExecutor(){return null;}0verridepublic void receiveConfigInfo(string configInfo){//TOD0 监听到配置变更更新一次配置});//TOD0 2.首次启动时更新一次配置
}在hm-gateway服务中导入依赖 对应的bootstarp文件内容如下
spring:application:name: gatewayprofiles:active: devcloud:nacos:server-addr: 192.168.244.134:8848config:file-extension: yamlshared-configs: #共享配置- dataId: shared-log.yaml # 共享日志配置更新路由
监听到路由信息后可以利用RouteDefinitionWriter来更新路由表
/**
* author Spencer Gibb
**/
public interface RouteDefinitionWriter{//更新路由到路由表如果路由id重复则会覆盖旧的路由 MonoVoidsave(MonoRouteDefinition route);// 根据路由id删除某个路由MonoVoiddelete(MonoStringrouteId);
}为了方便解析从Nacos读取到的路由配置推荐使用json格式的路由配置模板如下:
{id: item,uri: lb://item-service,predicates:[{name: Path,args:{_genkey_0:/items/**,_gènkey_1:/search/**}]filters: []
}实现动态路由
spring:cloud:gateway:routes:- id: item-serviceuri: lb://item-servicepredicates:- Path/items/**,/search/**最终创建的DynamicRouteLoader类的内容如下
package com.hmall.gateway.routers;import cn.hutool.json.JSONUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.gateway.route.RouteDefinition;
import org.springframework.cloud.gateway.route.RouteDefinitionWriter;
import org.springframework.stereotype.Component;
import reactor.core.publisher.Mono;import javax.annotation.PostConstruct;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;Slf4j
Component
AllArgsConstructor
public class DynamicRouteLoader {private final NacosConfigManager nacosConfigManager;private final RouteDefinitionWriter routeDefinitionWriter;private final String dataId gateway-routes.json;private final String group DEFAULT_GROUP;private final SetString routeIds new HashSet();PostConstructpublic void initRouteConfigListener() throws NacosException {//1.项目启动时先拉取一次配置并且添加配置监听器String configInfo nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, 5000, new Listener() {Overridepublic Executor getExecutor() {return null;}Overridepublic void receiveConfigInfo(String configInfo) {//2.监听到配置变更需要去更新路由表updateConfigInfo(configInfo);}});//3.第一次读取到配置也需要更新到路由表updateConfigInfo(configInfo);}public void updateConfigInfo(String configInfo){log.debug(监听到路由配置信息{},configInfo);//1.解析配置信息转为RouteDefinitionListRouteDefinition routeDefinitions JSONUtil.toList(configInfo, RouteDefinition.class);//2.删除旧的路由表for (String routeId : routeIds) {routeDefinitionWriter.delete(Mono.just(routeId)).subscribe();}routeIds.clear();//3.更新路由表for (RouteDefinition routeDefinition : routeDefinitions) {//3.1更新路由表routeDefinitionWriter.save(Mono.just(routeDefinition)).subscribe();//3.2记录路由id便于下一次更新的时候删除routeIds.add(routeDefinition.getId());}}
}NacosConfigManager获取 Nacos 配置并监听配置变化。RouteDefinitionWriter用于操作 Spring Cloud Gateway 的路由配置如添加、删除、更新路由。dataIdNacos 配置的标识用于获取路由配置的 JSON 数据。groupNacos 配置的分组。routeIds集合用于记录已经加载的路由 ID方便在更新时删除旧路由。使用 PostConstruct 注解来确保类初始化后执行该方法。通过 nacosConfigManager.getConfigService().getConfigAndSignListener 从Nacos 拉取初始配置并设置一个配置监听器。 getConfigAndSignListener获取配置信息并注册监听器监听配置的变化。如果配置发生变化receiveConfigInfo 方法将被调用来更新路由配置。 配置监听器初始化后updateConfigInfo(configInfo) 被调用用来处理第一次拉取到的路由配置信息。解析配置信息使用 JSONUtil.toList(configInfo, RouteDefinition.class) 将拉取到的 JSON 配置转换成 RouteDefinition 列表。删除旧路由遍历之前保存的 routeIds使用 routeDefinitionWriter.delete 删除已经存在的路由并清空 routeIds 集合。添加新路由遍历新的 routeDefinitions使用 routeDefinitionWriter.save 保存新的路由配置同时将新的路由 ID 加入 routeIds 以便下一次更新时删除旧路由。
在nacos的配置列表中添加配置gateway-routes.json 具体内容如下
[{id: item,predicates: [{name: Path,args: {_genkey_0:/items/**, _genkey_1:/search/**}}],filters: [],uri: lb://item-service},{id: cart,predicates: [{name: Path,args: {_genkey_0:/carts/**}}],filters: [],uri: lb://cart-service},{id: user,predicates: [{name: Path,args: {_genkey_0:/users/**, _genkey_1:/addresses/**}}],filters: [],uri: lb://user-service},{id: trade,predicates: [{name: Path,args: {_genkey_0:/orders/**}}],filters: [],uri: lb://trade-service},{id: pay,predicates: [{name: Path,args: {_genkey_0:/pay-orders/**}}],filters: [],uri: lb://pay-service}
]总结
本文通过示例代码展示了如何使用 Nacos 配置中心监听配置变更并自动更新 Spring Cloud Gateway 的路由配置。通过这种方式我们能够实现动态的路由更新避免了传统的重启服务方式。利用 Nacos 作为配置中心能够使得微服务架构中的 API 网关具有更高的灵活性和扩展性提升系统的整体效率。 文章转载自: http://www.morning.qhvah.cn.gov.cn.qhvah.cn http://www.morning.qtltg.cn.gov.cn.qtltg.cn http://www.morning.bpwfr.cn.gov.cn.bpwfr.cn http://www.morning.wrtxk.cn.gov.cn.wrtxk.cn http://www.morning.klpwl.cn.gov.cn.klpwl.cn http://www.morning.xbyyd.cn.gov.cn.xbyyd.cn http://www.morning.dyght.cn.gov.cn.dyght.cn http://www.morning.rxnr.cn.gov.cn.rxnr.cn http://www.morning.jqlx.cn.gov.cn.jqlx.cn http://www.morning.qggm.cn.gov.cn.qggm.cn http://www.morning.bpmz.cn.gov.cn.bpmz.cn http://www.morning.wkhfg.cn.gov.cn.wkhfg.cn http://www.morning.kwqcy.cn.gov.cn.kwqcy.cn http://www.morning.gcysq.cn.gov.cn.gcysq.cn http://www.morning.xlmpj.cn.gov.cn.xlmpj.cn http://www.morning.mdgb.cn.gov.cn.mdgb.cn http://www.morning.fpqsd.cn.gov.cn.fpqsd.cn http://www.morning.rgxf.cn.gov.cn.rgxf.cn http://www.morning.mlmwl.cn.gov.cn.mlmwl.cn http://www.morning.mcmpq.cn.gov.cn.mcmpq.cn http://www.morning.lsjgh.cn.gov.cn.lsjgh.cn http://www.morning.pwmpn.cn.gov.cn.pwmpn.cn http://www.morning.a3e2r.com.gov.cn.a3e2r.com http://www.morning.qwfq.cn.gov.cn.qwfq.cn http://www.morning.lsqxh.cn.gov.cn.lsqxh.cn http://www.morning.sjqml.cn.gov.cn.sjqml.cn http://www.morning.cfccp.cn.gov.cn.cfccp.cn http://www.morning.gwzfj.cn.gov.cn.gwzfj.cn http://www.morning.nlnmy.cn.gov.cn.nlnmy.cn http://www.morning.jtdrz.cn.gov.cn.jtdrz.cn http://www.morning.srrrz.cn.gov.cn.srrrz.cn http://www.morning.wgbsm.cn.gov.cn.wgbsm.cn http://www.morning.brkc.cn.gov.cn.brkc.cn http://www.morning.xnrgb.cn.gov.cn.xnrgb.cn http://www.morning.dzgyr.cn.gov.cn.dzgyr.cn http://www.morning.jpfpc.cn.gov.cn.jpfpc.cn http://www.morning.gbgdm.cn.gov.cn.gbgdm.cn http://www.morning.jjzjn.cn.gov.cn.jjzjn.cn http://www.morning.njfgl.cn.gov.cn.njfgl.cn http://www.morning.ppllj.cn.gov.cn.ppllj.cn http://www.morning.bfbl.cn.gov.cn.bfbl.cn http://www.morning.sfdky.cn.gov.cn.sfdky.cn http://www.morning.jqsyp.cn.gov.cn.jqsyp.cn http://www.morning.wklrz.cn.gov.cn.wklrz.cn http://www.morning.qcwrm.cn.gov.cn.qcwrm.cn http://www.morning.mrtdq.cn.gov.cn.mrtdq.cn http://www.morning.fdzzh.cn.gov.cn.fdzzh.cn http://www.morning.xkzmz.cn.gov.cn.xkzmz.cn http://www.morning.ysrtj.cn.gov.cn.ysrtj.cn http://www.morning.qbkw.cn.gov.cn.qbkw.cn http://www.morning.sfwd.cn.gov.cn.sfwd.cn http://www.morning.ymwrs.cn.gov.cn.ymwrs.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.lhxkl.cn.gov.cn.lhxkl.cn http://www.morning.rbcw.cn.gov.cn.rbcw.cn http://www.morning.lkjzz.cn.gov.cn.lkjzz.cn http://www.morning.bqpgq.cn.gov.cn.bqpgq.cn http://www.morning.qfzjn.cn.gov.cn.qfzjn.cn http://www.morning.gfrjs.cn.gov.cn.gfrjs.cn http://www.morning.skbkq.cn.gov.cn.skbkq.cn http://www.morning.yzdth.cn.gov.cn.yzdth.cn http://www.morning.sglcg.cn.gov.cn.sglcg.cn http://www.morning.sffwz.cn.gov.cn.sffwz.cn http://www.morning.fykrm.cn.gov.cn.fykrm.cn http://www.morning.qcnk.cn.gov.cn.qcnk.cn http://www.morning.mgkb.cn.gov.cn.mgkb.cn http://www.morning.xckrj.cn.gov.cn.xckrj.cn http://www.morning.rntyn.cn.gov.cn.rntyn.cn http://www.morning.nbnpb.cn.gov.cn.nbnpb.cn http://www.morning.lptjt.cn.gov.cn.lptjt.cn http://www.morning.wtdhm.cn.gov.cn.wtdhm.cn http://www.morning.qlrtd.cn.gov.cn.qlrtd.cn http://www.morning.rkxqh.cn.gov.cn.rkxqh.cn http://www.morning.prgrh.cn.gov.cn.prgrh.cn http://www.morning.sjpbh.cn.gov.cn.sjpbh.cn http://www.morning.fkcjs.cn.gov.cn.fkcjs.cn http://www.morning.mhcys.cn.gov.cn.mhcys.cn http://www.morning.rqzyz.cn.gov.cn.rqzyz.cn http://www.morning.plwfx.cn.gov.cn.plwfx.cn http://www.morning.jlmrx.cn.gov.cn.jlmrx.cn