• 什么是Nacos及实战使用教程


    1Nacos是什么

    注册中心配置中心的集合体,Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。

    2 Nacos的特性

    2.1 服务发现和服务健康监测

    Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务的注册,服务消费者可以使用API或者Http来查找和发现服务.

    同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻止服务消费者向不健康的服务发送请求。

    2.2 配置管理

    传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。

    动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景.

    国内比较有名的开源配置中心: Aollo / diamond / disconf

    2Nacos的基本应用

    首先,我们需要先启动Nacos服务,启动服务有两种方式,一种是直接下载已经编译好的包直接运行。另一种是通过源码来构建。
    我们基于源码先来构建,因为目前版本发布比较频繁,所以我们看的时候,它的内容也一直在变化。
    基本上我们只需要简单了解它的应用就行

    2.1 从github上下载源码

    git clone https://github.com/alibaba/nacos.git
    
    cd nacos/
    
    mvn -Prelease-nacos clean install -U
    
    ls -al distribution/target/
    
    cd distribution/target/nacos-server-$version/nacos/bin
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    2.2 启动服务

    linux系统下:

    sh startup.sh -m standalone
    
    • 1

    window系统:

    cmd startup.cmd
    
    • 1

    2.3 docker下启动

    Nacos也可以直接通过docker安装。

    docker run -d --name nacos-server-8848 -p 8848:8848 --privileged=true -v /opt/nacos/init.d/custom.properties:/home/nacos/init.d/custom.properties -v 
    /opt/nacos/logs:/home/nacos/logs --restart=always -e MODE=standalone -e 
    PREFER_HOST_MODE=hostname nacos/nacos-server
    
    • 1
    • 2
    • 3

    2.4 访问nacos

    http://localhost:8848/nacos

    默认的帐号密码是:nacos/nacos

    3 Nacos注册中心实战

    接下来,我们通过一个案例来演示一下spring cloud alibaba下使用nacos实现配置中心以及服务注册的功能。

    3.1 创建一个项目

    创建一个spring-cloud-dubbo-example的maven工程
    分别添加三个模块

    • spring-cloud-dubbo-sample-api
    • spring-cloud-dubbo-sample-provider
    • spring-cloud-dubbo-sample-consumer

    其中后面两个模块都是spring boot的应用。

    修改 spring-cloud-dubbo-sample-provider 这个模块:

    将dependencyManagement部分的依赖移动到parent pom.xml

    spring boot采用2.2.x/ spring cloud alibaba采用2.2.1

    <dependencyManagement> 
    	<dependencies> 
    			<dependency> 
    				<groupId>com.alibaba.cloud</groupId> 
    				<artifactId>spring-cloud-alibaba-dependencies</artifactId> 
    				<version>${spring-cloud-alibaba.version}</version> 
    				<type>pom</type> 
    				<scope>import</scope> 
    			</dependency> 
    			<dependency> 
    			<groupId>org.springframework.boot</groupId> 
    			<artifactId>spring-boot-dependencies</artifactId> 
    			<version>${spring-boot.version}</version> 
    			<type>pom</type> 
    			<scope>import</scope> 
    		</dependency> 
    	</dependencies> 
    </dependencyManagement>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    修改spring-cloud-dubbo-sample-provider中的pom.xml,增加parent模块的依赖:

    <parent> 
    	<groupId>com.gupaoedu.dubbo</groupId> 
    	<artifactId>spring-cloud-dubbo-example</artifactId> 
    	<version>1.0-SNAPSHOT</version> 
    </parent>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    添加maven依赖:

    <dependency> 
    	<groupId>com.alibaba.cloud</groupId> 
    	<artifactId>spring-cloud-starter-dubbo</artifactId> 
    </dependency> 
    <dependency> 
    	<groupId>com.gupaoedu.dubbo</groupId> 
    	<version>1.0-SNAPSHOT</version> 
    	<artifactId>spring-cloud-dubbo-sample-api</artifactId> 
    </dependency> 
    <dependency> 
    	<groupId>com.alibaba.cloud</groupId> 
    	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> 
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    3.2 定义服务接口

    在spring-boot-dubbo-sample-api模块中,定义接口

    public interface IHelloService { 
    	String sayHello(); 
    }
    
    • 1
    • 2
    • 3

    3.3 实现服务

    在spring-boot-dubbo-sample-provider中,实现IHelloService接口

    public class HelloServiceImpl implements IHelloService{
    
    	@Override
    	public String sayHello() { 
    		return "Hello GuPao";
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    添加 @EnableDiscoveryClient 注解

    @EnableDiscoveryClient 
    @SpringBootApplication
    public class SpringCloudDubboSampleProviderApplication {
    	public static void main(String[] args) { 
    		SpringApplication.run(SpringCloudDubboSampleProviderApplication.class,args);
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3.4 配置dubbo服务发布

    在服务实现类中添加 @Service 注解

    @Service 
    public class HelloServiceImpl implements IHelloService{ 
    	@Override 
    	public String sayHello() { 
    		return "Hello GuPao"; 
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    配置dubbo提供方信息

    # dubbo 服务扫描基础包路径 
    dubbo.scan.base-packages=com.gupaoedu.dubbo.springclouddubbosampleprovider 
    dubbo.protocol.id=dubbo 
    # Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称,port 为协议端口( -1 表示自增端 口,从 20880 开始) 
    dubbo.protocol.name=dubbo 
    dubbo.protocol.port=-1 
    
    spring.cloud.nacos.discovery.server-addr=192.168.216.128:8848
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    dubbo.scan.base-packages : 指定 Dubbo 服务实现类的扫描基准包
    dubbo.protocol : Dubbo 服务暴露的协议配置,其中子属性 name 为协议名称, port 为协议端口( -1 表示自增端口,从 20880 开始)
    dubbo.registry : Dubbo 服务注册中心配置,其中子属性 address 的值 “springcloud://localhost”,说明挂载到 Spring Cloud 注册中心
    spring.cloud.nacos.discovery : Nacos 服务发现与注册配置,其中子属性 server-addr指定 Nacos 服务器主机和端口

    3.5 版本规范

    项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。
    由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloudcommons 从 1.x.x 版本升级到 2.0.0 版本也有较大的变更,因此我们采取跟 SpringBoot 版本号一致的版本:

    • 1.5.x 版本适用于 Spring Boot 1.5.x
    • 2.0.x 版本适用于 Spring Boot 2.0.x
    • 2.1.x 版本适用于 Spring Boot 2.1.x
    • 2.2.x 版本适用于 Spring Boot 2.2.x

    3.6 构建服务消费者

    添加jar包依赖

    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-dubbo</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-actuator</artifactId>
    </dependency>
    <dependency>
    	<groupId>com.gupaoedu.dubbo</groupId>
    	<version>1.0-SNAPSHOT</version>
    	<artifactId>spring-cloud-dubbo-sample-api</artifactId>
    </dependency>
    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
    </dependency>
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    添加配置文件:

    spring.application.name=spring-cloud-dubbo-sample-consumer 
    dubbo.application.name=spring-cloud-dubbo-sample-consumer
    
    dubbo.cloud.subscribed-services=spring-cloud-dubbo-sample-provider 
    spring.cloud.nacos.discovery.server-addr=192.168.216.128:8848
    
    • 1
    • 2
    • 3
    • 4
    • 5

    除应用名称 spring.application.name 存在差异外, spring-cloud-dubbo-client-sample 新增了属性 dubbo.cloud.subscribed-services 的设置。并且该值为服务提供方应用 “spring- cloud-dubbo-sample-provider”。
    它的主要作用是服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。不推荐使用默认值为 “*”,它将订阅所有应用。

    编写测试代码

    
    @RestController 
    @EnableDiscoveryClient 
    @SpringBootApplication
    public class SpringCloudDubboSampleConsumerApplication {
    	public static void main(String[] args) {
    		SpringApplication.run(SpringCloudDubboSampleConsumerApplication.class, args);
    	}
    	@Reference
    	IHelloService helloService;
    	@GetMapping("/say") 
    	public String say(){
    		return helloService.sayHello();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    4 Nacos配置中心实战

    在Nacos中,实现动态配置管理,相对于Spring Cloud中的Config来说,友好太多了,先给大家简单演示一下

    4.1 添加jar包依赖

    <dependency>
    	<groupId>com.alibaba.cloud</groupId>
    	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
    	<version>2.2.1.RELEASE</version>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    4.2 bootstrap.properties

    需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。

    
    spring.cloud.nacos.config.server-addr=192.168.216.128:8848
    
    • 1
    • 2

    4.3 NacosConfigController

    创建一个controller,用来测试从nacos配置中心获取数据的场景

    dataId 可以认为是一个配置集,一个系统可以有多个配置集,一般我们可以使用包名来命名,从而很好的达到数据分类的目的。

    groupId 配置分组,这个和dataId类似,但是它的纬度更高一些,可能是基于项目层面进行划分。

    autoRefreshed 自动更新配置。

    
    @RefreshScope 
    @RestController
    public class NacosController {
    
    	@Value("${info:hello Nacos}") 
    	private String info;
    
    	@GetMapping("/get") 
    	public String get(){
    		return info;
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

    4.4 测试过程

    • 启动服务,访问http://localhost:8080/get ,浏览器会显示info的默认值,因为这个时候nacos还没有配置info的key

    • 进入控制台,增加配置,dataid=example,groupid=spring-cloud-dubbo-sample-provider, 并且增加 info = xx的value属性

    • 再次刷新url,就可以读取到值的变化

    5 Spring Boot集成Nacos

    通过上面两个案例,我们了解了Nacos作为服务注册中心以及配置中心的基本使用。

    从使用过程中不难发现,它的整体部署和使用比Spring Cloud Netflix的Config以及Eureka要方便很多。

    另外,Nacos它是一个独立组件,不一定要集成到Spring Cloud中。有些公司没有采用springcloud alibaba,而是直接把nacos作为一个独立组件使用也是可以的,再给大家演示一个Spring Boot集成Nacos实现动态配置和服务注册,虽然本质上是一样,但是在配置上会有一些细微的差异。

    5.1 Spring Boot集成Nacos实现动态配置

    创建spring boot应用
    添加nacos配置中心的依赖

    <dependency> 
    	<groupId>com.alibaba.boot</groupId> 
    	<artifactId>nacos-config-spring-boot-starter</artifactId> 
    	<version>0.2.7</version> 
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建一个controller作为测试

    @RestController 
    @NacosPropertySource(dataId = "spring-cloud-dubbo-sample- provider",autoRefreshed = true) 
    public class TestController { 
    
    	@NacosValue(value = "${info:defailt value}",autoRefreshed = true) 
    	private String info; 
    	
    	@GetMapping("/get") public String get(){ 
    		return info; 
    	} 
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    修改application.properties文件

    nacos.config.server-addr=192.168.216.128:8848
    
    • 1

    5.2 Spring Boot集成Nacos实现注册中心

    添加jar包依赖

    <dependency> 
    	<groupId>com.alibaba.boot</groupId> 
    	<artifactId>nacos-discovery-spring-boot-starter</artifactId> 
    	<version>0.2.7</version> 
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    创建一个测试类,用户返回当前nacos服务器上注册的服务列表:

    @RestController 
    public class ServiceController { 
    	@NacosInjected 
    	private NamingService namingService; 
    	
    	@GetMapping("/discovery") 
    	public List<Instance> get(@RequestParam String serviceName) throws NacosException { 
    		return namingService.getAllInstances(serviceName); 
    	}
    	
    	@PostMapping("/registry") 
    	public void registry() throws NacosException { 	
    		namingService.registerInstance("example","192.168.1.1",8888,"Test"); 
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    修改application.properties文件:

    nacos.discovery.server-addr=192.168.216.128:8848
    
    • 1
    • 先调用registry这个接口,向nacos注册服务
    • 再访问 http://localhost:8080/discovery?serviceName=example 获取指定服务的实例信息
    • 也可以通过直接调用nacos server的服务注册接口进行服务注册
    • http://127.0.0.1:8848/nacos/v1/ns/instance? serviceName=example&ip=127.0.0.1&port=8080

    6 Nacos的整体架构

    Nacos的整体架构还是比较清晰的,看下面这个官方提供的架构图就可以了。
    在这里插入图片描述

  • 相关阅读:
    https协议
    2022-09-12 Yacc: Yet Another Compiler-Compiler
    Sentinel控制台1.8.3修改源码,修改配置后推送到Nacos
    YoloV7改进策略:独家原创,全网首发,复现Drone-Yolo,以及改进方法
    es实操笔记
    2024年保安员证考试题库
    51单片机DHT11温湿度控制系统仿真设计( proteus仿真+程序+原理图+报告+讲解视频)
    我司何晓磊受邀在“科创中国”做”创新”课程分享
    快照和镜像
    Hive基础知识(十七):Hive-SQL分桶表使用
  • 原文地址:https://blog.csdn.net/weixin_44688973/article/details/125879950