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 {
    @NacosInjected
    private 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"); //ip
        instance.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 {
    @NacosInjected
    private 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() {
    @Override
    public 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() {
            @Override
            public Executor getExecutor() {
                return null;
            }
            @Override
            public 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组件本身并没有提供动态配置管理集成的能力

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Yolov9调用COCOAPI生成APs,APm,APl

最近在做小目标检测的东西&#xff0c;因为后期毕业论文需要&#xff0c;所以开始使用Yolov9模型&#xff0c;运行val.py的时候不会自己产生小目标的AP指标&#xff0c;所以研究了一下&#xff0c;步骤非常简单&#xff1a; 第一步&#xff1a; 在数据集中生成json格式的Annota…

ISCC2024个人挑战赛WP-DLLCode

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

【三维修复、分割与编辑】InFusion、Bootstrap 3D、GaussianGrouping、GaussianEditor等(论文总结)

提示&#xff1a; 文章目录 前言一、InFusion&#xff1a;扩散模型助力&#xff0c;效率提高20倍&#xff01;(2024)1. 摘要2. 算法3. 效果 二、2D Gaussian Splatting三、Bootstrap 3D:从扩散模型引导三维重建1.摘要2.相关工作3.方法1.Boostrapping by Diffusion 通过扩散模型…

搭建访问阿里云百炼大模型环境

最近这波大降价&#xff0c;还有限时免费&#xff0c;还不赶快试试在线大模型&#xff1f;下面整理访问百炼平台的千问模型方法。 创建RAM子账号并授权 创建RAM子账号 1. “访问控制RAM”入口&#xff08;控制台URL&#xff09; 然后点击进入“RAM管理控制台” 2. 添加用户 …

漫谈企业信息化安全-综述

一、前言 一直以来想写一些文章&#xff0c;谈一谈企业信息化过程中的安全问题及对策。 随着信息技术的不断发展和普及&#xff0c;特别是今年来移动办公、云服务等等新的工作模式和新的信息技术的应用&#xff0c;企业信息化已经成为提升竞争力、促进创新和发展的重要途径。…

Spark-RDD-依赖关系详解

Spark概述 Spark-RDD概述 Spark-RDD-依赖关系 在Apache Spark中&#xff0c;RDD&#xff08;Resilient Distributed Dataset&#xff09;是一种基本的抽象数据结构&#xff0c;代表了分布式的、不可变的数据集。 RDD之间的依赖关系在Spark中非常重要&#xff0c;因为它们决定了…

MySQL 存储过程(实验报告)

一、实验名称&#xff1a; 存储过程 二、实验日期&#xff1a; 2024 年5 月 25 日 三、实验目的&#xff1a; 掌握MySQL存储过程的创建及调用&#xff1b; 四、实验用的仪器和材料&#xff1a; 硬件&#xff1a;PC电脑一台&#xff1b; 配置&#xff1a;内存&#xff0…

mysql事务 事务并发问题 隔离级别 以及原理

mysql事务 简介&#xff1a;事务是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&#xff0c;要么同时失败。 事务四大特性 原子性&#xff08;Atomici…

多模态交互式 AI 代理的兴起:探索 Google 的 Astra 和 OpenAI 的 ChatGPT-4o应用

OpenAI的发展 聊天GPT-4o 和 谷歌的阿斯特拉 标志着交互式人工智能代理的新阶段&#xff1a;多模式交互式人工智能代理的兴起。这次旅程开始于 Siri 和 Alexa的&#xff0c;它将语音激活的人工智能带入主流用途&#xff0c;并通过语音命令改变了我们与技术的交互。尽管有影响&a…

链表类型的无界阻塞线程安全队列-ConcurrentLinkedQueue(FIFO)

ConcurrentLinkedQueue是非阻塞线程安全(volatile不能完全保证线程安全)的队列,适用于“高并发”的场景。是一个基于链表节点的无界线程安全队列,按照 FIFO(先进先出,尾先进头先出)原则对元素进行排序。队列元素中不可以放置null元素(内部实现的特殊节点除外)。 volati…

linux笔记6--shell相关

文章目录 1. 查看当前的shell类型2. ps -f命令3. 父子shell4. 分号在命令里的作用问题&#xff1a;环境变量echo&#xff1a; 5. sleep和jobssleep:jobs:例子&#xff1a;&: 6. 外部命令和内建命令图解外部命令type命令 7. history命令8. alias命令9. 推荐 1. 查看当前的sh…

2024年推荐的适合电脑和手机操作的线上兼职副业平台

总是会有人在找寻着线上兼职副业&#xff0c;那么在如今的2024年&#xff0c;互联网提供了诸多方便&#xff0c;无论你是宝妈、大学生、程序员、外卖小哥还是打工族&#xff0c;如果你正在寻找副业机会&#xff0c;那么这篇文章将为你提供一些适合电脑和手机操作的线上兼职副业…

【mysql】更新操作是如何执行的

现有一张表&#xff0c;建表语句如下&#xff1a; mysql> create table T(ID int primary key, c int);如果要将 ID2 这一行的a字段值加 1&#xff0c;SQL语句会这么写&#xff1a; mysql> update T set c c 1 where ID 2;上面这条sql执行时&#xff0c;分析器会通过词…

普通人转行程序员,最大的困难是找不到就业方向

来百度APP畅享高清图片 大家好&#xff0c;这里是程序员晚枫&#xff0c;小破站也叫这个名。 我自己是法学院毕业后&#xff0c;通过2年的努力才转行程序员成功的。[吃瓜R] 我发现对于一个外行来说&#xff0c;找不到一个适合自己的方向&#xff0c;光靠努力在一个新的行业里…

CentOS 7.9部署宝塔面板超详细

CentOS7 部署宝塔面板 Linux的宝塔面板搭建起来非常轻松&#xff0c;也可以用一句话来形容&#xff0c;如果喝水一样简单&#xff0c;只需一条命令剩下的交给时间&#xff0c;几分钟就能部署好&#xff0c;然后就可以直接进行登录&#xff0c;直接可以安装LNMP、LAMP平台&…

Linux VIM指令

三种模式 命令模式&#xff1a;控制屏幕光标的移动&#xff0c;字符、字或行的删除等输入对文件的一些指令 插入模式&#xff1a;对文件内容进行文字输入 底行摸索&#xff1a;文件保存或退出&#xff0c;也可以进行文件替换&#xff0c;找字符串&#xff0c;列出行号等操作…

华为机考入门python3--(30)牛客30-字符串合并处理

分类&#xff1a;字符串、进制转换 知识点&#xff1a; 获取偶数下标的字符 even_chars my_str[::2] 获取奇数下标的字符 odd_chars my_str[1::2]) 翻转字符串 reversed_str my_str[::-1] 二进制转十进制 num int(reversed_binary, 2) 十进制转十六进制 …

Java锁的策略

White graces&#xff1a;个人主页 &#x1f649;专栏推荐:Java入门知识&#x1f649; &#x1f649; 内容推荐:<多线程案例(线程池)>&#x1f649; &#x1f439;今日诗词:"你我推心置腹, 岂能相负"&#x1f439; 目录 锁的策略 乐观锁和悲观锁 轻量级锁…

牛客网刷题 | BC99 正方形图案

目前主要分为三个专栏&#xff0c;后续还会添加&#xff1a; 专栏如下&#xff1a; C语言刷题解析 C语言系列文章 我的成长经历 感谢阅读&#xff01; 初来乍到&#xff0c;如有错误请指出&#xff0c;感谢&#xff01; 描述 KiKi学习了循环&am…