Nacos概念介绍集群部署以及集成Springboot使用

  • 1. nacos介绍
  • 1.1 nacos概念
  • 1.2 nacos功能
  • 2. nacos架构原理
  • 2.1 构成部分
  • 2.2 AP和CP
  • 3. nacos部署
  • 3.1 部署模式
  • 3.2 集群模式部署过程
  • 3.2.1 部署环境
  • 3.2.2 部署步骤
  • 4. springboot集成nacos使用
  • 4.1 服务发现和服务健康监测
  • 4.2 动态配置服务
  • 5. 参考资料


参与项目中,使用nacos做服务治理工具,使用springboot集成nacos做服务注册服务发现以及通过nacos监测服务状态等。以此背景为基础,查阅nacos相关资料等,在本地部署搭建nacos集群,并准备demo工程完成springboot与nacos的集成使用,实现服务注册发现以及配置中心的功能。本文前两部分nacos介绍与nacos架构原理内容,来源于nacos官网,此处进行简要摘录汇总,部署与使用均源于实际操作实例,读者可根据需要阅读使用。文中不免疏漏之处,望读者予以指正,不胜感激!

1. nacos介绍

1.1 nacos概念

Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。

1.2 nacos功能

从官网摘录 Nacos 的关键特性包括:

  1. 服务发现和服务健康监测
Nacos支持基于DNS和基于RPC的服务发现,服务端可以通过SDK或者Api进行服务注册,
相应的服务消费者可以使用DNS或者Http查找的方式获取服务列表。
Nacos同时提供对服务的实时健康检查,阻止想不健康的主机或服务发送请求,
与Eureka类似Nacos也有友好的控制台界面。
  1. 动态配置服务
动态配置服务可以以中心化、外部化和动态化的方式管理所有环境的应用配置和服务配置。
动态配置消除了配置变更时重新部署应用和服务的需要,让配置管理变得更加高效和敏捷。
配置中心化管理让实现无状态服务变得更简单,让服务按需弹性扩展变得更容易。
Nacos 提供了一个简洁易用的UI (控制台样例 Demo) 帮助您管理所有的服务和应用的配置。
Nacos 还提供包括配置版本跟踪、金丝雀发布、一键回滚配置以及客户端配置更新状态跟踪在内的一系列开箱即用的配置管理特性,帮助您更安全地在生产环境中管理配置变更和降低配置变更带来的风险。
  1. 动态 DNS 服务
动态 DNS 服务支持权重路由,让您更容易地实现中间层负载均衡、更灵活的路由策略、流量控制以及数据中心内网的简单DNS解析服务。
动态DNS服务还能让您更容易地实现以 DNS 协议为基础的服务发现,以帮助您消除耦合到厂商私有服务发现 API 上的风险。
Nacos 提供了一些简单的 DNS APIs TODO 帮助您管理服务的关联域名和可用的 IP:PORT 列表.
  1. 服务及其元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的所有服务及元数据,
包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略、服务的 SLA 以及最首要的 metrics 统计数据。

2. nacos架构原理

2.1 构成部分

spring boot项目集成nacos springboot集成nacos集群_java

  1. 服务提供方 (Service Provider)
是指提供可复用和可调用服务的应用方。
  1. 服务消费方 (Service Consumer)
是指会发起对某个服务调用的应用方。
  1. 服务 (Service)
服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),
其目的是不同的客户端可以为不同的目的重用(例如通过跨进程的网络调用)。
Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service。
  1. 服务注册中心 (Service Registry)
服务注册中心,它是服务,其实例及元数据的数据库。
服务实例在启动时注册到服务注册表,并在关闭时注销。
服务和路由器的客户端查询服务注册表以查找服务的可用实例。
服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。
  1. 服务元数据 (Service Metadata)
服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据。
  1. 配置 (Configuration)
在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。
目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。
配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。
配置变更是调整系统运行时的行为的有效手段之一。
  1. 配置管理 (Configuration Management)
在数据中心中,系统中所有配置的编辑、存储、分发、变更管理、历史版本管理、变更审计等所有与配置相关的活动统称为配置管理。
  1. 名字服务 (Naming Service)
