Dubbo生态之nacos

1.Nacos简介

在博客Dubbo生态之初识dubbo协议-CSDN博客种我们已经介绍了为什么要使用注册中心,nacos作为注册中心的一种,相对于其它的主流注册中心有什么区别呢?

NacosEurekaZookeeper
数据存储存储在内存存储在内存存储在内存
通信协议gRPChttpjute协议
数据变更推送方式push+pullpull(30s)push
CAP模型AP/CP默认APAPCP

Nacos的整体架构

 从架构图种,我们可以很清晰的看到,nacos提供了两个很核心的服务

  • Config Service 配置中心
  • Naming Service 命名服务,也就是服务注册与发现

再接着就是Nacos Core也就是Nacos的核心实现部分。最底层是Consistency Protocol,数据一致性协议,用来实现Nacos集群数据同步。

对外,是使用http协议,提供OpenAPI,客户端程序可以通过该API来完成数据的交互和处理。

2. Nacos作为注册中心的使用

nacos作为注册中心的使用,就至少要提供下面的这些接口

服务注册接口,应用程序启动以后把服务地址注册保存到注册中心
服务地址获取接口,获取指定服务的所有地址信息
服务地址变更监听接口,实现服务变更的动态监听

2.1 服务注册接口和使用

void registerInstance(String serviceName, String ip, int port) throws NacosException;void registerInstance(String serviceName, String ip, int port, String clusterName) throws NacosException;void registerInstance(String serviceName, Instance instance) throws NacosException;
  •  serviceName :  表示服务名称
  • ip: 表示服务实例的ip地址
  • port: 服务实例的端口
  • clusterName: 集群名
  • instance: 实例属性

下面演示以下Spring Boot集成Nacos实现服务注册的Demo

a. 引入Nacos依赖包

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>

 b.配置Nacos的服务地址

nacos.discovery.server-addr=192.168.8.133:8848

 c.编写Controller接口

@RestController
public class NacosController {@NacosInjectedprivate NamingService namingService;@GetMapping("/registry")public void registry() throws NacosException {Instance instance=new Instance();instance.setClusterName("Test1"); //集群名字instance.setEnabled(true); //是否启用//临时节点/持久节点, 临时节点是AP模式(采用distro算法),持久节点是CP(采用raft算法)instance.setEphemeral(true);instance.setHealthy(true); //健康状态instance.setIp("192.168.216.112"); //ipinstance.setPort(8080); //端口instance.setWeight(4.0); //权重 取值范围 1 到 100,数值越大,权重越大namingService.registerInstance("example",instance);}
}

 注册成功以后,就可以在nacos的控制台看到注册上去的服务信息。

2.2 服务实例查找

当客户端需要获取目标服务的全部实例时,可以通过以下api来完成,它会返回执行服务名字或者指定集群列表中的所有实例。

List<Instance> getAllInstances(String serviceName) throws NacosException;
List<Instance> getAllInstances(String serviceName, List<String> clusters) throws NacosException;

演示代码如下,增加下面的接口,根据指定服务名称获取实例列表

@RestController
public class NacosController {@NacosInjectedprivate NamingService namingService;@GetMapping("/discovery")public List<Instance> get(@RequestParam String serviceName) throws NacosException {return namingService.getAllInstances(serviceName);}
}

2.3 服务事件订阅

当服务提供者出现服务扩容和缩容时,服务消费者需要感知到服务地址的变化,可以通过监听服务来动态感知到服务的变化

void subscribe(String serviceName, EventListener listener) throws NacosException;
void subscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;

 其中,listen表示的是服务监听的事件回调

Nacos还提供了取消监听的接口

void unsubscribe(String serviceName, EventListener listener) throws NacosException;
void unsubscribe(String serviceName, List<String> clusters, EventListener listener) throws NacosException;

 增加如下接口,用来注册订阅事件,当我们调用registry发起注册,或者在nacos控制台对服务下线的时候,都会触发事件通知。

@GetMapping("/sub")
public void subscribe(@RequestParam String serviceName) throws NacosException {namingService.subscribe(serviceName, new EventListener() {@Overridepublic void onEvent(Event event) {NamingEvent namingEvent=(NamingEvent)event;System.out.println("收到事件:"+namingEvent.getServiceName());}});
}

2.4 namespace和group

在nacos中还提供了namespace和group命名空间和分组的机制

namespace可以解决多环境以及多租户数据的隔离问题。比如在多套环境下,可以根据指定环境创建不同的namespace,实现多环境隔离。或者在多租户的场景中,每个用户可以维护自己的namespace,实现每个用户的配置数据和注册数据的隔离。
group是分组机制,它的纬度是实现服务注册信息或者DataId的分组管理机制,对于group的用法,没有固定的规则,它也可以实现不同环境下的分组,也可以实现同一个应用下不同配置类型或者不同业务类型的分组。

