nacos 是什么?
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。 Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
nacos 能做什么?
nacos 能做 服务发现、配置中心、服务健康监测等。对应到springcloud 体系中Nacos = Eureka/Consule + Config + Admin。
nacos 架构图
从这张图中可以看到Nacos = Eureka/Consule + Config + Admin
nacos 安装
关于nacos 安装移步 windows系统 安装nacos服务注册与发现中心
核心功能
- 服务注册:Nacos Client会通过发送REST请求的方式向Nacos Server注册自己的服务,提供自身的元数据,比如ip地址、端口等信息。Nacos Server接收到注册请求后,就会把这些元数据信息存储在一个双层的内存Map中。
- 服务心跳:在服务注册后,Nacos Client会维护一个定时心跳来持续通知Nacos Server,说明服务一直处于可用状态,防止被剔除。默认5s发送一次心跳。
- 服务同步:Nacos Server集群之间会互相同步服务实例,用来保证服务信息的一致性。
- 服务发现:服务消费者(Nacos Client)在调用服务提供者的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务定时拉取服务端最新的注册表信息更新到本地缓存
- 服务健康检查:Nacos Server会开启一个定时任务用来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将它的healthy属性置为false(客户端服务发现时不会发现),如果某个实例超过30秒没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)
注册中心对比
CAP C 一致性 A可用性 P 分区容错性
版本:
版本说明: Spring Cloud Alibaba 版本说明 本次使用版本:
Spring Cloud Alibaba 版本 | Spring Cloud 版本 | Spring Boot 版本 |
---|
2021.1 | 2021.0.1 | 2.6.4 |
升级到2021.0.1.0 请看 Spring Cloud Alibaba 2021.0.1.0 升级指南
代码示例
nacos 属于Spring Cloud Alibaba体系中的一环,所以使用nacos需引入Spring Cloud Alibaba依赖。
- 新建一个maven项目,pom 文件如下
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<packaging>pom</packaging>
<groupId>site.sunlong</groupId>
<artifactId>micro-service-alibaba-practice</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>micro-service-alibaba-practice</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<spring-cloud.version>2021.0.1</spring-cloud.version>
<springboot.version>2.6.4</springboot.version>
<spring.cloud.alibaba.version>2021.0.1.0</spring.cloud.alibaba.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-loadbalancer</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${springboot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>${spring-cloud.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>${spring.cloud.alibaba.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
</project>
注意: 要使用负载均衡就要引入spring-cloud-starter-loadbalancer,spring-cloud-starter-loadbalancer之前都是引入springcloud依赖自带的包,不知道2021版本为什么没有了,感兴趣的可以看一看springcloud发布日志里有没有说明
- 新建一个springboot 项目,命名为nacos-provider
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
server.port=8090
spring.application.name=nacos-provider
# nacos server 地址
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
@RequestMapping("/helloProvider")
@RestController
public class ProviderHelloController {
@GetMapping("/hello/{param}")
public String hello(@PathVariable("param") String param){
return "hello,"+param+".this is nacos provider";
}
}
- 新建一个springboot 项目,命名为nacos-consumer
nacos-consumer用于对nacos-provider的消费,依赖和 nacos-provider一样
server.port=8089
spring.application.name=nacos-consumer
# nacos server 地址
spring.cloud.nacos.discovery.server-addr=192.168.56.1:8848
- 3.2 新建一个配置类
注入一个RestTemplate 对象,用于对provider的调用 @LoadBalanced注解不能忘
@Configuration
public class RestTemplateConfig {
@LoadBalanced
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
- 3.3 新建一个controller
用于对nacos-provider的调用
@RequestMapping("/helloConsumer")
@RestController
public class ConsumerHelloController {
@Autowired
private RestTemplate restTemplate;
@GetMapping("/hello/{param}")
public String hello(@PathVariable("param") String param) {
String url = "http://nacos-provider/helloProvider/hello/"+param;
return restTemplate.getForObject(url,String.class);
}
}
- 启动
分别启动nacos-provider和nacos-consumer,然后登录通过访问http://localhost:8848/nacos/index.html,登录nacos管理界面。在服务列表中可以看到注册到nacos的服务列表 - 测试
通过postman 访问consumer进行测试,成功通过consumer调用到provider
配置项
更多关于 spring-cloud-starter-alibaba-nacos-discovery 的 starter 配置项如下所示:
配置项 | Key | 默认值 | 说明 |
---|
服务端地址 | spring.cloud.nacos.discovery.server-addr | 无 | Nacos Server 启动监听的ip地址和端口 | 服务名 | spring.cloud.nacos.discovery.service | ${spring.application.name} | 给当前的服务命名 | 服务分组 | spring.cloud.nacos.discovery.group | DEFAULT_GROUP | 设置服务所处的分组 | 权重 | spring.cloud.nacos.discovery.weight | 1 | 取值范围 1 到 100,数值越大,权重越大 | 网卡名 | spring.cloud.nacos.discovery.network-interface | 无 | 当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址 | 注册的IP地址 | spring.cloud.nacos.discovery.ip | 无 | 优先级最高 | 注册的端口 | spring.cloud.nacos.discovery.port | -1 | 默认情况下不用配置,会自动探测 | 命名空间 | spring.cloud.nacos.discovery.namespace | 无 | 常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 | AccessKey | spring.cloud.nacos.discovery.access-key | 无 | 当要上阿里云时,阿里云上面的一个云账号名 | SecretKey | spring.cloud.nacos.discovery.secret-key | 无 | 当要上阿里云时,阿里云上面的一个云账号密码 | Metadata | spring.cloud.nacos.discovery.metadata | 无 | 使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息 | 日志文件名 | spring.cloud.nacos.discovery.log-name | 无 | | 集群 | spring.cloud.nacos.discovery.cluster-name | DEFAULT | 配置成Nacos集群名称 | 接入点 | spring.cloud.nacos.discovery.enpoint | UTF-8 | 地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址 | 是否集成Ribbon | ribbon.nacos.enabled | true | 一般都设置成true即可 | 是否开启Nacos Watch | spring.cloud.nacos.discovery.watch.enabled | true | 可以设置成false来关闭 watch |
参考:
https://nacos.io/zh-cn/docs/what-is-nacos.html https://github.com/alibaba/spring-cloud-alibaba/wiki/
能力一般,水平有限,如有错误,请多指出。 如果对你有用点个关注给个赞呗
|