提供分布式系统中所有对象(Object)、实体(Entity)的“名字”到关联的元数据之间的映射管理服务,
例如 ServiceName -> Endpoints Info, Distributed Lock Name -> Lock Owner/Status Info, DNS Domain Name -> IP List, 
服务发现和 DNS 就是名字服务的2大场景。
  1. 配置服务 (Configuration Service)
在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。

2.2 AP和CP

Nacos支持AP与CP模式的切换

Spring Cloud Alibaba Nacos 在 1.0.0 正式支持 AP 和 CP 两种一致性协议,其中 CP一致性协议实现,是基于简化的 Raft 的 CP 一致性。
  1. CAP理论
    分布式系统就一定离不开CAP定理,CAP定理叫作布鲁尔定理。
    C (一致性):对某个指定的客户端来说,读操作能返回最新的写操作。对于数据分布在不同节点上的数据上来说,如果在某个节点更新了数据,那么在其他节点如果都能读取到这个最新的数据,那么就称为强一致,如果有某个节点没有读取到,那就是分布式不一致。
    A (可用性):非故障的节点在合理的时间内返回合理的响应(不是错误和超时的响应)。可用性的两个关键一个是合理的时间,一个是合理的响应。合理的时间指的是请求不能无限被阻塞,应该在合理的时间给出返回。合理的响应指的是系统应该明确返回结果并且结果是正确的。
    P (分区容错性):当出现网络分区后,系统能够继续工作。打个比方,这里个集群有多台机器,有台机器网络出现了问题,但是这个集群仍然可以正常工作。
    CAP三者不能共有,在分布式系统中,网络无法100%可靠,分区其实是一个必然现象,分布式系统理论上不可能选择CA架构,只能选择CP或者AP架构。
  2. nacos CP与AP的适用场景
    CP:如果需要在服务级别编辑或者存储配置信息的时候,CP就是必须的。CP模式下则支持注册持久化实例,是以Raft协议为集群运行模式,该模式注册实例之前必须先注册服务,如果服务不存在,则会返回错误
    AP:如果不需要存储服务级别信息且服务实例通过nacos-client注册,并能够保持心跳上报,AP模式只支持注册临时实例。AP协议:Distro协议。Distro是阿里巴巴的私有协议,目前流行的 Nacos服务管理框架就采用了 Distro协议。Distro 协议被定位为 临时数据的一致性协议 :该类型协议, 不需要把数据存储到磁盘或者数据库 ,因为临时数据通常和服务器保持一个session会话, 该会话只要存在,数据就不会丢失 。Distro 协议保证写必须永远是成功的,即使可能会发生网络分区。当网络恢复时,把各数据分片的数据进行合并。

3. nacos部署

3.1 部署模式

Nacos支持三种部署模式:

  1. 单机模式
    用于测试和单机试用
  2. 集群模式
    用于生产环境,确保高可用
  3. 多集群模式
    用于多数据中心场景

默认Nacos使用嵌入式数据库derby实现数据的存储。所以,如果启动多个默认配置下的Nacos节点,数据存储存在一致性的问题。为了解决这个问题,Nacos采用集中式存储的方式来支持集群化部署,目前只支持mysql的存储。

spring boot项目集成nacos springboot集成nacos集群_java_02


官网推荐,使用dns域名与负载均衡器结合的方式,进行集群部署。

本文采用集群模式进行部署,但是不配置部署SLB和DNS处理。

3.2 集群模式部署过程

3.2.1 部署环境

linux版本:CentOS Linux release 7.2.1511 (Core)
jdk版本:jdk-8u241-linux-x64.tar.gz
nacos版本:nacos-server-2.0.3.tar.gz
nacos下载地址:https://github.com/alibaba/nacos/releases

3.2.2 部署步骤

  1. 解压文件
    tar -zvxf nacos-server-2.0.3.tar.gz
  2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql
create database nacos;
create user nacos identified by 'nacos';
GRANT all on nacos.* to 'nacos'@'%' with grant option;
FLUSH PRIVILEGES;

其中:
	all代表接受所有操作,比如 select,insert,delete....;
	*.* 代表所有库下面的所有表;
	% 代表这个用户允许从任何地方登录;为了安全期间,这个%可以替换为你允许的ip地址;
	flush privileges刷新mysql用户权限相关表;

执行nacos-mysql.sql脚本。

spring boot项目集成nacos springboot集成nacos集群_java_03


3. 修改上面截图的 application.properties , 加入如下内容(mysql的相关配置)

