动态服务发现对以服务为中心的(例如微服务和云原生)应用架构方式非常关键。Nacos支持DNS-based和RPC-based(Dubbo、gRPC)模式的服务发现。Nacos也提供实时健康检查,以防止将请求发往不健康的服务实例。
服务(Service)是Nacos世界的一等公民。Nacos支持几乎所有主流类型的服务的发现、配置和管理:
- Kubernetes Service
- gRPC & Dubbo RPC Service
- Spring Cloud RESTful Service
Nacos的配置特性将在下一篇博客中进行介绍,并且先以Spring Cloud RESTful Service为例子,Kubernetes Service和gRPC & Dubbo RPC Service在以后介绍Kubernetes和Dubbo时再进行补充。
Eureka也有服务注册与发现的功能,博主在下面这几篇博客中进行了介绍:
- Spring Cloud 之Eureka初使用
- Spring Cloud 之Eureka高可用
- Spring Cloud 之使用RestTemplate实现微服务之间相互请求的三种方式
- Spring Cloud 之Feign实现微服务之间相互请求
但由于Eureka2.0闭源,以及Nacos本身的优势(服务在线管理、配置动态刷新等),并且Nacos久经双十一的考验。
| 功能 | Nacos | Eureka | 说明 |
|---|---|---|---|
| 注册中心 | 是 | 是 | 服务治理基本功能,负责服务中心化注册 |
| 配置中心 | 是 | 否 | Eureka需要Config的配合来实现配置中心,且不提供管理界面 |
| 配置动态刷新 | 是 | 否 | Eureka需要Config、MQ以及Webhook的配合来实现配置动态刷新,而Nacos采用Netty保持TCP长连接实时推送 |
| 可用区AZ | 是 | 是 | 对服务集群划分不同区域,实现区域隔离,并提供容灾自动切换 |
| 分组 | 是 | 否 | Nacos可以根据业务和环境进行分组管理 |
| 元数据 | 是 | 是 | 提供服务标签数据,例如环境或服务标识 |
| 权重 | 是 | 否 | Nacos默认提供权重设置功能,调整承载流量压力 |
| 健康检查 | 是 | 是 | Nacos支持由客户端或服务端发起的健康检查,Eureka是由客户端发起心跳 |
| 负载均衡 | 是 | 是 | 均提供负责均衡策略,Eureka采用Ribbon |
| 管理界面 | 是 | 否 | Nacos支持对服务在线管理,Eureka只是预览服务状态 |
Spring Cloud Alibaba版本关系:
- Spring Cloud Alibaba 版本关系
- Nacos 下载地址(Github)
Windows下载
直接下载zip后缀的nacos-server压缩包。
解压后的目录如下图所示:
运行Nacos:
startup.cmd -m standalone
可以访问管理界面。
Linux下载
复制链接地址,用于使用wget命令进行下载。
wget https://github.com/alibaba/nacos/releases/download/1.4.2/nacos-server-1.4.2.tar.gz
解压:
tar -zxvf nacos-server-1.4.2.tar.gz
解压后的目录如下图所示:
运行Nacos:
./startup.sh -m standalone
用户名和密码都是nacos。
创建AlibabaBlog maven工程作为父module,再创建nacos和consumer两个子module。
AlibabaBlog module
pom.xml:
4.0.0 com.kaven AlibabaBlog pom 1.0-SNAPSHOT Spring Cloud Alibaba nacos consumer org.springframework.boot spring-boot-starter-parent 2.3.2.RELEASE 11 11 Hoxton.SR9 2.2.6.RELEASE org.springframework.boot spring-boot-starter-web org.springframework.cloud spring-cloud-dependencies ${spring-cloud-version} pom import com.alibaba.cloud spring-cloud-alibaba-dependencies ${spring-cloud-alibaba-version} pom import
nacos module
结构如下图所示:
pom.xml:
AlibabaBlog com.kaven 1.0-SNAPSHOT 4.0.0 nacos 11 11 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
application.yml:
server:
port: 8080
spring:
application:
name: nacos
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
NacosController接口类:
package com.kaven.alibaba.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class NacosController {
@GetMapping("/nacos")
public String getMessage() {
System.out.println("被请求了!");
return "spring cloud alibaba nacos";
}
}
NacosApplication启动类:
package com.kaven.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosApplication {
public static void main(String[] args) {
SpringApplication.run(NacosApplication.class);
}
}
@EnableDiscoveryClient注解要加上。
consumer module
结构如下图所示:
pom.xml:
AlibabaBlog com.kaven 1.0-SNAPSHOT 4.0.0 consumer 11 11 com.alibaba.cloud spring-cloud-starter-alibaba-nacos-discovery
application.yml:
server:
port: 8090
spring:
application:
name: consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848
ConsumerController接口类:
package com.kaven.alibaba.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import javax.annotation.Resource;
@RestController
public class ConsumerController {
@Resource
private RestTemplate restTemplate;
@GetMapping("/nacos")
public String getNacos() {
return restTemplate.getForObject("http://nacos/nacos", String.class);
}
}
ConsumerApplication启动类:
package com.kaven.alibaba;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
@EnableDiscoveryClient注解要加上。
启动两个子module。
服务注册成功了。
consumer module使用RestTemplate成功调用注册在Nacos上的服务。
启动3个nacos服务,首先要修改NacosApplication的运行配置,操作如下所示:
依次修改端口启动服务(修改一次端口,启动一次服务)。
3个nacos服务启动成功。
多次请求http://localhost:8090/nacos/:
这里很显然是轮询的负载均衡策略,而Nacos的负载均衡策略默认是轮询。但这里并没有使用到Nacos的负载均衡策略,而是使用了Spring Cloud中的负载均衡策略,因为在控制台上修改服务的权重是无效的,仍然是轮询;要想使用自定义的负载均衡策略,就需要实现自定义的IRule实现类,这在下面这篇博客中有介绍:
- Spring Cloud 之Ribbon负载均衡
而Nacos已经实现了自定义的IRule实现类NacosRule,有兴趣可以去探索一下NacosRule类的源码。因此需要将NacosRule实例变成bean,便于Spring容器管理,修改ConsumerApplication类如下:
package com.kaven.alibaba;
import com.alibaba.cloud.nacos.ribbon.NacosRule;
import com.netflix.loadbalancer.IRule;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Scope;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableDiscoveryClient
public class ConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(ConsumerApplication.class);
}
@Bean
@Scope(value = "prototype")
public IRule loadBalanceRule() {
return new NacosRule();
}
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
重复上面的请求操作,结果是一样的,大家可以去测试一下,因为Nacos的负载均衡策略默认也是轮询。
服务在线管理修改第一个nacos服务的权重为100(默认为1)。
修改服务权重成功。
使用Postman来批量调用consumer服务的接口。
第一个nacos服务被调用了98次。
另外两个nacos服务都是被调用了1次。
Nacos的源码分析博主以后再进行介绍,博主目前还在看Spring的源码,等有时间再分享其他框架的源码分析。Nacos服务注册与发现就介绍到这里,之后会介绍Nacos的其他特性以及高可用。
如果博主有说错的地方或者大家有不同的见解,欢迎大家评论补充。



