nacos提供com.alibaba.nacos.api.config.ConfigService作为客户端的API用于发布,订阅,获取配置信息;

  • ConfigService获取配置信息流程: 优先使用本地配置 --> 从nacos服务器获取配置 --> 本地快照文件获取配置

    本地文件获取路径: ${user.home}\nacos\config${serverName}_nacos\data\config-data\DEFAULT_GROUP\dataId

    服务器配置获取地址:/v1/cs/configs

    本地快照文件路径:${user.home}\nacos\config${serverName}_nacos\snapshot\DEFAULT_GROUP\dataId
  1. public class NacosConfigService implements ConfigService {
  2. /**
  3. * Get config
  4. *
  5. * @param dataId dataId
  6. * @param group group
  7. * @param timeoutMs read timeout
  8. * @return config value
  9. * @throws NacosException NacosException
  10. */
  11. @Override
  12. public String getConfig(String dataId, String group, long timeoutMs) throws NacosException {
  13. return getConfigInner(namespace, dataId, group, timeoutMs);
  14. }
  15. private String getConfigInner(String tenant, String dataId, String group, long timeoutMs) throws NacosException {
  16. group = null2defaultGroup(group);
  17. ParamUtils.checkKeyParam(dataId, group);
  18. ConfigResponse cr = new ConfigResponse();
  19. cr.setDataId(dataId);
  20. cr.setTenant(tenant);
  21. cr.setGroup(group);
  22. // 优先使用本地配置
  23. String content = LocalConfigInfoProcessor.getFailover(agent.getName(), dataId, group, tenant);
  24. if (content != null) {
  25. LOGGER.warn("[{}] [get-config] get failover ok, dataId={}, group={}, tenant={}, config={}", agent.getName(), dataId, group, tenant, ContentUtils.truncateContent(content));
  26. cr.setContent(content);
  27. configFilterChainManager.doFilter(null, cr);
  28. content = cr.getContent();
  29. return content;
  30. }
  31. // 从服务器端获取
  32. try {
  33. String[] ct = worker.getServerConfig(dataId, group, tenant, timeoutMs);
  34. cr.setContent(ct[0]);
  35. configFilterChainManager.doFilter(null, cr);
  36. content = cr.getContent();
  37. return content;
  38. } catch (NacosException ioe) {
  39. LOGGER.warn("[{}] [get-config] get from server error, dataId={}, group={}, tenant={}, msg={}", agent.getName(), dataId, group, tenant, ioe.toString());
  40. }
  41. //从服务器获取失败后从快照获取
  42. content = LocalConfigInfoProcessor.getSnapshot(agent.getName(), dataId, group, tenant);
  43. cr.setContent(content);
  44. configFilterChainManager.doFilter(null, cr);
  45. content = cr.getContent();
  46. return content;
  47. }
  48. }