spring.datasource.platform=mysql

### Count of DB:
db.num=1

### Connect URL of DB:
db.url.0=jdbc:mysql://192.168.65.162:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
db.user.0=nacos
db.password.0=nacos

注意url中的配置项: useLegacyDatetimeCode=false&serverTimezone=UTC
若无此项,启动时会报错:Nacos Server did not start because dumpservice bean construction failure : No DataSource set

  1. 单机启动测试MySQL
sh startup.sh -m standalone

浏览器访问:http://192.168.65.161:8848/nacos

spring boot项目集成nacos springboot集成nacos集群_spring_04


默认的账号密码就是:nacos/nacos

增加一条配置项

spring boot项目集成nacos springboot集成nacos集群_java_05


MySQL配置项数据库更新

spring boot项目集成nacos springboot集成nacos集群_微服务_06


数据库更新与系统界面一致,说明MySQL配置成功。

  1. 修改集群配置文件
cp cluster.conf.example cluster.conf
vi cluster.conf
192.168.65.160:8848
192.168.65.161:8848
192.168.65.162:8848
  1. 集群启动
sh start.sh

分别启动三个节点,界面集群管理-节点列表中可查看三个节点的状态信息

spring boot项目集成nacos springboot集成nacos集群_spring_07

4. springboot集成nacos使用

4.1 服务发现和服务健康监测

Springboot使用nacos进行服务注册与服务发现

  1. 引入jar包
<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
      <version>2.2.0.RELEASE</version>
    </dependency>
    <dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      <version>2.2.0.RELEASE</version>
    </dependency>

    <dependency>
      <groupId>org.springframework.cloud</groupId>
      <artifactId>spring-cloud-starter-openfeign</artifactId>
    </dependency>
  1. 增加配置项
spring.application.name=nacos-provider/nacos-consumer
spring.cloud.nacos.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848
spring.cloud.nacos.config.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848
spring.cloud.nacos.discovery.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848
  1. provider代码
    引入上述jar包以及增加配置项后,提供常规的controller中restful风格api接口即可
@RestController
@RequestMapping("/test/")
public class TestController {

    @RequestMapping("hello")
    public String getTest(String name){
        return "hello:"+name;
    }
}
  1. consumer代码
// 1. 启动类中加入 注解 @EnableFeignClients
@EnableFeignClients
@SpringBootApplication
public class App {
    public static void main( String[] args ) {
        SpringApplication.run(App.class);
    }
}

// 2. client工具类,指明服务提供方名称
@FeignClient("nacos-provider")
public interface TestClient {
    @RequestMapping("/test/hello?name={name}")
    String getTestHello(@Valid @PathVariable ("name") String name);
}

// 3. 引入使用即可
@RestController
@RequestMapping("/consume/test")
public class TestController {

    @Autowired
    private TestClient testClient;

    @RequestMapping("hello")
    public String getTest(String name){
        String rest = testClient.getTestHello(name);
        return rest;
    }
}

spring boot项目集成nacos springboot集成nacos集群_spring_08

4.2 动态配置服务

  1. 引入jar包
<dependency>
      <groupId>com.alibaba.cloud</groupId>
      <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
      <version>2.2.0.RELEASE</version>
    </dependency>
  1. 配置信息 bootstrap.properties
spring.application.name=nacos-provider
spring.profiles.active=dev

spring.cloud.nacos.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848
spring.cloud.nacos.config.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848
spring.cloud.nacos.discovery.server-addr=192.168.65.160:8848,192.168.65.161:8848,192.168.65.162:8848

spring.cloud.nacos.config.file-extension=properties
spring.cloud.nacos.config.group=DEFAULT_GROUP
  1. nacos增加配置项
    data id可以根据配置文件中的spring.application.name-spring.profiles.active进行指定
    而且此处指定为properties类型
  2. spring boot项目集成nacos springboot集成nacos集群_DNS_09


  3. spring boot项目集成nacos springboot集成nacos集群_微服务_10

  4. 代码使用
@RestController
@RequestMapping("/test/")
@RefreshScope
public class TestController {

    @Value("${username}")
    private String username;

    @Value("${userpwd}")
    private String userpwd;

    @RequestMapping("config")
    public String getConfig(){
        return "username:"+username+";userpwd:"+userpwd;
    }
}