 官方的建议是,namespace用来区分不同环境,group可以专注在业务层面的数据分组。实际上在使用过程中,最重要的是提前定好统一的口径和规定,避免不同的项目团队混用导致后期维护混乱的问题。

Nacos中的namespace和group关系如下图所示,其中namespace默认是public,Group默认是DEFAULT_GROUP

 namespace和group也可以自定义

自定义namespace

name用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。

在没有明确指定配置的情况下,默认使用的是nacos上public这个namespace

如果需要使用自定义的命名空间,可以通过以下配置来实现:

 a.在nacos-console中创建两个命名空间,分别是

b.修改dubbo相关配置项目

dubbo.registries.nacosregistry.address=nacos://192.168.8.133:8848?
namespace=47201fb3-2b45-4199-87c5-298a748c9385

 或者

dubbo.registry.parameters.namespace=5cbb70a5-xxx-xxx-xxxd43479ae0932

 自定义Group

在没有明确指定配置的情况下,默认使用的是DEFAULT_GROUP。如果需要自定以自己的Group,可以通过以下配置来实现

dubbo.registries.nacosregistry.address=nacos://192.168.8.133:8848?
namespace=47201fb3-2b45-4199-87c5-298a748c9385&group=example

 或者

dubbo.registry.parameters.group=example

3. Nacos作为配置中心的使用

nacos作为配置中心,其存储方式就是k-v的形式,在服务启动的时候,会从远程服务器获取配置

nacos作为配置中心,支持服务端的配置存储、配置的CRUD、配置的动态感知

dubbo本身并没有集成nacos作为配置中心,其实质是springboot集成的。

nacos也会跟注册中心一样提供配置管理相关的API来完成功能的实现

  • 从远程服务器上获取配置
  • 服务器上配置变更后的通知

3.1 从服务器获取配置

用于服务启动的时候从Nacos获取配置

public String getConfig(String dataId, String group, long timeoutMs) throws NacosException
参数名参数类型描述
dataIdstring
配置 ID,采用类似 package.class(如
com.taobao.tc.refund.log.level)的命名规则保
证全局唯一性,class 部分建议是配置的业务含
义。全部字符小写。只允许英文字符和 4 种特
殊字符("."、":"、"-"、"_"),不超过 256 字
节。
groupstring
配置分组,建议填写产品名:模块名
(Nacos:Test)保证唯一性,只允许英文字符和
4种特殊字符("."、":"、"-"、"_"),不超过128
字节。
timeoutlong
读取配置超时时间,单位 ms,推荐值 3000

 案例演示:

a. 引入jar包依赖

<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-client</artifactId><version>2.1.1</version>
</dependency>
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-api</artifactId><version>2.1.1</version>
</dependency>
<dependency><groupId>com.alibaba.nacos</groupId><artifactId>nacos-common</artifactId><version>2.1.1</version>
</dependency>

编写配置获取代码

public class NacosExample {public static void main(String[] args) {String serverAddr="192.168.8.133:8848";String dataId="example";String groupId="DEFAULT_GROUP";Properties properties=new Properties();properties.put("serverAddr",serverAddr);try {//通过nacosfactory创建一个配置中心的服务ConfigService configService=NacosFactory.createConfigService(properties);// 5000表示读取配置的超时时间,如果超时或者出现网络故障,会抛出NacosException的异常String content=configService.getConfig(dataId,groupId,3000);System.out.println(content);} catch (NacosException e) {e.printStackTrace();}}
}

 上述代码的含义是:

  • 使用nacosFactory构建ConfigService
  • 通过getConfig来获得配置,查询指定groupid下对应的dataid这个数据

3.2 配置变更订阅

如果希望nacos推送配置变更,可以使用nacos动态监听配置接口来实现

public void addListener(String dataId, String group, Listener listener)

listener 代表是监听器,配置变更进入监听器的回调函数

演示代码如下:

 

public class NacosMain {public static void main(String[] args) {String serverAddr="192.168.8.133:8848";String dataId="example";String groupId="DEFAULT_GROUP";Properties properties=new Properties();properties.put("serverAddr",serverAddr);try {//通过nacosfactory创建一个配置中心的服务ConfigService configService=NacosFactory.createConfigService(properties);// 5000表示读取配置的超时时间,如果超时或者出现网络故障,会抛出NacosException的异常String content=configService.getConfig(dataId,groupId,3000);configService.addListener(dataId, groupId, new Listener() {@Overridepublic Executor getExecutor() {return null;}@Overridepublic void receiveConfigInfo(String s) {System.out.println("收到配置变更通知:"+s);}});System.out.println(content);System.in.read(); //保证程序不执行结束}catch (NacosException | IOException e) {e.printStackTrace();}}
}

4.Springboot集成Nocos实现动态配置

springboot集成nacos实现动态配置获取的演示案例:

a.添加jar包依赖

<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.12</version>
</dependency>

b.编写测试案例

@NacosPropertySource(dataId="example",autoRefreshed = true)
@SpringBootApplication
public class NacosDemoApplication {public static void main(String[] args) {SpringApplication.run(NacosDemoApplication.class, args);}
}

使用@NacosroperSource加载dataId为example的配置源,并开启自动更新

c.增加一个controller作为测试

@RestController
public class NacosController {@NacosValue(value = "${txt:default-msg}",autoRefreshed =true)private String txt;@GetMapping("/")public String get(){return txt;}
}

