什么是Nacos及实战使用教程

2022-12-02 10:50:21 浏览数 (1)

文章目录

  • 1Nacos是什么
  • 2 Nacos的特性
    • 2.1 服务发现和服务健康监测
    • 2.2 配置管理
  • 2Nacos的基本应用
    • 2.1 从github上下载源码
    • 2.2 启动服务
    • 2.3 docker下启动
    • 2.4 访问nacos
  • 3 Nacos注册中心实战
    • 3.1 创建一个项目
    • 3.2 定义服务接口
    • 3.3 实现服务
    • 3.4 配置dubbo服务发布
    • 3.5 版本规范
    • 3.6 构建服务消费者
  • 4 Nacos配置中心实战
    • 4.1 添加jar包依赖
    • 4.2 bootstrap.properties
    • 4.3 NacosConfigController
    • 4.4 测试过程
  • 5 Spring Boot集成Nacos
    • 5.1 Spring Boot集成Nacos实现动态配置
    • 5.2 Spring Boot集成Nacos实现注册中心
  • 6 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上下载源码

代码语言:javascript复制
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

2.2 启动服务

linux系统下:

代码语言:javascript复制
sh startup.sh -m standalone

window系统:

代码语言:javascript复制
cmd startup.cmd

2.3 docker下启动

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

代码语言:javascript复制
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

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

代码语言:javascript复制
<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>

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

代码语言:javascript复制
<parent> 
	<groupId>com.gupaoedu.dubbo</groupId> 
	<artifactId>spring-cloud-dubbo-example</artifactId> 
	<version>1.0-SNAPSHOT</version> 
</parent>

添加maven依赖:

代码语言:javascript复制
<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>

3.2 定义服务接口

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

代码语言:javascript复制
public interface IHelloService { 
	String sayHello(); 
}

3.3 实现服务

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

代码语言:javascript复制
public class HelloServiceImpl implements IHelloService{

	@Override
	public String sayHello() { 
		return "Hello GuPao";
	}
}

添加 @EnableDiscoveryClient 注解

代码语言:javascript复制
@EnableDiscoveryClient 
@SpringBootApplication
public class SpringCloudDubboSampleProviderApplication {
	public static void main(String[] args) { 
		SpringApplication.run(SpringCloudDubboSampleProviderApplication.class,args);
	}
}

3.4 配置dubbo服务发布

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

代码语言:javascript复制
@Service 
public class HelloServiceImpl implements IHelloService{ 
	@Override 
	public String sayHello() { 
		return "Hello GuPao"; 
	} 
}

配置dubbo提供方信息

代码语言:javascript复制
# 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

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包依赖

代码语言:javascript复制
<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>

添加配置文件:

代码语言:javascript复制
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

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

编写测试代码

代码语言:javascript复制
@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();
	}
}

4 Nacos配置中心实战

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

4.1 添加jar包依赖

代码语言:javascript复制
<dependency>
	<groupId>com.alibaba.cloud</groupId>
	<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
	<version>2.2.1.RELEASE</version>
</dependency>

4.2 bootstrap.properties

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

代码语言:javascript复制
spring.cloud.nacos.config.server-addr=192.168.216.128:8848

4.3 NacosConfigController

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

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

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

autoRefreshed 自动更新配置。

代码语言:javascript复制
@RefreshScope 
@RestController
public class NacosController {

	@Value("${info:hello Nacos}") 
	private String info;

	@GetMapping("/get") 
	public String get(){
		return info;
	}
}

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配置中心的依赖

代码语言:javascript复制
<dependency> 
	<groupId>com.alibaba.boot</groupId> 
	<artifactId>nacos-config-spring-boot-starter</artifactId> 
	<version>0.2.7</version> 
</dependency>

创建一个controller作为测试

代码语言:javascript复制
@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; 
	} 
}

修改application.properties文件

代码语言:javascript复制
nacos.config.server-addr=192.168.216.128:8848

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

添加jar包依赖

代码语言:javascript复制
<dependency> 
	<groupId>com.alibaba.boot</groupId> 
	<artifactId>nacos-discovery-spring-boot-starter</artifactId> 
	<version>0.2.7</version> 
</dependency>

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

代码语言:javascript复制
@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"); 
	}
}

修改application.properties文件:

代码语言:javascript复制
nacos.discovery.server-addr=192.168.216.128:8848
  • 先调用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的整体架构还是比较清晰的,看下面这个官方提供的架构图就可以了。

0 人点赞