Nacos前四个字母分别为Naming和Configuration的前两个字母,最后的s为Service。是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,简单来说Nacos就是注册中心+配置中心的组合,等价于 Eureka + Config + Bus。所以,Nacos可以替代Eureka做服务注册中心,也可以替代Config做服务配置中心。
官网下载地址:https://github.com/alibaba/Nacos
进入GitHub之后,在下面有官网连接,如图:
点击该该链接进入官网,如图:
点击版本说明,进入版本选择
前提:JDK8+maven环境
下载Nacos的server,解压到某个目录,直接在cmd控制台运行脚本即可,如图:
回车只会,在控制台出现如下
表示下载成功,运行成功。
验证:在浏览器输入如下网址:http://localhost:8848/nacos,出现下图所示,表示本地Nacos成功启动
注意:默认账号密码都是nacos
登录进去如下图:
在父pom中引入springCloud Alibaba的坐标
1)新建工程cloudalibaba-provider-payment9001
2)修改pom,主要是添加Nacos坐标
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
完整的pom
cloud2020
com.bjc.cloud
1.0-SNAPSHOT
4.0.0
cloudalibaba-provider-payment9001
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
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
3)yml配置文件
server:
port: 9001
spring:
cloud:
nacos:
discovery:
server-addr: localhost:8848 # 配置Nacos地址
application:
name: nacos-payment-provider
management:
endpoints:
web:
exposure:
include: '*'
4)启动类
package com.bjc.cloud.nacos;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProvider9001 {
public static void main(String[] args) {
SpringApplication.run(NacosProvider9001.class,args);
}
}
5)业务测试类
package com.bjc.cloud.nacos.controller;
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("/payment/nacos/{id}")
public String getPayment(@PathVariable("id") Integer id){
return "nacos registry,serverport: " + serverPort + "\t id = " + id;
}
}
6)测试
启动9001,在浏览器输入:http://localhost:9001/payment/nacos/1,页面显示,如图:
然后,查看Nacos控制台,如图:
服务成功的注册进了Nacos
注意:Nacos自带负载均衡功能,所以,我们可以参考9001,新建一个9002
也可以使用一种偷懒的方式,在idea中直接复制一份,例如:
1)选择9001,右键,如图:
2)在弹窗中输入如下命令参数(-DServer.port=9011),如图:
3)点击apply,点击ok,在列表中就会出现刚才复制的配置工程了,如图:
4)启动之,可以正常访问
5)然后再看Nacos控制台,如图:
在启动新建的9002,查看Nacos,如图:
查看详情,如图所示,三个服务都成功入驻Nacos了
注意:Nacos天生具备负载均衡,是因为其集成了ribbon
1)新建工程cloudalibaba-consumer-nacos-order83
2)修改pom
cloud2020
com.bjc.cloud
1.0-SNAPSHOT
4.0.0
cloudalibaba-consumer-nacos-order83
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
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
com.bjc.cloud
cloud-api-commons
${project.version}
3)新建yml配置文件
server:
port: 83
spring:
application:
name: nacos-order-consumer
cloud:
nacos:
discovery:
server-addr: localhost:8848
## 消费者要去访问的微服务名称(注册成功进nacos的微服务提供者)
service-url:
nacos-user-service: http://nacos-payment-provider
4)启动类
package com.bjc.clous;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class OrderMain83 {
public static void main(String[] args) {
SpringApplication.run(OrderMain83.class,args);
}
}
5)配置类
因为Nacos集成了ribbon,所以需要支持RestTemplate,需要写一个配置类
package com.bjc.clous.config;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class ApplicationContextConfig {
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
}
6)业务测试类
package com.bjc.clous.controller;
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;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class OrderNacosController {
// public static final String SERVER_URL = "http://nacos-payment-provider";
@Value("${service-url.nacos-user-service}")
private String serverUrl;
@Resource
private RestTemplate restTemplate;
@GetMapping("/consumer/payment/nacos/{id}")
public String paymentInfo(@PathVariable("id") Long id){
return restTemplate.getForObject(serverUrl+"/payment/nacos/"+id,String.class);
}
}
7)测试
启动83,查看Nacos,如图:
访问83,如图:
刷新,id值有变化,且是轮询的,所以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-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'