 @NacosValue注解,表示它在启动时会从Nacos-Server中获取配置项。

d.修改application.properties文件,增加nacos-server的服务端连接配置

nacos.config.server-addr = 192.168.8.133 : 8848

e.启动Springboot项目,并访问上述创建的controller接口,此时打印的消息就是在nacos上配置的,应该时default-msg

接着,我们在Nacos-server上添加一个配置,配置项目如下

txt=Hello, this Msg is from Nacos Server

f.再次访问上述接口,就可以看到加载的信息已经发生了变化。 

总结:

nacos集成dubbo做动态配置管理,其实本质上就是Spring boor集成nacos.

只是多了一个Dubbo作为RPC服务通信,其实相当于就是Springboot这个生态下集成dubbo以及其它各个组件来实现微服务架构下的服务治理需求

真正来说,DUBBO组件本身并没有提供动态配置管理集成的能力

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/15997.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

R实验 非参数性检验(二)

实验目的&#xff1a; 了解符号检验&#xff0c;掌握Wilcoxon符号秩检验&#xff0c;Wilcoxon秩和检验&#xff1b; 掌握Pearson拟合优度c2检验&#xff0c;Shapiro-Wilk 正态性检验&#xff0c;了解Kolmogorov-Smirnov单样本和双样本检验&#xff09;&#xff1b; 实验内容&…

06. Redis 主从复制

文章目录 概念主从复制主从复制的作用 环境配置总结复制原理 宕机后手动配置主机 概念 主从复制 是指将一台 Redis 服务器的数据复制到其他的 Redis 服务器&#xff1a; 前者称为主节点&#xff08;master/leader&#xff09;&#xff0c;后者成为从节点&#xff08;slave/f…

[数组查找]1.图解线性查找及其代码实现

线性查找 线性查找是一种在数组中查找数据的算法。与二分查找不同&#xff0c;即便数据没有按顺序存储&#xff0c;也可以应用线性查找。线性查找的操作很简单&#xff0c;只要在数组中从头开始依次往下查找即可。虽然存储的数据类型没有限制&#xff0c;但为了便于理解&#x…

windows 下nginx常用命令

1、启动&#xff0c;目录cmd&#xff0c;后 start nginx.exe 2.重新加载 nginx -s reload 3.查看状态 tasklist /fi “imagename eq nginx.exe” 4.关闭 nginx -s quit

头晕、心悸…你们小年轻配不上张俊杰的霸王茶姬,还要奔上市

近日&#xff0c;有多名网友在社交平台反映称&#xff0c;自己在喝了霸王茶姬的新品“万里木兰”奶茶后&#xff0c;出现了失眠、头晕、心悸等不同程度的不适症状&#xff0c;霸王茶姬方面则表示“可能是茶多酚过敏”。 而就在几天前举行的“2024年国际茶日现代东方茶创新论坛…

java —— 连接 MySQL 操作

MySQL 是独立于 java 之外的数据库&#xff0c;二者之间建立连接需要提前引入 mysql-connector-java 的 jar 包。 一、引入方法&#xff1a; ① 在项目中新建一个 Folder&#xff08;即文件夹&#xff09;&#xff0c;该文件夹通常命名为 lib&#xff0c;意思是存放项目所依赖…

揭秘 淘宝死店采集私信筛选,号称日赚500+

淘宝死店采集工具为电子商务创业者揭示了一个领域的新机遇&#xff0c;通过提供一系列深入分析和资源挖掘的功能&#xff0c;展现了从失败中寻找成功之道的独特方法论。以下是如何通过这种工具寻找电商平台中的隐含机会的几个关键方面&#xff1a; 分析失败的深层原因&#x…

一文搞懂 Transformer(总体架构 三种注意力层)

本文将从Transformer的本质、Transformer_的原理_、_Transformer的应用__三个方面&#xff0c;带您一文搞懂Transformer&#xff08;总体架构 & 三种注意力层&#xff09;。 节前&#xff0c;我们组织了一场算法岗技术&面试讨论会&#xff0c;邀请了一些互联网大厂朋友…

ISCC2024个人挑战赛WP-DLLCode

&#xff08;非官方解&#xff0c;以下内容均互联网收集的信息和个人思路&#xff0c;仅供学习参考&#xff09; 注意到程序调用了Encode函数对明文进行加密&#xff0c;点进去发现是对外部DLL的调用 静态分析DLL中的Encode函数可以得到 写出对应的解密脚本如下 #include <…

Ollama| 搭建本地大模型,最简单的方法!效果直逼GPT

很多人想在本地电脑上搭建一个大模型聊天机器人。总是觉得离自己有点远&#xff0c;尤其是对ai没有了解的童鞋。那么今天我要和你推荐ollama&#xff0c;无论你是否懂开发&#xff0c;哪怕是零基础&#xff0c;只需十分钟&#xff0c;Ollama工具就可以帮助我们在本地电脑上搭建…

2024/5/26周报

文章目录 摘要Abstract文献阅读题目创新点方法网络架构LSTM 实验过程Data acquisitionData preprocessingAlgorithm parameter settingsModels evaluation Performances of different models in indoor air temperature prediction 深度学习ARIMA一、ARIMA模型的基本思想二、AR…

遇见问题-VMware虚拟机打开运行一段时间后卡死

1.问题原因 因为Windows自带的虚拟化软件Hyper-V与VMware存在冲突。 2.关闭Hyper-V 1.打开【控制面板】-【程序和功能】-【启用或关闭Windows功能】3.关闭HV主机服务 1.右击计算机-》管理-》服务和应用名称-》服务-》找到HV主机服务-》右击属性停止服务 -》启动类型设置为禁…

英语四级翻译练习笔记①——大学英语四级考试2023年12月真题(第一套)——用ChatGPT修改训练四级翻译

目录 引言&#xff08;必看&#xff09; 翻译原文 我的翻译 得分&#xff08;1-3分&#xff09; 原文&#xff1a; 你的翻译&#xff1a; 修改后的翻译&#xff1a; 详细错误讲解&#xff1a; 引言&#xff08;必看&#xff09; 这是一篇英语四级翻译的练习的专栏&…

想转行程序员的朋友,有什么想问的在评论区随便问,我知道的都告诉你。

你想转行程序员吗&#xff1f; 我自己是法学院毕业后&#xff0c;通过2年的努力才转行程序员成功的。 我发现对于一个外行来说&#xff0c;找不到一个适合自己的方向&#xff0c;光靠努力在一个新的行业里成功异常艰难。即使你非常努力&#xff0c;但方向错了也会做大量的无用…

Java控制台实现斗地主的洗牌和发牌功能

一、题目要求 有3个玩家&#xff1a;A&#xff0c;B&#xff0c;C。底牌有三张牌&#xff0c;每个人共17张牌&#xff0c;共&#xff08;17*3354&#xff09;张牌&#xff0c;实现洗牌与发牌&#xff0c;只在控制没有实现UI可视化。 二、思路 1、用List集合存储所有的扑克牌。…

【INTEL(ALTERA)】为什么 F-Tile Serial Lite IV 工具包在链路初始化期间无法启用内部串行环回?

说明 F-Tile Serial Lite IV 工具包存在一个问题&#xff0c;即内部串行环回启用失败&#xff0c;并在执行链路初始化时输出不正确的寄存器值。这是因为我们在内部更改为 demo_jtag 在系统重置过程中检查 tx_pll_locked 和 rx_cdr_locked 状态。但完成后没有把它改回 phy_jtag…

day12

第一题 本题我们可以使用以下方法&#xff1a; 方法一&#xff1a; 使用hash表<元素&#xff0c;出现次数>来统计字符串中不同元素分别出现的次数&#xff0c;当某一个元素的次数大于1时&#xff0c;返回false&#xff0c;如果每个元素的出现次数都为1&#xff0c;则返回…

【线程的互斥】

线程的互斥 临界区资源多个线程的运行多个线程对同一资源的竞争原子性保持线程之间地互斥互斥量(锁的原理)为什么是原子的 正确使用锁 临界区资源 进程创建线程&#xff0c;是共享内存的&#xff0c;可以对共享的资源有很方便的操作&#xff0c;当一些共享资源可以被多个线程进…

【vue-2】v-on、v-show、v-if及按键修饰符

目录 1、v-on事件 2、按键修饰符 3、显示和隐藏v-show 4、条件渲染v-if 1、v-on事件 创建button按钮有以下两种方式&#xff1a; <button v-on:click"edit">修改</button> <button click"edit">修改</button> 完整示例代码…

Docker in Docker 原理与实战

一、引言 随着容器化技术的普及&#xff0c;Docker 作为一种主流的容器管理工具&#xff0c;已被广泛应用于开发、测试及生产环境中。Docker 的灵活性和便捷性使得它成为 DevOps 流程中不可或缺的一部分。然而&#xff0c;在一些复杂的应用场景中&#xff0c;我们可能需要在一…