如果成功从服务器段获取到信息后更新本地快照

  1. public class ClientWorker {
  2. // 从服务器端获取配置信息
  3. public String[] getServerConfig(String dataId, String group, String tenant, long readTimeout) throws NacosException {
  4. String[] ct = new String[2];
  5. if (StringUtils.isBlank(group)) {
  6. group = Constants.DEFAULT_GROUP;
  7. }
  8. HttpResult result = null;
  9. try {
  10. List<String> params = new ArrayList<String>(Arrays.asList("dataId", dataId, "group", group, "tenant", tenant));
  11. result = agent.httpGet(Constants.CONFIG_CONTROLLER_PATH, null, params, agent.getEncode(), readTimeout);
  12. } catch (IOException e) {
  13. LOGGER.error(message, e);
  14. throw new NacosException(NacosException.SERVER_ERROR, e);
  15. }
  16. switch (result.code) {
  17. case HttpURLConnection.HTTP_OK:
  18. //更新本地快照
  19. LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, result.content);
  20. ct[0] = result.content;
  21. return ct;
  22. case HttpURLConnection.HTTP_NOT_FOUND:
  23. //更新本地快照
  24. LocalConfigInfoProcessor.saveSnapshot(agent.getName(), dataId, group, tenant, null);
  25. return ct;
  26. ...........................
  27. }
  28. }
  29. }
  • 配置信息发布
  1. public class NacosConfigService implements ConfigService {
  2. /**
  3. * Publish config.
  4. *
  5. * @param dataId dataId
  6. * @param group group
  7. * @param content content
  8. * @return Whether publish
  9. * @throws NacosException NacosException
  10. */
  11. private boolean publishConfigInner(String tenant, String dataId, String group, String tag, String appName, String betaIps, String content) throws NacosException {
  12. //组织参数
  13. ............................
  14. // POST /v1/cs/configs
  15. String url = Constants.CONFIG_CONTROLLER_PATH;
  16. HttpResult result = null;
  17. try {
  18. result = agent.httpPost(url, headers, params, encode, POST_TIMEOUT);
  19. } catch (IOException ioe) {
  20. return false;
  21. }
  22. if (HttpURLConnection.HTTP_OK == result.code) {
  23. return true;
  24. } else if (HttpURLConnection.HTTP_FORBIDDEN == result.code) {
  25. throw new NacosException(result.code, result.content);
  26. } else {
  27. return false;
  28. }
  29. }
  30. }
  • 配置信息监听

    注册监听器,监听某个dataId

    客户端通过长轮询不断获取哪些(dataId)变更列表

    遍历变更的dataId列表依次调用ClientWorker.getServerConfig从服务器端获取最新信息

    回调所有注册监听此dataId的所有监听器
  1. public class NacosConfigService implements ConfigService {
  2. /**
  3. * Add a listener to the configuration, after the server modified the
  4. * configuration, the client will use the incoming listener callback.
  5. * Recommended asynchronous processing, the application can implement the
  6. * getExecutor method in the ManagerListener, provide a thread pool of
  7. * execution. If provided, use the main thread callback, May block other
  8. * configurations or be blocked by other configurations.
  9. *
  10. * @param dataId dataId
  11. * @param group group
  12. * @param listener listener
  13. * @throws NacosException NacosException
  14. */
  15. @Override
  16. public void addListener(String dataId, String group, Listener listener) throws NacosException {
  17. worker.addTenantListeners(dataId, group, Arrays.asList(listener));
  18. }
  19. }
  1. public class ClientWorker {
  2. /**
  3. * groupKey -> cacheData
  4. */
  5. private final AtomicReference<Map<String, CacheData>> cacheMap = new AtomicReference<Map<String, CacheData>>(new HashMap<String, CacheData>());
  6. /**
  7. * dataId对应的所有信息都包装成CacheData缓存到cacheMap中
  8. * 注册监听往CacheData的 private final CopyOnWriteArrayList<ManagerListenerWrap> listeners增加一条记录
  9. */
  10. public void addTenantListeners(String dataId, String group, List<? extends Listener> listeners) throws NacosException {
  11. group = null2defaultGroup(group);
  12. String tenant = agent.getTenant();
  13. CacheData cache = addCacheDataIfAbsent(dataId, group, tenant);
  14. for (Listener listener : listeners) {
  15. cache.addListener(listener);
  16. }
  17. }
  18. }

客户端长轮训获取最新配置信息:

  1. Long-Pulling-Timeout设置nacos服务器端挂起请求的时间。不低于10秒 (Math.max(10000, Long.parseLong(str) - delayTime));
  2. 如果有第一次获取数据的配置则设置 Long-Pulling-Timeout-No-Hangup=true时 nacos服务器发现没有变更的信息也不挂起请求立马返回,

    Long-Pulling-Timeout-No-Hangup != true时 nacos服务器发现没有变更信息则挂起当前请求默认最长30000毫秒或有变更后才返回。
  3. 参数Listening-Configs=probeUpdateString表示监听遍历cacheDatas拼接的订阅
  1. class LongPollingRunnable implements Runnable {
  2. @Override
  3. public void run() {
  4. try {
  5. // check server config
  6. List<String> changedGroupKeys = checkUpdateDataIds(cacheDatas, inInitializingCacheList);
  7. //遍历变更的dataId列表
  8. for (String groupKey : changedGroupKeys) {
  9. try {
  10. //从服务器端获取最新信息
  11. String[] ct = getServerConfig(dataId, group, tenant, 3000L);
  12. CacheData cache = cacheMap.get().get(GroupKey.getKeyTenant(dataId, group, tenant));
  13. cache.setContent(ct[0]);
  14. } catch (NacosException ioe) {
  15. LOGGER.error(message, ioe);
  16. }
  17. }
  18. executorService.execute(this);
  19. } catch (Throwable e) {
  20. executorService.schedule(this, taskPenaltyTime, TimeUnit.MILLISECONDS);
  21. }
  22. }
  23. }

