vlambda博客
学习文章列表

使用Nacos做为SpringCloud的注册中心

1. Nacos介绍

1.1 Nacos关键特性

Nacos 致力于发现、配置和管理微服务。Nacos 支持几乎所有主流类型的“服务”的发现、配置和管理:

  • Kubernetes Service

  • gRPC & Dubbo RPC Service

  • Spring Cloud RESTful Service

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 (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。

  • 动态 DNS 服务
    动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。

    Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.

  • 服务及其元数据管理
    Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

1.2 Nacos 生态图

Nacos 无缝支持一些主流的开源生态,例如

  • Spring Cloud

  • Apache Dubbo and Dubbo Mesh TODO

  • Kubernetes and CNCF TODO。

使用 Nacos 简化服务发现、配置管理、服务治理及管理的解决方案,让微服务的发现、管理、共享、组合更加容易。

2. 启动Nacos服务

2.1 预备环境准备

Nacos 依赖 Java 环境来运行。如果您是从代码开始构建并运行Nacos,还需要为此配置 Maven环境,请确保是在以下版本环境中安装使用:

  • 64 bit OS,支持 Linux/Unix/Mac/Windows,推荐选用 Linux/Unix/Mac。

  • 64 bit JDK 1.8+;下载 & 配置。

  • Maven 3.2.x+;下载 & 配置。

2.2 下载源码或者安装包

你可以通过源码和发行包两种方式来获取 Nacos。

  • 从 Github 上下载源码方式

    git clone https://github.com/alibaba/nacos.git
    cd nacos/
    mvn -Prelease-nacos clean install -U
    ls -al distribution/target/
    cd distribution/target/nacos-server-$version/nacos/bin
  • 下载编译后压缩包方式

您可以从 最新稳定版本 下载 nacos-server-$version.zip 包。

  unzip nacos-server-$version.zip 或者 tar -xvf nacos-server-$version.tar.gz
cd nacos/bin

2.3 启动服务器

  • Linux/Unix/Mac

启动命令(standalone代表着单机模式运行,非集群模式):
sh startup.sh -m standalone

  • Windows

启动命令:
cmd startup.cmd
或者双击startup.cmd运行文件。

2.4 关闭服务器

  • Linux/Unix/Mac

sh shutdown.sh

  • Windows

cmd shutdown.cmd
或者双击shutdown.cmd运行文件。

2.5 控制台

浏览器打开 http://127.0.0.1:8848/nacos
默认的用户名密码都是nacos

3. 启动服务发现

3.1 service-provider

添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>

配置文件

server:
port: 8021
spring:
application:
name: service-provider
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosProviderApplication {

public static void main(String[] args) {
SpringApplication.run(NacosProviderApplication.class, args);
}

@RestController
class EchoController {
@GetMapping(value = "/echo")
public String echo(String name) {
return "Hello " + name;
}
}
}

启动服务即可在Nacos控制台的服务列表中看到。

3.2 service-consumer

添加依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>

配置文件

 server:
port: 8011
spring:
application:
name: service-consumer
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

这里使用feign调用provider
client

@FeignClient(name = "service-provider")
public interface NacosClient {
@GetMapping(value = "/echo")
ResponseEntity<String> echo(String name) ;
}

启动类

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}

@RestController
public class TestController {
@Autowired
private NacosClient client;

@GetMapping(value = "/echo")
public ResponseEntity<String> echo(String name) {
return client.echo(name);
}

}

}

启动Consumer,然后访问http://localhost:8011/echo?name=zhangsan即可看到provider的响应。

4. 启动配置管理

将service-consumer项目改成从Nacos拿配置
依赖

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>0.9.0.RELEASE</version>
</dependency>

配置文件

spring:
application:
name: service-consumer
profiles:
active: single
cloud:
nacos:
config:
server-addr: 127.0.0.1:8848
prefix: ${spring.application.name}
file-extension: yaml

为了测试方便,在TestController中添加一个配置变量

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

public static void main(String[] args) {
SpringApplication.run(NacosConsumerApplication.class, args);
}

@RestController
@RefreshScope
public class TestController {
@Autowired
private NacosClient client;
@Value("${useLocalCache:false}")
private boolean useLocalCache;

@GetMapping("/get")
public boolean get() {
return useLocalCache;
}

@GetMapping(value = "/echo")
public ResponseEntity<String> echo(String name) {
return client.echo(name);
}

}

}

在 Nacos Spring Cloud 中,dataId 的完整格式如下:

${prefix}-${spring.profile.active}.${file-extension}
  • prefix 默认为 spring.application.name 的值,也可以通过配置项 spring.cloud.nacos.config.prefix来配置。

  • spring.profile.active 即为当前环境对应的 profile
    注意:当 spring.profile.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 ${prefix}.${file-extension}

  • file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持 properties 和 yaml 类型。

打开Nacos控制台的配置管理,添加配置项

  • Data ID:service-consumer-single.yaml

  • 配置内容:

  server:
port: 8011
spring:
cloud:
nacos:
discovery:
server-addr: 127.0.0.1:8848

useLocalCache: false

重新启动service-consumer,访问http://localhost:8011/echo?name=zhangsan可看到provider的响应,访问http://localhost:8011/get,此时返回内容为false。
在Nacos控制台的配置管理更新值useLocalCache: true,再次访问http://localhost:8011/get,此时返回内容为true,说明程序中的useLocalCache值已经被动态更新了。