SpringGateway集成Nacos实现动态路由配置
通过SpringGateway集成Nacos实现配置管理,并且实现动态路由管理。
一、创建testgateway项目,POM文件如下:modelVersion4。0。0modelVersionparentgroupIdcom。golte。parentgroupIdgolteparentartifactIdversion1。0。0versionparentgroupIdcom。golte。gatewaygroupIdgoltegatewayartifactIdversion0。0。1SNAPSHOTversionnamegoltegatewaynamedescriptionGatewayprojectforSpringBootdescriptionpropertiesjava。version1。8java。versionspring。cloud。versionHoxton。SR8spring。cloud。version2。2。3。RELEASEalibaba。cloud。versionfastjson。version1。2。73fastjson。versionpropertiesdependenciesdependencygroupIdorg。springframework。cloudgroupIdspringcloudstartergatewayartifactIddependencydependencygroupIdcom。alibaba。cloudgroupIdspringcloudstarteralibabanacosconfigartifactIddependencydependencygroupIdcom。alibaba。cloudgroupIdspringcloudstarteralibabanacosdiscoveryartifactIddependency!sentinel提供的gataway适配器dependencygroupIdcom。alibaba。cloudgroupIdspringcloudalibabasentinelgatewayartifactIddependency!对外暴露SpringBoot监控指标dependencygroupIdorg。springframework。bootgroupIdspringbootstarteractuatorartifactIddependencydependencygroupIdorg。springframework。bootgroupIdspringbootstartertestartifactIdscopetestscopeexclusionsexclusiongroupIdorg。junit。vintagegroupIdjunitvintageengineartifactIdexclusionexclusionsdependencydependencygroupIdcom。alibabagroupIdfastjsonartifactIdversion{fastjson。version}versiondependencydependenciesdependencyManagementdependenciesdependencygroupIdorg。springframework。cloudgroupIdspringclouddependenciesartifactIdversion{spring。cloud。version}versiontypepomtypescopeimportscopedependencydependencygroupIdcom。alibaba。cloudgroupIdspringcloudalibabadependenciesartifactIdversion{alibaba。cloud。version}versiontypepomtypescopeimportscopedependencydependenciesdependencyManagementbuildfinalNametestgatewayfinalNamepluginsplugingroupIdorg。springframework。bootgroupIdspringbootmavenpluginartifactIdpluginpluginsbuildproject
二、创建项目配置文件bootstrap。ymlserver:port:80spring:profiles:active:devapplication:name:testgatewaycloud:nacos:config:namespace:{spring。profiles。active}serveraddr:http:127。0。0。1:8848extensionconfigs〔0〕:dataid:testgatewaycommons。ymlgroup:DEFAULTGROUPrefresh:trueNacos动态路由配置,json格式nacos:gateway:route:config:dataid:gatewaydynamicroutergroup:DEFAULTGROUP
a、testgatewaycommons。yml内容如下:sentinel相关配置spring:cloud:sentinel:transport:dashboard:http:127。0。0。1:8080port:8719scg:fallback:mode:responseresponsestatus:455responsebody:error!nacos:discovery:namespace:devserveraddr:127。0。0。1:8848management:endpoints:web:exposure:include:
三、创建网关配置类GatewayConfig。javaimportorg。springframework。beans。factory。annotation。Value;importorg。springframework。context。annotation。Configuration;ConfigurationpublicclassGatewayConfig{publicstaticfinallongDEFAULTTIMEOUT30000;publicstaticStringNACOSSERVERADDR;publicstaticStringNACOSNAMESPACE;publicstaticStringNACOSROUTEDATAID;publicstaticStringNACOSROUTEGROUP;Value({spring。cloud。nacos。discovery。serveraddr})publicvoidsetNacosServerAddr(StringnacosServerAddr){NACOSSERVERADDRnacosServerAddr;}Value({spring。cloud。nacos。discovery。namespace})publicvoidsetNacosNamespace(StringnacosNamespace){NACOSNAMESPACEnacosNamespace;}Value({nacos。gateway。route。config。dataid})publicvoidsetNacosRouteDataId(StringnacosRouteDataId){NACOSROUTEDATAIDnacosRouteDataId;}Value({nacos。gateway。route。config。group})publicvoidsetNacosRouteGroup(StringnacosRouteGroup){NACOSROUTEGROUPnacosRouteGroup;}}
四、创建动态路由服务DynamicRouteServiceImpl。javaimportorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。cloud。gateway。event。RefreshRoutesEvent;importorg。springframework。cloud。gateway。route。RouteDefinition;importorg。springframework。cloud。gateway。route。RouteDefinitionWriter;importorg。springframework。context。ApplicationEventPublisher;importorg。springframework。context。ApplicationEventPublisherAware;importorg。springframework。stereotype。Service;importlombok。extern。slf4j。Slf4j;importreactor。core。publisher。Mono;动态更新路由网关service1)实现一个Spring提供的事宜推送接口ApplicationEventPublisherAware2)提供动态路由的基础方式,可通过获取bean操作该类的方式。该类提供新增路由、更新路由、删除路由,然后实现公布的功效。Slf4jServicepublicclassDynamicRouteServiceImplimplementsApplicationEventPublisherAware{AutowiredprivateRouteDefinitionWriterrouteDefinitionWriter;公布事宜AutowiredprivateApplicationEventPublisherpublisher;OverridepublicvoidsetApplicationEventPublisher(ApplicationEventPublisherapplicationEventPublisher){this。publisherapplicationEventPublisher;}删除路由paramidreturnpublicStringdelete(Stringid){try{log。info(gatewaydeleterouteid{},id);this。routeDefinitionWriter。delete(Mono。just(id));returndeletesuccess;}catch(Exceptione){returndeletefail;}}更新路由paramdefinitionreturnpublicStringupdate(RouteDefinitiondefinition){try{log。info(gatewayupdateroute{},definition);this。routeDefinitionWriter。delete(Mono。just(definition。getId()));}catch(Exceptione){returnupdatefail,notfindrouterouteId:definition。getId();}try{routeDefinitionWriter。save(Mono。just(definition))。subscribe();this。publisher。publishEvent(newRefreshRoutesEvent(this));returnsuccess;}catch(Exceptione){returnupdateroutefail;}}增添路由paramdefinitionreturnpublicStringadd(RouteDefinitiondefinition){log。info(gatewayaddroute{},definition);routeDefinitionWriter。save(Mono。just(definition))。subscribe();this。publisher。publishEvent(newRefreshRoutesEvent(this));returnsuccess;}}
五、创建通过Nacos读取动态路由配置服务DynamicRouteServiceImplByNacos。javaimportjava。util。List;importjava。util。Properties;importjava。util。concurrent。Executor;importjavax。annotation。PostConstruct;importorg。springframework。beans。factory。annotation。Autowired;importorg。springframework。cloud。gateway。route。RouteDefinition;importorg。springframework。context。annotation。DependsOn;importorg。springframework。stereotype。Component;importcom。alibaba。fastjson。JSON;importcom。alibaba。nacos。api。NacosFactory;importcom。alibaba。nacos。api。config。ConfigService;importcom。alibaba。nacos。api。config。listener。Listener;importcom。alibaba。nacos。api。exception。NacosException;importlombok。extern。slf4j。Slf4j;通过nacos下发动态路由设置,监听Nacos中gatewayroute设置ComponentSlf4jDependsOn({gatewayConfig})依赖于gatewayConfigbeanpublicclassDynamicRouteServiceImplByNacos{AutowiredprivateDynamicRouteServiceImpldynamicRouteService;privateConfigServiceconfigService;PostConstructpublicvoidinit(){log。info(gatewayrouteinit。。。);try{configServiceinitConfigService();if(configServicenull){log。warn(initConfigServicefail);return;}StringconfigInfoconfigService。getConfig(GatewayConfig。NACOSROUTEDATAID,GatewayConfig。NACOSROUTEGROUP,GatewayConfig。DEFAULTTIMEOUT);log。info(获取网关当前设置:r{},configInfo);ListRouteDefinitiondefinitionListJSON。parseArray(configInfo,RouteDefinition。class);for(RouteDefinitiondefinition:definitionList){log。info(updateroute:{},definition。toString());dynamicRouteService。add(definition);}}catch(Exceptione){log。error(初始化网关路由时发生错误,e);}dynamicRouteByNacosListener(GatewayConfig。NACOSROUTEDATAID,GatewayConfig。NACOSROUTEGROUP);}监听Nacos下发的动态路由设置paramdataIdparamgrouppublicvoiddynamicRouteByNacosListener(StringdataId,Stringgroup){try{configService。addListener(dataId,group,newListener(){OverridepublicvoidreceiveConfigInfo(StringconfigInfo){log。info(举行网关更新:r{},configInfo);ListRouteDefinitiondefinitionListJSON。parseArray(configInfo,RouteDefinition。class);for(RouteDefinitiondefinition:definitionList){log。info(updateroute:{},definition。toString());dynamicRouteService。update(definition);}}OverridepublicExecutorgetExecutor(){log。info(getExecutorr);returnnull;}});}catch(NacosExceptione){log。error(从nacos吸收动态路由设置失足!!!,e);}}初始化网关路由nacosconfigreturnprivateConfigServiceinitConfigService(){try{PropertiespropertiesnewProperties();properties。setProperty(serverAddr,GatewayConfig。NACOSSERVERADDR);properties。setProperty(namespace,GatewayConfig。NACOSNAMESPACE);returnconfigServiceNacosFactory。createConfigService(properties);}catch(Exceptione){log。error(初始化网关路由时发生错误,e);returnnull;}}}
六、配置动态路由配置文件gatewaydynamicrouter,内容如下:〔{id:useradminrouter,order:5,predicates:〔{args:{pattern:useradmin},name:Path}〕,filters:〔{name:StripPrefix,args:{genkey0:1}}〕,uri:lb:testuseradmin},{id:userapprouter,order:4,predicates:〔{args:{pattern:users},name:Path}〕,filters:〔{name:StripPrefix,args:{genkey0:1}}〕,uri:lb:testuserapp}〕
通过以上步骤就完成SpringGateway集成Nacos实现动态路由配置功能。以后只要通过修改Nacos的配置文件就可以时间服务的动态上下线了。不需要再重启网关了。
电动车三杰交付量洗牌小鹏大逆袭,蔚来掉队了【财报速递】造车新势力三家公司,最后一个发布四季度财报的是小鹏汽车。小鹏(XPEV。NYSE)3月28日晚间发布的财报显示,第四季度,总营收为85。56亿元,较2020年……
抖音关于升级谣言专项治理的公告来源:抖音安全中心一直以来,抖音平台高度重视网络谣言的打击治理,建立了谣言发现、识别、打击全流程工作机制,开辟辟谣专区,深入联动权威机构、专业领域创作者开展辟谣工作。近期……
618几款新机推荐,水果机建议避开,这几款安卓旗舰更香一些国产手机的发展一直被大家所关注,随着一年一度的618购物节的临近,通过手机平台可以看到很多手机资讯,对于想更换手机的用户来说,很多人都会交不少智商税,那么如何选择一款适合自己的……
谁最记得你的生日?是我的母亲最记得我的生日。我来回答,我的个人体验是,最记得你生日的我想永远都是跟你有金钱来往的商家吧。就以我的亲身经历说一说,今天11月25日是我的生日,先生外出一……
西门子出售智能交通业务,海信拟10亿美金接盘?行业内卷之下集西门子打包出售智能交通业务的谣言终究变成了现实。早在去年11月,西门子就宣布将旗下的ITS(智能交通系统)部门拆分为独立的公司。今年2月,西门子新任首席执行官罗兰布希表示……
华为mate40pro和苹果13到底怎么选?从一个的普通消费者的层面来说,我个人是极力推荐iPhone13的,倒不是因为Mate40Pro不够好,而是从普通消费者的角度来说,还是iPhone13更适合。看到这里可能……
微信专属输入法新一轮内测!张小龙并非为抢夺市场,是为保护用户中国经济周刊经济网讯据媒体报道,近期微信输入法又开启新一轮内测,获得内测资格的用户数量较此前更多。在2021年初的微信公开课上,张小龙曾透露将上线微信专属输入法,目的并非为了抢……
特斯拉男车主手撕维权女车主都怪你害我变成特孝子大家好今天在刷抖音的时候突然看到有人发了一条四问特斯拉维权事主的视频之前车顶维权声势那么大这是反转了?我连忙点进了作者主页好家伙,这下……
数字技术助力全球减贫来源:人民网人民日报短短几十年间,数字技术已在全球普及开来,许多国家正在快速布局数字基础设施。目前,移动宽带网络覆盖全球九成人口,不少国家已启动5G网络推广计划。截至9月……
李佳琦,薇娅们带货越多,淘宝越危险今年的双十一基本落下帷幕,到了各家电商平台开始盘点的时刻。和往年的双十一不一样,在互联网强监管的背景下,整个行业少了往年的喧嚣,往年各种战报在各个媒体满天飞。今年则是在11号当……
你的手机上有哪些想删却删不掉的软件?其实现在安卓手机内置软件的情况已经好很多了,除非是像相机、应用市场、用户中心这样必须的软件,大部分内置软件都可以删除。反倒是苹果iOS有很多预装软件无法卸载,虽然iOS10可以……
元宇宙的点滴21、元宇宙的商业模式,可以借鉴美团王兴的四纵三横模式来思考;2、王兴的四纵三横模式是由四类可做的业务类型形成四条纵线,与三类技术特征形成三条横线,其中的交叉点就是具体的商……