一、基础概述
谦虚一点,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'
个人此项目代码地址(持续更新):