当前位置: 首页 > wzjs >正文

绵阳定制网站建设重庆seo主管

绵阳定制网站建设,重庆seo主管,个人首页模板,搭建广告网站费用除了token以外,还有一个很实用的功能就是把网关的路由配置放到nacos上,并且修改路由配置的时候,网关服务可以动态的更新,这样我们在调整网络配置的时候,就不用重启服务了。所以我们需要用到两个重要的类:Na…

除了token以外,还有一个很实用的功能就是把网关的路由配置放到nacos上,并且修改路由配置的时候,网关服务可以动态的更新,这样我们在调整网络配置的时候,就不用重启服务了。所以我们需要用到两个重要的类:NacosConfigManager和RouteDefinitionWriter,NacosConfigManager用来监听nacos上配置的变化,RouteDefinitionWriter会执行路由配置。

1、将原来写在application.yml中的路由配置信息迁移到nacos上,dataId定义为gateway-routes,这里要注意,原来在项目中yml文件解析的时候,会被SpringCloud层层解析后生成RouteDefinition,在这期间SpringCloud会去解析比如Path=/api/*这种形式,但是现在我们要自己解析,就要改成符合RouteDefinition的完全形式,这是一个小难点。

spring:cloud:gateway:routes:- id: nacos-client-demouri: lb://nacos-client-demopredicates: #断言,匹配访问的路径- name: Pathargs:pattern: /nacos-client-demo/api/**filters: # 过滤器- name: AddRequestHeaderargs:_genkey_0: headername_genkey_1: I am a header!- name: Myargs:_genkey_0: zhangsan_genkey_1: lisi_genkey_2: wangwu- id: open-feign-demouri: lb://open-feign-demopredicates:- name: Pathargs:pattern: /open-feign-demo/api/**

2、在application.yml中添加nacos的配置信息就可以了,并且我特意添加了两个参数,用来指明动态路由配置的dataId,这样以后改成其他的也方便。

spring:main:# gateway组件中的spring-boot-starter-webflux和springboot作为web项目启动必不可少的spring-boot-starter-web出现冲突web-application-type: reactiveapplication:name: gateway-democloud:gateway:nacos-data-id: gateway-routesnacos-group: devopsnacos:server-addr: 192.168.3.54:80username: nacospassword: nacosdiscovery:group: devopsnamespace: sitconfig:namespace: sitgroup: devopsconfig:import: nacos:${spring.application.name}?refresh=true
server:port: 8888

3、定义一个component类DynamicRouterLoader,继承ApplicationEventPublisherAware,网上很多教程没有继承,因为版本不同,我用新版的发现必须要用ApplicationEventPublisherAware发布一下才能让路由信息生效。

package com.mj.gateway.router;import cn.hutool.core.lang.Dict;
import cn.hutool.json.JSONUtil;
import cn.hutool.setting.yaml.YamlUtil;
import com.alibaba.cloud.nacos.NacosConfigManager;
import com.alibaba.fastjson2.JSONObject;
import com.alibaba.nacos.api.config.listener.Listener;
import com.alibaba.nacos.api.exception.NacosException;
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.Component;
import reactor.core.publisher.Mono;import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executor;@Slf4j
@Component
@RequiredArgsConstructor
public class DynamicRouterLoader implements ApplicationEventPublisherAware {//nacos配置管理器private final NacosConfigManager nacosConfigManager;//gateway路由规则写入器private final RouteDefinitionWriter writer;private ApplicationEventPublisher publisher;@Value("${spring.cloud.gateway.nacos-data-id:test}")private String dataId;@Value("${spring.cloud.gateway.nacos-group:test}")private String group;private final int timeout = 5000;//保存所有的路由idprivate final Set<String> routeIds = new HashSet<>();//PostConstruct表示实例化之后就会执行@PostConstructpublic void initRouteConfigListener() throws NacosException {//获取配置,服务启动的时候就要加载一次配置String config = nacosConfigManager.getConfigService().getConfigAndSignListener(dataId, group, timeout, new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String config) {//配置变化时,重新加载配置updateConfig(config);}});//服务启动,加载配置updateConfig(config);}private void updateConfig(String config) {log.info("更新路由信息");//读取nacos中yaml配置Dict dict = YamlUtil.load(new BufferedReader(new InputStreamReader(new ByteArrayInputStream(config.getBytes()))));//转换成Route对象List<RouteDefinition> routeDefinitions = JSONObject.parseObject(JSONUtil.toJsonStr(dict)).getJSONObject("spring").getJSONObject("cloud").getJSONObject("gateway").getJSONArray("routes").toList(RouteDefinition.class);//清理旧的路由规则routeIds.forEach(routeId -> writer.delete(Mono.just(routeId)).subscribe());//清空缓存routeIds.clear();// 遍历添加路由routeDefinitions.forEach(definition -> {//提交路由信息writer.save(Mono.just(definition)).subscribe();//缓存下记录,这样便于清除路由配置routeIds.add(definition.getId());});this.publisher.publishEvent(new RefreshRoutesEvent(this));}@Overridepublic void setApplicationEventPublisher(ApplicationEventPublisher applicationEventPublisher) {this.publisher = applicationEventPublisher;}
}

DynamicRouterLoader在服务启动的时候就会实例化并且注入spring中,所以我们给方法initRouteConfigListener添加注解@PostConstruct,这样实例化一完成就会执行该方法。方法里使用NacosConfigManager获取到nacos的数据并做一次更新路由,这次更新是用来启动服务时初始化路由配置,再添加一个监听器,每次nacos修改都会触发这个监听器再次更新路由配置。更新路由其实有两个思路,思路1是能准确判断每次修改、删除的路由信息,然后分别执行update和delete,这就需要我们去做新旧版本配置的区分工作了,工作量比较大,思路2就是每次都清空所有路由,然后把最新版配置信息加载进去。思路2更简单一点,不过我没有测试过路由信息特别大的情况下会不会导致延迟,通常我们的微服务不至于多到会产生延迟,但是这里依旧要警惕,工作中如果发现数量真的很大了,就要多做一些压力测试。

4、重启服务,做测试:http://127.0.0.1:8888/nacos-client-demo/api/login?userid=123&username=zhangsan

这时候是正常的:

5、修改一下nacos上路由信息,把nacos-client-demo的路由直接删掉,保存服务一直正常运行,观察是否生效。

如果debug能发现监听器被调用了,日志也会打印,再调用接口就已经404了。


文章转载自:

http://I4frBqyH.rnrwq.cn
http://MtUBwe9B.rnrwq.cn
http://NlbP5OPI.rnrwq.cn
http://kq1pGv0o.rnrwq.cn
http://PLY5FLj8.rnrwq.cn
http://FjZLSdNc.rnrwq.cn
http://JbYZSCDZ.rnrwq.cn
http://EL2XYFew.rnrwq.cn
http://9zNy6AlD.rnrwq.cn
http://ZvW5axxE.rnrwq.cn
http://DA54RjnD.rnrwq.cn
http://N52Ev4vM.rnrwq.cn
http://aEVRXy80.rnrwq.cn
http://IwJ42eNI.rnrwq.cn
http://mI76uNRY.rnrwq.cn
http://FALwFR16.rnrwq.cn
http://xA8waGH4.rnrwq.cn
http://bOCrIsPV.rnrwq.cn
http://4IpiLeN9.rnrwq.cn
http://n5NryapF.rnrwq.cn
http://S15ZEA47.rnrwq.cn
http://n73QZuSd.rnrwq.cn
http://iYBbF8Dm.rnrwq.cn
http://lOvEqcci.rnrwq.cn
http://FhTC2kLp.rnrwq.cn
http://576vC3lG.rnrwq.cn
http://ScpEdl7A.rnrwq.cn
http://kQiOZMLM.rnrwq.cn
http://0j1k1xMU.rnrwq.cn
http://7yBvALPG.rnrwq.cn
http://www.dtcms.com/wzjs/737809.html

相关文章:

  • 网站用户界面ui设计细节建网站的详细步骤
  • 北京正规网站建设公司哪家好上海整形网站建设
  • 代做毕业设计网站有哪些哪个网站可以给图片做链接
  • 厦门 网站 开发郑州企业网站托管公司
  • 桂林做网站的公司有哪些wordpress时间函数
  • 鹤壁网站建设公司律师手机网站模板
  • 各大网站推广软件东莞自己注册公司流程
  • 学习网站建设有前景没上海高端品牌网站制作
  • 建设部网站办事大厅电脑培训班多少费用
  • wordpress
    江门seo代理计费
                          
  • 商务网站建设ppt网页模板psd素材
  • 公司网站首页模板顺德网站建设哪家好
  • 网站种类有哪些海口网站公司
  • 做一个类似微博的网站需要怎麼做自己做游戏的 网站
  • 可以放友情链接的网站做网站如何自己寻找客户
  • wordpress官方网站亿恩 网站备案
  • 网站做淘客做衣服的网站
  • 电脑网站开发网站模块标准版
  • 知名的咨询行业网站制作创意设计网站推荐
  • 山东军辉建设集团有限公司 公司网站网址做网站需要租服务器吗
  • 有哪些企业可以做招聘的网站有哪些内容南昌手机网站
  • 樟木头网站推广h5页面制作代码
  • 广州注册公司核名在哪个网站自己怎样做广告链接
  • 手机网站搭建福建响应式网站制作
  • 发布网站需要多少钱国家示范建设成果网站
  • 建设一个视频网站需要什么网站调用微博
  • 在线代理网页浏览网站免费com域名申请注册
  • html5微网站泾阳县住房和城乡建设局网站
  • 新网站的站点验证保定学校网站建设
  • 南头企业网站建设公司网站建设 客户评价