Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service的首字母简称,一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
总的来说nacos就是服务注册中心和配置中心的组合
前置条件:Java8+Maven环境已经配置完成
从官网下载Nacos,下载地址:https://github.com/alibaba/nacos/releases
解压安装包,直接运行bin目录下的startup.cmd,测试期间可以将启动模式设置为单机模式。

命令运行成功后直接访问http://localhost:8848/nacos,默认账号密码都是nacos
进入nacos控制台

就像tomcat一样,Nacos服务启动后,我们只需要将我们的微服务注册到Nacos中即可。
新建Module - cloudalibaba-provider-payment9001
引入pom依赖:
在master的pom.xml中引入spring-cloud-alibaba-dependencies,用来进行版本控制,以免版本冲突:
com.alibaba.cloud spring-cloud-alibaba-dependencies 2.2.8.RELEASE pom import
服务提供者模块 - pom引入以下依赖:
org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 0.2.2.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools runtime true org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test
配置yaml文件,配置服务注册中心地址,将微服务注册到nacos:
server:port: 9001spring:application:name: nacos-payment-providercloud:nacos:discovery:server-addr: localhost:8848 #配置Nacos地址management:endpoints:web:exposure:include: '*'
主启动类添加@EnableDiscoveryClient注解:
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;@EnableDiscoveryClient
@SpringBootApplication
public class PaymentMain9001 {public static void main(String[] args) {SpringApplication.run(PaymentMain9001.class, args);}
}
业务类:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;@RestController
public class PaymentController {@Value("${server.port}")private String serverPort;@GetMapping(value = "/payment/nacos/{id}")public String getPayment(@PathVariable("id") Integer id) {return "nacos registry, serverPort: "+ serverPort+"\t id"+id;}
}
为了演示nacos的负载均衡,参照9001创建第二个服务提供者 cloudalibaba-provider-payment9002
查看服务端是否注册成功:
启动9001和9002即可,在Nacos的控制台查看服务实例是否已经注册成功。

创建服务消费者Module - cloudalibaba-consumer-nacos-order83
引入pom依赖: spring-cloud-starter-alibaba-nacos-discovery
org.springframework.cloud spring-cloud-starter-alibaba-nacos-discovery 0.2.2.RELEASE com.atguigu.springboot cloud-api-commons 1.0-SNAPSHOT org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-actuator org.springframework.boot spring-boot-devtools org.projectlombok lombok org.springframework.boot spring-boot-starter-test
配置application.yaml配置文件: 将当前微服务注册到nacos,并声明一个自定义变量,将服务提供者的微服务地址声明在配置文件中,便于业务代码和配置文件的解耦
server:port: 83spring:application:name: nacos-order-consumercloud:nacos:discovery:server-addr: localhost:8848#将服务提供者的微服务信息声明在配置文件中,便于业务代码和配置文件的解耦
service-url:nacos-user-service: http://nacos-payment-provider #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者)
创建主启动类: 添加@EnableDiscoveryClient注解
@SpringBootApplication
@EnableDiscoveryClient
public class OrderNacosMain83 {public static void main(String[] args) {SpringApplication.run(OrderNacosMain83.class,args);}
}
创建一个配置类: 利用RestTemplate进行远程服务调用
@Configuration
public class ApplicationContextConfig {@Bean@LoadBalancedpublic RestTemplate getRestTemplate(){return new RestTemplate();}
}
编写业务类: 首先获取服务调用地址,然后利用restTemplate进行远程调用,调用路径就是服务地址+服务提供者中controller的方法映射地址
@RestController
@Slf4j
public class OrderNacosController {@Resourceprivate RestTemplate restTemplate;@Value("${service-url.nacos-user-service}")private String serverURL;@GetMapping(value = "/consumer/payment/nacos/{id}")public String paymentInfo(@PathVariable("id") Long id){return restTemplate.getForObject(serverURL+"/payment/nacos/"+id,String.class);}
}
负载均衡: nacos默认开启轮询模式的负载均衡策略

Nacos与其他注册中心特性对比
| nacos | eureka | consul | coreDNS | zooKeeper | |
|---|---|---|---|---|---|
| 一致性协议 | CP+AP | AP | CP | / | CP |
| 健康检查 | TCP/HTTP/MySQL/Client Beat | Client Beat | TCP/HTTP/gRPC/Cmd | / | Client Beat |
| 负载均衡 | 权重/DSL/metadata/CMDB | Ribbon | Fabio | RR | / |
| 雪崩保护 | 支持 | 支持 | 不支持 | 不支持 | 不支持 |
| 自动注销实例 | 支持 | 支持 | 不支持 | 不支持 | 支持 |
| 访问协议 | HTTP/DNS/UDP | HTTP | HTTP/DNS | DNS | TCP |
| 监听支持 | 支持 | 支持 | 支持 | 不支持 | 支持 |
| 多数据中心 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| 跨注册中心 | 支持 | 不支持 | 支持 | 不支持 | 不支持 |
| springcloud集成 | 支持 | 支持 | 支持 | 不支持 | 不支持 |
| dubbo集成 | 支持 | 不支持 | 不支持 | 不支持 | 支持 |
| k8s集成 | 支持 | 不支持 | 支持 | 支持 | 不支持 |
Nacos支持AP(分区可用性)和CP(分区一致性)模式的切换

C指的是所有节点在同一时间看到的数据是一致的;而A的定义是所有的请求都会收到响应。Nacos支持CP+AP模式,即Nacos可以根据配置识别为CP模式或AP模式,默认是AP模式。
何时选择使用何种模式?
如果对数据一致性要求较高,且可以容忍一定时间的不可用,就选用CP模型。反之,如果可以容忍一定时延的数据不一致性,但不能容忍不可用现象发生,则要选用AP模型。
切换命令:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP