一、基础概述
谦虚一点,Nacos是Spring Cloud Alibaba最重要的组件之一;
1、Nacos 名字的由来?
前四个字母为:Naming + Configuration 的前两个字母, 最后一个s为Service;
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台, Nacos 就是服务注册中心+配置中心的组合;
Nacos = Eureka + Config + Bus
2、官网:
3、下载地址:
https://github.com/alibaba/nacos/releases
本次我们选择 1.1.4 版本;
二、Nacos的安装
我们本次选择的版本是Nacos 1.1.4
下载下来的文件解压后目录如下:


使用startup.cmd运行即可,启动的Banner:

成功启动后,使用: http://localhost:8848/nacos 访问控制台:默认账号密码都为: nacos

三、Nacos之服务提供者注册
1、新建服务cloudalibaba-provider-payment9001
pom.xml:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>cloud2020</artifactId>
<groupId>com.jiguiquan.springcloud</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>cloudalibaba-provider-payment9001</artifactId>
<dependencies>
<!--springcloud alibaba nacos-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!--公共服务模块依赖-->
<dependency>
<groupId>com.jiguiquan.springcloud</groupId>
<artifactId>cloud-api-commons</artifactId>
<version>${project.version}</version>
</dependency>
<!--springboot项目web和actuator最好一起走-->
<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>
</dependencies>
</project>
2、配置文件:application.yml:
server: port: 9001 spring: application: name: nacos-payment-provider cloud: nacos: discovery: server-addr: 127.0.0.1:8848 management: endpoints: web: exposure: include: '*'
3、主启动类:com.jiguiquan.springcloud.alibaba.PaymentMain9001.java
@SpringBootApplication
@EnableDiscoveryClient
public class PaymentMain9001 {
public static void main(String[] args) {
SpringApplication.run(PaymentMain9001.class, args);
}
}
4、业务类controller.PaymentCOntroller.java:
@RestController
public class PaymentController {
@Value("${server.port}")
private String serverPort;
@GetMapping("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "Nacos registry, serverPort:" + serverPort + "\t id:" + id;
}
}
5、启动测试,启动成功后,在nacos的服务列表找那个,就可以看到我们的payment9001服务

6、Nacos自带负载均衡功能,为了方便延时,我们参照9001新建一个一模一样的9002工程;
四、Nacos之服务消费者注册和负载均衡
1、新建模块cloudalibaba-consumer-nacos-order83
所有的pom.xml和application.yml与上面几乎一致:
server: port: 83 spring: application: name: nacos-order-consumer cloud: nacos: discovery: server-addr: 127.0.0.1:8848 #消费者将要去访问的微服务名称(注册成功进nacos的微服务提供者),当然也可以不配,写在代码里面 service-url: nacos-user-service: http://nacos-payment-provider
2、主启动类:略
3、使用Ribbon需要注入RestTemplate配置类:
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
3、业务类:controller.OrderController.java:
@RestController
public class OrderController {
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@Autowired
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Integer id){
return restTemplate.getForObject(serverUrl + "/payment/nacos/" + id, String.class);
}
}
4、启动,进行测试,启动成功后,进入Nacos控制台,可以看到当前有哪些服务:

访问以下链接: http://localhost:83/consumer/payment/nacos/666 ,访问多次,看看是否负载均衡:


显然Nacos默认是支持负载均衡的(因为Nacos整合了Ribbon)
五、Nacos作为服务注册中心对比提升
1、Nacos支持 AP 和 CP 两种模式的自由切换

2、Nacos与其它注册中心的特性对比表

这张对比表,太明显,Nacos强太多,什么都支持,所以如果可以自由选择,一定要选择Nacos!!!
3、Nacos支持AP和CP模式的切换——如何操作?
C 是所有节点在同一时间看到的数据时一致的;(强一致性)
A 的定义则是所有的请求都会受到相应;(高可用性)
那么首先 AP 和 CP,我们如何确定选择哪种模式呢?
-
一般来说,如果不需要存储服务级别的信息,且服务实例是通过 Nacos-client 注册,并能够保持心跳上报,那么就可以选择 AP 模式;当前主流的服务如:SpringCloud和Dubbo服务,都适用于AP模式;AP模式为了服务的高可用性,而减弱了强一致性,因此AP模式下只支持注册临时实例!
-
如果需要在服务级别编辑(编排)或者存储配置信息,那么CP是必须的,K8S服务和DNS服务则适用于CP模式;CP模式下只支持注册持久化实例,此时则是以 Raft 协议为集群运行模式,该模式下注册实例前必须先注册服务,如果服务不存在,则会返回错误;
切换方式:
curl -X PUT '$NACOS_SERVER:8848/nacos/v1/ns/operator/switches?entry=serverMode&value=CP'
个人此项目代码地址(持续更新):



