前言
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。
Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。 Nacos 是构建以“服务”为中心的现代应用架构 (例如微服务范式、云原生范式) 的服务基础设施。
文中所用地址
Nacos 主要特性
Nacos特性主要包含
服务注册
Nacos客户端会通过Rest请求将服务信息(包含但不限于ip,端口)发送到Nacos服务端存储到一个内存Map中
服务发现
服务消费者在调用服务提供者时候会发送一个Rest请求给Nacos服务端来获取服务提供者信息并将服务提供者缓存在Nacos客户端本地
服务心跳
服务注册之后,Nacos客户端会每隔5s的发送心跳到Nacos服务端,告诉Nacos服务端还存活着
服务健康检查
Nacos服务端会开启一个定时任务来检查各个服务的健康状态。发现又服务超过15s没有心跳,会将健康状态置为false,如果30s还没有心跳就直接剔除实例
注册中心基本架构

注册中心基本都是利用这种架构实现的,但每种都有一些去呗,比如Nacos并没有用数据库去存储注册表结构,Nacos是利用一个双Map内存数据结构存储的。
Nacos注册表结构
通过源码可分析出它的注册表结构大致是**Map<namespace, Map<group::serviceName, Service>>**
Service里面还包含一个集群Map

举例说明

Nacos资源隔离
- namespace之间会进行资源隔离
- 相同的namespace下的不同group之间相互隔离
- 相同的namespace下的相同group下的不同服务可以调用
- 相同的namespace下的相同group下的相同服务可以跨集群调用
spring cloud 整合Nacos
Nacos 服务端首先必须搭建好,在我的另一篇博客中会有搭建教程
需要关注版本说明,springboot、springcloud、springcloud alibba三者版本最好与官方提供一致
引入依赖
父Pom
<properties>
<spring-boot.version>2.3.2.RELEASE</spring-boot.version>
<spring-cloud.version>Hoxton.SR8</spring-cloud.version>
<spring-cloud-alibaba.version>2.2.4.RELEASE</spring-cloud-alibaba.version>
</properties>
<dependencyManagement>
<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>
</dependencyManagement>
当前项目pom
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring‐cloud‐starter‐alibaba‐nacos‐discovery</artifactId>
</dependency>
application.properties
spring:
application:
name: user-service
cloud:
nacos:
discovery:
server-addr: localhost:8848
启动测试
String url = "http://service‐order/order/"+id;
List<Order> orderList = restTemplate.getForObject(url, List.class);
配置RestTemplate
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
