文章目录
- 什么是 Nacos?
- Nacos 可以做些什么?
- 服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
- 做个小总结
- 使用 Nacos 作为注册中心
- 服务提供者
- 服务消费者
- 测试
- 总结
什么是 Nacos?
Nacos 是一个由阿里开源的产品,可以用来做注册中心跟配置中心。
以前刚刚学习 Spring Cloud 的时候,还是记得 Eureka 是 Spring Cloud 默认的,推荐的服务注册中心组件,但现在早已时过境迁,由于其的闭源,我们被迫只能使用 Consul、ZooKeeper 等开源中间件作为注册中心。不过最近火热的 Nacos 也许应该引起我们的关注, 它不仅仅可以代替 Eureka 做注册中心,还可以替代 Config 做配置中心。
也许我们应该给 Nacos 下一个定义,也对,老是说 Nacos 就是注册中心跟配置中心,就好像只关注 Nacos 的外表,却忽视了它的内核一样。
下面摘抄自官网,清楚地介绍了什么是 Nacos 以及 Nacos 可以做些什么。
Nacos 可以做些什么?
服务发现和服务健康监测
Nacos 支持基于 DNS 和基于 RPC 的服务发现。服务提供者使用 原生 SDK、OpenAPI、或一个独立的 Agent TODO 注册 Service 后,服务消费者可以使用 DNS TODO 或 HTTP&API 查找和发现服务。
Nacos 提供对服务的实时的健康检查,阻止向不健康的主机或服务实例发送请求。Nacos 支持传输层 (PING 或 TCP)和应用层 (如 HTTP、MySQL、用户自定义)的健康检查。 对于复杂的云环境和网络拓扑环境中(如 VPC、边缘网络等)服务的健康检查,Nacos 提供了 agent 上报模式和服务端主动检测2种健康检查模式。Nacos 还提供了统一的健康检查仪表盘,帮助您根据健康状态管理服务的可用性及流量。
动态配置服务
动态配置服务可以让您以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的 UI 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单 DNS 解析服务。动态 DNS 服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。
做个小总结
Nacos 无缝支持一些主流的开源生态,例如 Spring Cloud,Dubbo,gRPC 等,使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。
使用 Nacos 作为注册中心
我们之前说过,Nacos 可以作为注册中心以及配置中心,今天我们就来尝试一下使用 Nacos 作为我们 Spring Cloud 的注册中心,毕竟光说不练假把式,总得练练避免纸上谈兵嘛。
我们首先从 github 上下载 Nacos 的安装包,解压,进入 bin 目录下的 startup.cmd 文件,将其启动。
我们打开 http://127.0.0.1:8848/nacos/index.html,其中账号密码默认均为 nacos,发现可以访问 nacos 控制台。
接下来我们创建一个父工程 nacosuse,并分别创建两个模块,分别为服务提供者 nacos-provider 和服务消费者 nacos-consumer。
服务提供者
我们修改一下 nacos-provider 的 pom 文件,添加 Nacos 有关注册中心的依赖
<?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>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>nacos-provider</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>nacos-provider</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Greenwich.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
我们可以看到引入了一个 dependencyManagement,它定义了 spring cloud 的版本以及 spring cloud alibaba 的版本,这是因为 spring cloud alibaba 还未纳入 spring cloud 的主版本管理中,所以需要自己加入。然后我们引入了 Nacos 的服务注册与发现模块:spring-cloud-starter-alibaba-nacos-discovery。由于已经在 dependencyManagement 中引入了版本,所以在这里就不指定具体版本了。
然后在启动类上添加 @EnableDiscoveryClient 注解开启服务注册发现功能
package com.example.nacosprovider;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {
public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}
}
配置文件修改一下:
server:
port: 8089
spring:
application:
name: nacos-provider
cloud:
nacos:
discovery:
#指定nacos注册中心地址
server-addr: 127.0.0.1:8848
然后我们写一个控制类
package com.example.nacosprovider.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class NameController {
@RequestMapping("/test")
public String getName() {
return "Hello Nacos!";
}
}
服务消费者
nacos-consumer 的 pom 文件与 nacos-provider 是一致的,同时也需要在启动类添加 @EnableDiscoveryClient 注解开启服务注册发现功能。
配置文件如下:
server:
port: 8090
spring:
application:
name: nacos-consumer
cloud:
nacos:
discovery:
#指定nacos注册中心地址
server-addr: 127.0.0.1:8848
注意,服务消费者在这里通过 RestTemplate 调用服务提供者的服务,代码如下:
package com.example.nacosconsuer.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.context.annotation.Bean;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
@RestController
public class TestController {
@Autowired
private RestTemplate restTemplate;
@Bean
@LoadBalanced
public RestTemplate getRestTemplate(){
return new RestTemplate();
}
@RequestMapping("/consumer")
public String consumer() {
return restTemplate.getForObject("http://nacos-provider/test",String.class);
}
}
测试
启动两个模块,打开 Nacos 控制台,可以发现两个服务均已注册到了 Nacos。
然后我们访问服务消费者的接口 http://localhost:8090/consumer,发现调用成功。
总结
我们都知道,Nacos 可以作为注册中心,也可以作为配置中心。
本文较为详细介绍了如何使用 Nacos 作为注册中心,在下一篇博客中会详细介绍如何使用 Nacos 作为配置中心。