nacos--配置中心之客户端的更多相关文章

  1. Nacos配置中心交互模型是 push 还是 pull ?你应该这么回答

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富- 对于Nacos大家应该都不太陌生,出身阿里名声在外,能做动态服 ...

  2. Spring Cloud 系列之 Alibaba Nacos 配置中心

    Nacos 介绍 Nacos 是 Alibaba 公司推出的开源工具,用于实现分布式系统的服务发现与配置管理.英文全称 Dynamic Naming and Configuration Service ...

  3. Spring Cloud Config、Apollo、Nacos配置中心选型及对比

    Spring Cloud Config.Apollo.Nacos配置中心选型及对比 1.Nacos 1.1 Nacos主要提供以下四大功能 2.Spring Cloud Config 3.Apollo ...

  4. Spring Cloud Alibaba(5)---Nacos(配置中心)

    Nacos(配置中心) 有关Spring Cloud Alibaba之前写过四篇文章,这篇也是在上面项目的基础上进行开发. Spring Cloud Alibaba(1)---入门篇 Spring C ...

  5. nacos配置中心模块详解

    本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star. 配置中心 业务上的配置,功能开关,服务治理上对弱依赖的降级,甚至数据库的密码等,都可能用到动态 ...

  6. SpringBoot使用Nacos配置中心

    本文介绍SpringBoot如何使用阿里巴巴Nacos做配置中心. 1.Nacos简介 Nacos是阿里巴巴集团开源的一个易于使用的平台,专为动态服务发现,配置和服务管理而设计.它可以帮助您轻松构建云 ...

  7. Spring Cloud(十四)Config 配置中心与客户端的使用与详细

    前言 在上一篇 文章 中我们直接用了本应在本文中配置的Config Server,对Config也有了一个基本的认识,即 Spring Cloud Config 是一种用来动态获取Git.SVN.本地 ...

  8. Nacos配置中心

    本文介绍spring cloud 集成 nacos案例 官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html](https://nacos.io/zh ...

  9. Nacos配置中心使用

    在系统开发过程中,开发者通常会将一些需要变更的参数.变量等从代码中分离出来独立管理,以独立的配置文件的形式存在.目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进 ...

  10. 微服务从nacos配置中心获得配置信息

    一,安装nacos, 略 二,创建父工程和微服务工程 service1, service2,以idea为例 1, new -> project -> Maven -> 填写group ...

随机推荐

  1. 手动合并hadoop namenode editlog

    一. 基本概念 1.NN恢复实际上是由fsimage开始(这个相当于数据的base),如果有多个fsimage,会自动选择最大的fsimage,然后按照editlog序列日志开始执行日志 2.seen ...

  2. Linux 下mv和cp命令

    注意事项:mv与cp的结果不同,mv好像文件"搬家",文件个数并未增加.而cp对文件进行复制,文件个数增加了. 一.cp命令 cp命令用来将一个或多个源文件或者目录复制到指定的目的 ...

  3. 使用xshell连不上ubuntu14.04

    判断Ubuntu是否安装了ssh服务: 输入:#ps -e | grep ssh 如果服务已经启动,则可以看到"sshd",否则表示没有安装服务,或没有开机启动,如果不是下图情况, ...

  4. CF-1328 E. Tree Queries

    E. Tree Queries 题目链接 题意 给定一个树,每次询问一组点,问是否存在一条从根到某点的路径,使得该组点到该路径的最短距离不超过1 分析 从根到达某点的路径,如果覆盖到了某个点,那么一定 ...

  5. 基于线段树的RMQ

    RMQ(Range Minimum/Maximum Query)区间最值查询,即给出长度为n的数组A,以及m组询问s.t(s<=t<=n),返回区间[s,t]中的最值. 基于线段树的方法实 ...

  6. Buy the Ticket HDU - 1133 大数dp

    题意: 演唱会门票售票处,那里最开始没有零钱.每一张门票是50元,人们只会拿着100元和50元去买票,有n个人是拿着50元买票,m个人拿着100元去买票. n+m个人按照某个顺序按序买票,如果一个人拿 ...

  7. Cobbler服务引导第三方PE系统

    通过Cobbler服务引导第三方PE系统 1.上传第三方ios到/root/Ushendu_win10.iso并增加菜单项 cobbler distro add --name=Ushendu_win1 ...

  8. 导出Excel的异常处理

    问题: 提示:"类 Range 的 Select 方法无效" 处理方法: 设置当前工作表 this.worksheet.Activate();

  9. 5分钟看懂Code128条形码

    什么是Code128条形码? 相信大家看到这个都不陌生吧 1.前言 条形码种类很多,常见的大概有二十多种码制,其中包括:Code39码(标准39码).Codabar码(库德巴码).Code25码(标准 ...

  10. iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug

    iPhone 12 Pro 屏幕时间设置的密码锁出现弹窗 UI 错位重大 Bug iOS 14.1 Bug 弹窗 UI 非常丑 弹窗屏占太高了 屏幕使用时间 https://support.apple ...