Nacos是什么
Nacos提供了统一配置管理、服务发现与注册。 其中服务注册和发现的功能,相当于dubbo里面使用到
的zookeeper、 或者spring cloud里面应用到的consoul以及eureka。
Nacos的特性
服务发现和服务健康监测
Nacos提供了基于RPC的服务发现,服务提供者可以将自身的服务通过原生API或者openApi来实现服务
的注册,服务消费者可以使用API或者Http来查找和发现服务
同时,Nacos提供了对服务的实时监控检查,当发现服务不可用时,可以实现对服务的动态下线从而阻
止服务消费者向不健康的服务发送请求。
配置管理
传统的配置管理,是基于项目中的配置文件来实现,当出现配置文件变更时需要重新部署,而动态配置
中心可以将配置进行统一的管理,是的配置变得更加灵活以及高效。
动态配置中心可以实现路由规则的动态配置、限流规则的动态配置、动态数据源、开关、动态UI等场景
国内比较有名的开源配置中心: Aollo / diamond / disconf
简述服务配置中心和注册中心
服务注册中心
服务配置中心
Ncos的基本应用
Nacos的下载
首先,我们需要先启动Nacos服务,启动服务有两种方式,一种是直接下载已经编译好的包直接运行。
另一种是通过源码来构建。
从github上下载源码
git clone https://github.com/alibaba/nacos.gitcd nacos/mvn -Prelease-nacos clean install -Uls -al distribution/target/cd distribution/target/nacos-server-$version/nacos/bin
启动服务
linux系统下: sh startup.sh -m standalone
window系统: cmd startup.cmd
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 -ePREFER_HOST_MODE=hostname nacos/nacos-server
访问nacos
http://localhost:8848/nacos
默认的帐号密码是:nacos/nacos
Nacos注册中心实战
创建一个项目
- 创建一个spring-cloud-nacos的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
<properties><java.version>11</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><spring-boot.version>2.3.7.RELEASE</spring-boot.version><spring-cloud-alibaba.version>2.2.2.RELEASE</spring-cloud-alibaba.version></properties><dependencyManagement><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-dependencies</artifactId><version>${spring-boot.version}</version><type>pom</type><scope>import</scope></dependency><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></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.8.1</version><configuration><source>11</source><target>11</target><encoding>UTF-8</encoding></configuration></plugin><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><version>2.3.7.RELEASE</version><configuration><mainClass>com.yehui.springclouddubbosampleconsumer.SpringCloudDubboSampleConsumerApplication</mainClass></configuration><executions><execution><id>repackage</id><goals><goal>repackage</goal></goals></execution></executions></plugin></plugins></build>
修改spring-cloud-dubbo-sample-provider中的pom.xml,增加parent模块的依赖
<parent><artifactId>spring-cloud-nacos</artifactId><groupId>com.yehui</groupId><version>1.0-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.yehui</groupId><artifactId>spring-cloud-dubbo-sample-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency></dependencies>
定义服务接口
在spring-boot-dubbo-sample-api模块中,定义接口
public interface IHelloService {String sayHello();}
实现服务
在spring-boot-dubbo-sample-provider中,实现IHelloService接口
public class HelloServiceImpl implements IHelloService {@Overridepublic String sayHello() {return "hello yehui";}}
添加 @EnableDiscoveryClient注解
@SpringBootApplication@EnableDiscoveryClientpublic class SpringCloudDubboSampleProviderApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudDubboSampleProviderApplication.class, args);}}
配置dubbo服务发布
在服务实现类中添加 @DubboService注解
@DubboServicepublic class HelloServiceImpl implements IHelloService {@Overridepublic String sayHello() {return "hello yehui";}}
配置dubbo提供方信息
bootstrap.properties
# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html# Nacos认证信息spring.cloud.nacos.config.username=nacosspring.cloud.nacos.config.password=nacosspring.cloud.nacos.config.contextPath=/nacos# 设置配置中心服务端地址spring.cloud.nacos.config.server-addr=localhost:8848# Nacos 配置中心的namespace。需要注意,如果使用 public 的 namcespace ,请不要填写这个值,直接留空即可# spring.cloud.nacos.config.namespace=# Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口spring.cloud.nacos.discovery.server-addr=localhost:8848
application.properties
# 应用名称spring.application.name=spring-cloud-dubbo-sample-provider# dubbo 协议dubbo.protocol.id=dubbodubbo.protocol.name=dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)dubbo.protocol.port=-1# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔# 这里订阅"自己",会被忽略掉,请根据实际情况添加dubbo.cloud.subscribed-services=spring-cloud-dubbo-sample-provider# dubbo 服务扫描基准包dubbo.scan.base-packages=com.yehui.springclouddubbosampleprovider# 注册到 nacos 的指定 namespace,默认为 publicspring.cloud.nacos.discovery.namespace=publicserver.port=8001
版本发布
项目的版本号格式为 x.x.x 的形式,其中 x 的数值类型为数字,从 0 开始取值,且不限于 0~9 这个范
围。项目处于孵化器阶段时,第一位版本号固定使用 0,即版本号为 0.x.x 的格式。
由于 Spring Boot 1 和 Spring Boot 2 在 Actuator 模块的接口和注解有很大的变更,且 spring-cloud
commons 从 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
-
构建服务消费者
加jar包依赖
<parent><artifactId>spring-cloud-nacos</artifactId><groupId>com.yehui</groupId><version>1.0-SNAPSHOT</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope><exclusions><exclusion><groupId>org.junit.vintage</groupId><artifactId>junit-vintage-engine</artifactId></exclusion></exclusions></dependency><dependency><groupId>com.yehui</groupId><artifactId>spring-cloud-dubbo-sample-api</artifactId><version>1.0-SNAPSHOT</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency></dependencies>
添加配置文件
bootstrap.properties
spring.application.name=spring-cloud-dubbo-sample-consumerdubbo.application.name=spring-cloud-dubbo-sample-consumerspring.cloud.nacos.discovery.server-addr=localhost:8848server.port=8003
application.properties
# dubbo 协议dubbo.protocol.id=dubbodubbo.protocol.name=dubbo# dubbo 协议端口( -1 表示自增端口,从 20880 开始)dubbo.protocol.port=-1# Dubbo 消费端订阅服务端的应用名,多个服务提供者用逗号分隔# 这里订阅"自己",会被忽略掉,请根据实际情况添加dubbo.cloud.subscribed-services=spring-cloud-dubbo-sample-provider# dubbo 服务扫描基准包dubbo.scan.base-packages=com.yehui.springclouddubbosampleconsumer# Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html# Nacos认证信息spring.cloud.nacos.discovery.username=nacosspring.cloud.nacos.discovery.password=nacos
除应用名称 spring.application.name 存在差异外, spring-cloud-dubbo-client-sample 新增了属性 dubbo.cloud.subscribed-services 的设置。并且该值为服务提供方应用 “spring-cloud-dubbo-sample-provider”。它的主要作用是服务消费方订阅服务提供方的应用名称的列表,若需订阅多应用,使用 “,” 分割。不推荐使用默认值为 “*”,它将订阅所有应用。
编写测试代码
@RestController@EnableDiscoveryClient@SpringBootApplicationpublic class SpringCloudDubboSampleConsumerApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudDubboSampleConsumerApplication.class, args);}@DubboReferenceIHelloService helloService;@GetMapping("/say")public String say(){return helloService.sayHello();}}
Nacos配置中心实战
添加jar包依赖
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency>
bootstrap.properties
需要注意,配置中心的ip,需要放在bootstrap.properties文件中,因为需要保证优先级。
spring.cloud.nacos.config.server-addr=localhost:8848
NacosConfigController
创建一个controller,用来测试从nacos配置中心获取数据的场景
dataId 可以认为是一个配置集,一个系统可以有多个配置集,一般我们可以使用包名来命名,从而很好
的达到数据分类的目的, 测试的话配置的是应用的名称
groupId 配置分组,这个和dataId类似,但是它的纬度更高一些,可能是基于项目层面进行划分
autoRefreshed 自动更新配置
@RefreshScope@RestControllerpublic class NacosConfigController {@Value("${info:hello Nacos}")private String info;@GetMapping("/get")public String get(){return info;}}
测试过程
启动服务,访问http://localhost:8080/get ,浏览器会显示info的默认值,因为这个时候nacos还没有配置info的key进入控制台,增加配置,dataid=spring-cloud-dubbo-sample-consumer,groupid=spring-cloud-dubbo-sample-provider, 并且增加 info = xx的value属性再次刷新url,就可以读取到值的变化
关于Nacos Config配置解释
在 Nacos Spring Cloud 中, dataId 的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
prefix 默认为spring.application.name 的值,也可以通过配置项
spring.cloud.nacos.config.prefix来配置。spring.profiles.active即为当前环境对应的 profifile,详情可以参考 。 注意:当spring.profiles.active为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成${prefix}.${file**-**extension}file-exetension为配置内容的数据格式,可以通过配置项spring.cloud.nacos.config.file-extension来配置。目前只支持 properties 和 yaml 类型。
Spring Boot集成Nacos
通过上面两个案例,我们了解了Nacos作为服务注册中心以及配置中心的基本使用。从使用过程中不难发现,它的整体部署和使用比Spring Cloud Netflix的Config以及Eureka要方便很多。另外,Nacos它是一个独立组件,不一定要集成到Spring Cloud中。有些公司没有采用spring cloud alibaba,而是直接把nacos作为一个独立组件使用也是可以的,再给大家演示一个Spring Boot集成Nacos实现动态配置和服务注册,虽然本质上是一样,但是在配置上会有一些细微的差异。
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>
创建一个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;}}
修改application.properties文件
nacos.config.server-addr=192.168.216.128:8848
Spring Boot集成Nacos实现注册中心
添加jar包依赖
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-discovery-spring-boot-starter</artifactId><version>0.2.7</version></dependency>
创建一个测试类,用户返回当前nacos服务器上注册的服务列表
@RestControllerpublic class ServiceController {@NacosInjectedprivate NamingService namingService;@GetMapping("/discovery")public List<Instance> get(@RequestParam String serviceName) throwsNacosException {return namingService.getAllInstances(serviceName);}@PostMapping("/registry")public void registry() throws NacosException {namingService.registerInstance("example","192.168.1.1",8888,"Test");}
修改aplication.properties文件
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
Nacos的整体架构
Nacos的整体架构还是比较清晰的,我们可以从下面这个官方提供的架构图进行简单分析。
Nacos的集群搭建
在前面的课程讲解过程中,我们部署的Nacos是一个standalone的模式。Nacos是可以支持集群部署
的,我们可以配置三台服务器做一个简单的测试
环境准备
准备三台服务器
192.168.216.128
192.168.216.129
192.168.216.130
下载编译好的包
https://github.com/alibaba/nacos/releases/download/1.3.2/nacos-server-1.3.2.tar.gz
配置数据源
需要注意的是,Nacos默认采用的是一个derby的内置数据库,在实际过程中,不建议使用这种数据
源。建议采用高可用数据库,比如我们使用mysql构建主从。
那我们可以使用mysql作为数据源来进行服务的配置。
导入mysql数据库脚本
修改nacos中application.properties文件内容
#*************** Config Module Related Configurations ***************#### If use MySQL as datasource:spring.datasource.platform=mysql### Count of DB:db.num=1### Connect URL of DB:db.url.0=jdbc:mysql://127.0.0.1:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTCdb.user=nacosdb.password=nacos
启动nacos服务
启动nacos服务之前,需要配置集群
在nacos/conf目录下,有一个cluster.conf配置文件,在这个配置文件中配置这三个节点的ip和端口
192.168.216.128:8848192.168.216.129:8848192.168.216.130:8848
使用如下脚本分别启动这三台服务器
sh startup.sh

