Nacos是阿里巴巴2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务注册与发现、配置管理和服务管理平台;Nacos致力于快速实现动态服务注册与发现、服务配置、服务元数据及流量管理;
Nacos是spring cloud alibaba下的一个组件:
Nacos约等于spring cloud eureka(注册中心) + spring cloud config(配置中心)
1、下载Nacos最新的二进制压缩包;
下载地址:https://github.com/alibaba/nacos/releases
2、在服务器上解压下载下来的nacos最新的二进制压缩包;
tar -zxvf nacos-server-1.3.1.tar.gz
cd nacos/bin
3、启动Nacosserver并且查看logger日志
./startup.sh -m standalone
tail -f ../logs/nacos.log
注意:单机环境启动nacos必须带-m standalone参数启动,否则无法启动
nacos客户端访问地址:http://47.110.237.194:8801/nacos
默认用户名密码:nacos/nacos
Spring Cloud Alibaba Nacos Discovery服务注册发现
微服务开发是controller调用controller,调用者是服务消费者,被调用者是服务提供者,服务消费者和服务提供者是相对的概念,服务消费者也可以被另一个服务调用,那么此时的服务消费者也是一个服务提供者。
如果消费者已经调用过提供者,此时nacos宕机的话 并不影响消费者调用提供者(利用ribbon缓存到private final Map
作为注册中心所需要的核心POM依赖:
.version>1.8</java.version>
.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
-boot.version>2.3.0.RELEASE</spring-boot.version>
-cloud-alibaba.version>2.2.1.RELEASE</spring-cloud-alibaba.version>
</properties>
<!--spring boot web依赖-->
org.springframework.boot</groupId>
spring-boot-starter-web</artifactId>
</dependency>
<!--spring-cloud-alibaba nacos服务注册/发现的依赖-->
com.alibaba.cloud</groupId>
spring-cloud-starter-alibaba-nacos-discovery</artifactId>
2.2.1.RELEASE</version>
</dependency>
<!--spring-boot-starter-actuator监控接口-->
org.springframework.boot</groupId>
spring-boot-starter-actuator</artifactId>
</dependency>
<!--lomboc注解-->
org.projectlombok</groupId>
lombok</artifactId>
</dependency>
</dependencies>
<!-- spring-cloud-alibaba-dependencies父版本控制 -->
com.alibaba.cloud</groupId>
spring-cloud-alibaba-dependencies</artifactId>
${spring-cloud-alibaba.version}</version>
<type>pom</type>
import</scope>
</dependency>
<!-- spring-cloud-dependencies父版本控制 -->
org.springframework.cloud</groupId>
spring-cloud-dependencies</artifactId>
Hoxton.SR3</version>
<type>pom</type>
import</scope>
</dependency>
<!-- spring-boot-dependencies父版本控制 -->
org.springframework.boot</groupId>
spring-boot-dependencies</artifactId>
${spring-boot.version}</version>
<type>pom</type>
import</scope>
</dependency>
</dependencies>
</dependencyManagement>
在application.properties(或application.yaml) 配置文件中配置 NacosServer地址;
#内嵌tomcat
server.port=8082
#服务名称
spring.application.name=29-nacos-discovery-customer
##注册中心地址
spring.cloud.nacos.discovery.server-addr=http://47.110.237.194:8848
#nacos账户密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
#spring boot actuator功能
management.endpoints.jmx.exposure.include=*
management.endpoints.web.exposure.include=*
management.endpoint.health.show-details=always
服务提供者使用 @EnableDiscoveryClient 注解开启服务注册与发现功能;
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册与发现
public class ProviderApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderApplication.class, args);
}
}
服务消费者@EnableDiscoveryClient 注解开启服务注册与发现功能;@EnableFeignClients开启feign声明式调用
@SpringBootApplication
@EnableDiscoveryClient //开启服务注册与发现
@EnableFeignClients //开启Feign声明式调用
public class Application {
/**
* Spring cloud Alibaba ribbon负载均衡,默认是ZoneAvoidanceRule策略,
* 综合判断服务节点所在区域的性能和服务节点的可用性,来决定选择哪个服务;
* @return
*/
@LoadBalanced
@Bean
public RestTemplate restTemplate(){
return new RestTemplate();
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Nacos 提供用于存储配置和其它元数据功能,为分布式系统中的外部化配置提供服务器端和客户端支持,使用Spring Cloud Alibaba Nacos Config就可以在Nacos Server集中管理Spring cloud应用的外部属性配置。
Spring Cloud Alibaba Nacos config是在启动的bootstrap阶段,将配置加载到Spring环境中;
Spring Cloud Alibaba Nacos Config使用DataId和GROUP和NAME SPACE确定一个配置;启动好Nacos之后,在Nacos添加如下的配置:
在项目中使用Nacos来实现应用的外部化配置,需要添加如下依赖:
<!--spring-cloud-alibaba nacos config配置依赖-->
com.alibaba.cloud</groupId>
spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
一、可以在Nacos后台新建配置和管理配置信息:
bootstrap.properties配置文件内容解读分析:
#内嵌tomcat端口配置
server.port=8083
#配置服务名称
spring.application.name=29-nacos-discovery-spring-cloud-config
#spring.application.name=nacos-config
#注册中心地址
spring.cloud.nacos.discovery.server-addr=47.110.237.194:8848
#配置nacos用户名和密码
spring.cloud.nacos.username=nacos
spring.cloud.nacos.password=nacos
#配置nacos作为配置中心地址
spring.cloud.nacos.config.server-addr=47.110.237.194:8848
#基于DataId为yam扩展名配置方式
#配置文件格式(默认是properties,不配置就是读取29-nacos-discovery-spring-cloud-config.properties文件,也可以手动配置成yaml那么在nacos创建的时候就要写成29-nacos-discovery-spring-cloud-config.yaml)
spring.cloud.nacos.config.file-extension=yaml
/**
* the suffix of nacos config dataId, also the file extension of config content.
*/
private String fileExtension = "properties";
#Nacos Config配置中心动态刷新
#是否开启读取配置文件自动刷新(默认情况下是开启,修改文件之后前台就自动刷新获取最新的),如果不需要自动刷新设置为false就行
spring.cloud.nacos.config.refresh-enabled=false
/**
* the master switch for refresh configuration, it default opened(true).
*/
private boolean refreshEnabled = true;
#配置默认命名空间下MY_GROUP下的配置数据(此配置就是可以设置默认命名空间下,根据配置的组名称在nacos后台配置的数据当中去获取相应的配置信息,默认是DEFAULT_GROUP,可修改)
#spring.cloud.nacos.config.group=MY_GROUP
/**
* nacos config group, group is config data meta info.
*/
private String group = "DEFAULT_GROUP";
#激活哪份配置文件,原来在spring boot中代表:application-dev.properties
#nacos配置类似:29-nacos-discovery-spring-cloud-config-dev.properties
# 29-nacos-discovery-spring-cloud-config-test.properties(此配置就用开启读取哪份配置文件)
#spring.profiles.active=dev
#基于profile粒度的多环境配置
#${spring.application.name}-${spring.profiles.active}.${file-extension:properties}
#配置命名空间和分组
#spring.cloud.nacos.config.namespace=d6daf259-bd8d-4e95-841e-7ec6c10cbcc6
#spring.cloud.nacos.config.group=DEV_GROUP
#注册服务命名空间和分组
#spring.cloud.nacos.discovery.namespace=d6daf259-bd8d-4e95-841e-7ec6c10cbcc6
#spring.cloud.nacos.discovery.group=DEV_GROUP
使用SpringBoot启动类读取配置参数:
@SpringBootApplication
@EnableDiscoveryClient //开启注册服务与发现
public class CloudAlibabaConfigApplication {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext applicationContext = SpringApplication.run(CloudAlibabaConfigApplication.class, args);
while (true){
//当动态配置刷新时,会更新到 Enviroment中,因此此处每隔一秒从Enviroment中获取配置
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.out.println("user name : " + userName + "; age: " + userAge);
TimeUnit.SECONDS.sleep(1);
}
}
}
2021-01-07 14:54:41.139 INFO 2068 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8083 (http) with context path ''
2021-01-07 14:54:41.141 INFO 2068 --- [ main] com.alibaba.nacos.client.naming : [BEAT] adding beat: {"cluster":"DEFAULT","ip":"192.168.0.56","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":8083,"scheduled":false,"serviceName":"DEFAULT_GROUP@@29-nacos-discovery-spring-cloud-config","stopped":false,"weight":1.0} to beat map.
2021-01-07 14:54:41.185 INFO 2068 --- [ main] com.alibaba.nacos.client.naming : [REGISTER-SERVICE] public registering service DEFAULT_GROUP@@29-nacos-discovery-spring-cloud-config with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"192.168.0.56","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":8083,"weight":1.0}
2021-01-07 14:54:41.258 INFO 2068 --- [ main] c.a.c.n.registry.NacosServiceRegistry : nacos registry, DEFAULT_GROUP 29-nacos-discovery-spring-cloud-config 192.168.0.56:8083 register finished
2021-01-07 14:54:42.874 INFO 2068 --- [ main] c.n.c.CloudAlibabaConfigApplication : Started CloudAlibabaConfigApplication in 13.701 seconds (JVM running for 14.971)
2021-01-07 14:54:42.876 INFO 2068 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [subscribe] 29-nacos-discovery-spring-cloud-config.properties+DEFAULT_GROUP
2021-01-07 14:54:42.877 INFO 2068 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [add-listener] ok, tenant=, dataId=29-nacos-discovery-spring-cloud-config.properties, group=DEFAULT_GROUP, cnt=1
2021-01-07 14:54:42.884 INFO 2068 --- [ main] c.a.n.client.config.impl.ClientWorker : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [subscribe] 29-nacos-discovery-spring-cloud-config+DEFAULT_GROUP
2021-01-07 14:54:42.884 INFO 2068 --- [ main] c.a.nacos.client.config.impl.CacheData : [fixed-47.110.237.194_8801-47.110.237.194_8802-47.110.237.194_8803] [add-listener] ok, tenant=, dataId=29-nacos-discovery-spring-cloud-config, group=DEFAULT_GROUP, cnt=1
user name : zhangsan; age: 14
user name : zhangsan; age: 14
用于配置隔离,不同命名空间下可以存在相同的Group和Data ID配置,NameSpace常用场景之一是不同环境的配置进行分区隔离,例:开发环境、测试环境和生产环境的资源(如配置、服务)隔离等。
Nacos当中的一组配置集合,是组织配置的维度之一,通过一个有意义的字符串(如DEFAULT_GROUP或DEV_GROUP或TEST_GROUP)对一组配置集合进行分组,从而区分Data ID相同的配置集合。如果在Nacos上创建一个配置时未填写分组名称,配置分组名称采用DEFAULT_GROUP。
Nacos中的某个配置集合的ID,配置集合ID是组织划分配置的维度之一,Data ID通常用于组织划分系统的配置集合,一个系统或者应用可以包含多个配置集合,每个配置集都可以被一个有意义的名称标识;
第一种方案:
默认命名空间(public) + 默认Group分组(DEFAULT_GROUP) + 自定义Data Id(没有默认值);
默认命名空间:public
默认Group:DEFAULT_GROUP
自定义Data Id:
$ {spring.application.name}-$ {profile}.$ {file-extension:properties}
例如:nacos-config-dev.yaml
第二种方案:
默认命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值);
默认命名空间:public
默认Group:MY_GROUP
自定义Data Id:
$ {spring.application.name}-$ {profile}.$ {file-extension:properties}
比如:nacos-config-dev.yaml
第二种方案:
自定义命名空间 + 自定义Group分组 + 自定义的Data Id(没有默认值);
默认命名空间:public
默认Group:MY_GROUP
自定义Data Id:
$ {spring.application.name}-$ {profile}.$ {file-extension:properties}
比如:nacos-config-dev.yaml