Nacos 名字的由来(取红色的英文字符): Dynamic
Na
ming andCo
nfigurationS
ervice 动态命名和配置服务html
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。java
Nacos 既能够做为注册中心也能够做为配置中心,至关于SpringCloud中 Eureka + Config 的组合,而且Eureka 注册中心已经宣布中止更新了,Nacos提供了比它们更强大的功能,并将其合二为一帮助开发者更容易构建分布式系统。git
Nacos 做为注册中心在不一样场景下能够切换成 CAP理论
中的 CP
或 AP
模式github
服务发现与服务健康检测web
动态配置服务spring
动态DNS服务apache
服务机器元数据管理bootstrap
Nacos官网地址ubuntu
Nacos 依赖 Java 环境来运行。若是您是从代码开始构建并运行Nacos,还须要为此配置 Maven环境,请确保是在如下版本环境中安装使用:
Linux/Unix/Mac
启动命令(standalone表明着单机模式运行,非集群模式):
sh startup.sh -m standalone
若是您使用的是ubuntu系统,或者运行脚本报错提示[[符号找不到,可尝试以下运行:
bash startup.sh -m standalone
Windows
启动命令:
cmd startup.cmd
或者双击startup.cmd运行文件。
启动后打开Nacos服务地址 http://192.168.10.1:8848/nacos/index.html ,初始用户名和密码均是nacos。
服务注册
curl -X POST 'http://127.0.0.1:8848/nacos/v1/ns/instance?serviceName=nacos.naming.serviceName&ip=20.18.7.10&port=8080'
服务发现
curl -X GET 'http://127.0.0.1:8848/nacos/v1/ns/instance/list?serviceName=nacos.naming.serviceName'
发布配置
curl -X POST "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test&content=HelloWorld"
获取配置
curl -X GET "http://127.0.0.1:8848/nacos/v1/cs/configs?dataId=nacos.cfg.dataId&group=test"
Linux/Unix/Mac
sh shutdown.sh
Windows
cmd shutdown.cmd
或者双击shutdown.cmd运行文件。
下面是咱们常见的nacos 界面,给你们介绍一个左侧的菜单功能
本示例说明了如何使用 Nacos Discovery Starter 实现 SpringCloud 应用服务发现。
Nacos 是阿里巴巴开源的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
第一步: 建立一个普通的 SpringCloud 项目
第二步:在项目中添加 spring-cloud-starter-alibaba-nacos-discovery
完整 pom 文件以下所示:
<dependencies> <!-- nacos discovery --> <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> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <!--spring cloud alibaba 2.2.0.RELEASE--> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-alibaba-dependencies</artifactId> <version>2.2.0.RELEASE</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement>
第三步:/src/main/resources/application.properties 文件中添加Nacos服务地址相关配置
spring: cloud: nacos: discovery: server-addr: 127.0.0.1:8848 # nacos地址 application: name: nacos-provider-server # 服务名 server: port: 7001 # 端口号
第四步:主启动类中加入注解 @EnableDiscoveryClient 开启服务注册与发现
@SpringBootApplication @EnableDiscoveryClient public class ProviderApplication { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @RestController class EchoController { @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return "Nacos server: " + string; } } }
第五步:启动Nacos服务器
第六步:启动应用
浏览器访问 http://localhost:7001/echo/HelloWorld
查看Nacos服务器管理台界面,能够看到在服务列表中多了刚才启动的服务
为了便于使用,NacosServerList 实现了 com.netflix.loadbalancer.ServerList 接口,并在 @ConditionOnMissingBean 的条件下进行自动注入。若是您有定制化的需求,能够本身实现本身的 ServerList。
Nacos Discovery Starter 默认集成了 Ribbon ,因此对于使用了 Ribbon 作负载均衡的组件,能够直接使用 Nacos 的服务发现。
下面按照步骤建立项目 cloud-nacos-consumer-8001 服务,验证如何使用 RestTemplate 与 FeignClient
(1)添加 @LoadBlanced 注解,使得 RestTemplate 接入 Ribbon
@Bean @LoadBalanced public RestTemplate restTemplate(){ return new RestTemplate(); }
(2)配置 FeignClient
@FeignClient(name = "nacos-provider-server") public interface EchoService { @GetMapping(value = "/echo/{str}") String echo(@PathVariable("str") String str); }
使用 @FeignClient 注解将 EchoService 这个接口包装成一个 FeignClient,属性 name 对应服务名 service-provider。
echo 方法上的 @RequestMapping 注解将 echo 方法与 URL "/echo/{str}" 相对应,@PathVariable 注解将 URL 路径中的 {str}
对应成 echo 方法的参数 str。
(3)完成以上配置后,将二者自动注入到 TestController 中。
@RestController public class TestController { @Autowired private RestTemplate restTemplate; @Autowired private EchoService echoService; @GetMapping(value = "/echo-rest/{str}") public String rest(@PathVariable String str) { return restTemplate.getForObject("http://nacos-provider-server/echo/" + str, String.class); } @GetMapping(value = "/echo-feign/{str}") public String feign(@PathVariable String str) { return echoService.echo(str); } }
(4)启动项目
(5)在浏览器输入 http://localhost:8001/echo-rest/helloWorld, http://localhost:8001/echo-feign/helloWorld 访问成功
Spring Cloud Nacos Discovery 遵循了 spring cloud common 标准,实现了 AutoServiceRegistration、ServiceRegistry、Registration 这三个接口。
在 spring cloud 应用的启动阶段,监听了 WebServerInitializedEvent 事件,当Web容器初始化完成后,即收到 WebServerInitializedEvent 事件后,会触发注册的动做,调用 ServiceRegistry 的 register 方法,将服务注册到 Nacos Server。
NacosServerList 实现了 com.netflix.loadbalancer.ServerList 接口,并在 @ConditionOnMissingBean 的条件下进行自动注入,默认集成了Ribbon。
若是须要有更加自定义的能够使用 @Autowired 注入一个 NacosRegistration 实例,经过其持有的 NamingService 字段内容直接调用 Nacos API。
Nacos 配置中心支持 namespace(命名空间)、group(分组)、dataId(数据id) 三个属性肯定一个配置
- namespace:即命名空间,能够配置成 dev、test、pro 用于切换不用环境的配置,
默认 public
- group:即分组,能够将同一个项目下的不用服务配置命名同一个分组统一管理,
默认 DEFAULT_GROUP
- dataId: 即数据id,一般
dataId = ${spring.application.name}.${file-extension:properties}
或者dataId =${spring.application.name}-${profile}.${file-extension:properties}
两种状况组成- 三者均可以在配置文件中自定义配置
namespace、group、dataId 三者之间的关系以下图所示
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
spring: application: name: nacos-provider-server # 应用名 cloud: nacos: config: server-addr: 127.0.0.1:8848 # nacos 服务地址 server: port: 7001 #端口号
- 若是须要使用域名配置nacos服务地址,格式必须按照
domain name:port
,例如 nacos.abc.com:80- file-extension 默认值为 properties
注意:根据前面介绍的dataId生成规则,这里的 dataId = ${spring.application.name}.${file-extension:properties}
即:dataId = nacos-provider-server.properties
@SpringBootApplication @EnableDiscoveryClient public class NacosProviderMain7001 { public static void main(String[] args) { ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosProviderMain7001.class, args); String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :" +userName+"; age: "+userAge); } @RestController class EchoController { @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return "Nacos server: " + string; } } }
- nacos 支持配置动态刷新
- nacos 配置动态刷新是默认开启的
- 若是想要关闭动态刷新功能,修改配置为
spring.cloud.nacos.config.refresh.enabled=false
便可关闭动态刷新- 若是须要在SpringBoot 配置类中动态读取 Nacos 配置有两种方式
- 配置类上加注解 @RefreshScope(springcloud 提供) ,配置属性上依然使用 @Value 注解
- 或者直接将配置属性上的@Value注解替换为@NacosValue(nacos 提供)注解,并设置autoRefreshed=true
@SpringBootApplication @EnableDiscoveryClient public class NacosProviderMain7001 { public static void main(String[] args) throws InterruptedException { ConfigurableApplicationContext applicationContext = SpringApplication.run(NacosProviderMain7001.class, args); while (true){ String userName = applicationContext.getEnvironment().getProperty("user.name"); String userAge = applicationContext.getEnvironment().getProperty("user.age"); System.err.println("user name :" +userName+"; age: "+userAge); TimeUnit.SECONDS.sleep(1); } } @RestController class EchoController { @GetMapping(value = "/echo/{string}") public String echo(@PathVariable String string) { return "Nacos server: " + string; } } }
若是在项目启动过程当中修改 nacos中的配置,那么控制台打印的结果也会随之变化