目录
什么是Nacos
官方文档:https://nacos.io/zh-cn/docs/what-is-nacos.html
Nacos 是一个易于使用的动态服务发现、服务配置和服务管理平台,用于构建云原生应用程序。
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 的关键特性
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
Nacos的核心功能
服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如:IP地址,端口等信息。Nacos Server收到请求后,就会把这些元数据信息存储在一个双层的内存Map中。
服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5秒发送一次心跳。
服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存。
服务健康检查:Nacos Server会开启一个定时任务来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的health属性置为false,如果某个实例超过30s没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则重新注册)
Nacos与Eureka注册中心的区别
CAP C:一致性 A:可用性 P:分区容错性
Nacos | Eureka | |
---|---|---|
一致性协议 | CP/AP,默认使用AP | AP |
健康检查 | TCP/HTTP/ClientBeat/MYSQL | ClientBeat |
负载均衡策略 | 权重/metadata/Selector | Ribbon |
雪崩保护 | 有 | 有 |
自动注销实例 | 支持 | 支持 |
访问协议 | HTTP/DNS | HTTP |
监听支持 | 支持 | 支持 |
多数据中心 | 支持 | 支持 |
跨注册中心同步 | 支持 | 不支持 |
SpringCloud集成 | 支持 | 支持 |
Dubbo集成 | 支持 | 不支持 |
k8s集成 | 支持 | 不支持 |
Nacos Server 部署
下载地址:https://github.com/alibaba/nacos/releases
1. 找到与SpringCloudAlibaba版本相对应的Nacos版本进行下载
2.下载完成后,进行解压
3.修改startup.cmd
默认是集群模式启动,我们修改为单机模式
4.启动,双击startup.cmd
5.访问Nacos管理页面
http://localhost:8848/nacos/index.html
账号密码:默认都是nacos
Nacos Client搭建
1.分别在订单服务和库存服务引入Nacos Client依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
2.修改applicaton.yml文件
server:
port: 8011
#应用名称
spring:
application:
name: stock-service
cloud:
nacos:
discovery:
#nacos注册中心地址,默认端口号:8848
server-addr: 127.0.0.1:8848
#nacos管理平台账号,默认nacos
username: nacos
#nacos管理平台密码,默认nacos
password: nacos
#命令空间,默认public
namespace: public
3.添加@LoadBalanced注解
package com.zjb.order.config;
import org.springframework.boot.web.client.RestTemplateBuilder;
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 OrderConfig {
/**
* 向Spring中注入RestTemplate
* @param builder
* @return
*/
@Bean
//负载均衡:SpringCloudAlibaba 默认使用的Ribbon,默认策略:轮询
@LoadBalanced
public RestTemplate restTemplate(RestTemplateBuilder builder){
RestTemplate restTemplate = builder.build();
return restTemplate;
}
}
4.修改controller
package com.zjb.order.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
@RequestMapping("/order")
public class OrderController {
@Autowired
private RestTemplate restTemplate;
@RequestMapping("/add")
public String add(){
System.out.println("---下单---");
String msg = restTemplate.getForObject("http://stock-service/stock/reduct", String.class);
System.out.println("调用库存服务:"+msg);
return "下单成功";
}
}
5.启动服务、测试
ps:在SpringCloudAlibaba某个版本之后就不需要在启动类上添加@EnableDiscoveryClient注解
启动成功后,我们再次访问nacos管理平台,打开服务列表,发现我们的两个服务都已经注册进去。
访问localhost:8010/order/add
Nacos注册中心配置项
配置项 | Key | 默认值 | 说明 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Nacos集群部署
官方文档:集群部署说明
在之后学习中,会单独进行详细讲解。这里就不在进行演示。
Nacos配置中心
官方文档:https://github.com/alibaba/spring-cloud-alibaba/wiki/Nacos-config
Nacos提供用于存储配置和其它元数据的key、value存储,为分布式系统中的外部化配置提供服务器端和客户端支持,使用SpringCloudAlibaba Nacos Config,您可以在Nacos Server集中管理你SpringCloud应用的外部属性配置
配置中心对比
springcloud config | apollo | nacos | |
---|---|---|---|
开源时间 | 2014.9 | 2016.5 | 2018.6 |
配置实时推送 | 支持(SpringCloud Bus) | 支持(http长轮询1s内) | 支持(http长轮询1s内) |
版本管理 | 支持(git) | 自动管理 | 自动管理 |
配置回滚 | 支持(git) | 支持 | 支持 |
灰度发布 | 支持 | 支持 | 待支持 |
权限管理 | 支持 | 支持 | 支持 |
多集群多环境 | 支持 | 支持 | 支持 |
监听查询 | 支持 | 支持 | 支持 |
多语言 | 只支持Java | Go,C++,Java,net,OpenAPI | Python,java,OpenAPI |
分布式高可用 最小集群数量 | Config-Server+git+mq | Config2+Admin3+Portal*2+mysql =8 | nacos*3+mysql=4 |
配置格式校验 | 不支持 | 支持 | 支持 |
通信协议 | HTTP、AMQP | HTTP | HTTP |
数据一致性 | git保证数据一致性,Config-Server从git读取数据 | 数据库模拟消息队列,Apollo定时读消息 | HTTP异步通知 |
单机读(tps) | 7(限流所制) | 9000 | 15000 |
单机写(tps) | 5(限流所制) | 1100 | 1800 |
3节点读 | 21(限流所制) | 27000 | 45000 |
3节点写 | 5(限流所制) | 3300 | 5600 |
客户端读取配置
1.引入依赖
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
2.修改启动类
@SpringBootApplication
public class ProviderApplication {
public static void main(String[] args) {
ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
String userName = applicationContext.getEnvironment().getProperty("user.name");
String userAge = applicationContext.getEnvironment().getProperty("user.age");
System.err.println("user name :"+userName+"; age: "+userAge);
}
}
3.在运行之前, 必须使用 bootstrap.properties 配置文件来配置Nacos Server 地址
#这里是服务名,要和配置中心的dataId保持一致
spring.application.name=nacos-config
spring.cloud.nacos.config.server-addr=127.0.0.1:8848
注意: 当你使用域名的方式来访问 Nacos 时,spring.cloud.nacos.config.server-addr
配置的方式为 域名:port
。 例如 Nacos 的域名为abc.com.nacos,监听的端口为 80,则 spring.cloud.nacos.config.server-addr=abc.com.nacos:80
。 注意 80 端口不能省略。
@RefreshScope
@Value注解可以获取到配置中心的值,但是无法感知修改后的值,需要利用@RefreshScope注解