Nacos 详解

Nacos是阿里的一个开源产品,是针对微服务架构中的服务发现、配置管理、服务治理的综合型解决方案。

1.1 什么是配置

应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数 据库连接参数、启动参数等

1.2 什么是配置中心

在微服务架构中,当系统从一个单体应用,被拆分成分布式系统上一个个服务节点后,配置文件也必须跟着迁移 (分割),这样配置就分散了。配置中心将配置从各应用中剥离出来,对配置进行统一管理,应用自身不需要自己去 管理配置,各个服务从配置中心中获取配置。

为什么用配置中心?

传统应用配置往往是本地静态配置,修改起来非常麻烦。而且在发布的时候,也容易出现问题,格式不标准等,使用配置中心,对配置进行统一管理,各个服务从配置中心中获取配置,实现动态配置。让配置标准化。

配置中心的服务流程如下:

1、用户在配置中心更新配置信息。

2、服务A和服务B及时得到配置更新通知,从配置中心获取配置。

2、外部mysql数据库支持

  • 1.安装数据库,版本要求:5.6.5+ ,mysql 8 以下
  • 2.初始化mysql数据库,新建数据库nacos_config,数据库初始化文件:${nacoshome}/conf/nacos-mysql.sql
  • 3.修改${nacoshome}/conf/application.properties配置文件增加支持mysql数据源配置(目前只支持 mysql),添加mysql数据源的url、用户名和密码。

3.Nacos配置入门

3.1 发布配置

Data ID: nacos‐simple‐demo.yaml

Group : DEFAULT_GROUP

配置格式: YAML

配置内容: common:

                        config1: something

Nacos 详解_第1张图片3.2 nacos客户端获取配置

新建项目,引入依赖:


    com.alibaba.nacos
    nacos‐client
    1.1.3

类:

public class SimpleDemoMain {
public static void main(String[] args) throws NacosException {
    //nacos 地址
    String serverAddr = "127.0.0.1:8848";
    //Data Id
    String dataId = "nacos‐simple‐demo.yaml";
    //Group
    String group = "DEFAULT_GROUP";
    Properties properties = new Properties();
    properties.put("serverAddr",serverAddr);
    ConfigService configService = NacosFactory.createConfigService(properties);
    //获取配置,String dataId, String group, long timeoutMs
    String content = configService.getConfig(dataId, group, 5000);
    System.out.println(content);
    }
}

4 Nacos配置管理模型

对于Nacos配置管理,通过Namespace、group、Data ID能够定位到一个配置集。

Nacos 详解_第2张图片

配置集(Data ID)

在系统中,一个配置文件通常就是一个配置集,一个配置集可以包含了系统的各种配置信息,例如,一个配置集可 能包含了数据源、线程池、日志级别等配置项。

配置项

配置集中包含的一个个配置内容就是配置项。它代表一个具体的可配置的参数与其值域,通常以 key=value 的形 式存在。例如我们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。

 配置分组(Group)

配置分组是对配置集进行分组,不同的配置分组下可以有 相同的配置集(Data ID)。配置分组的名称默 认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不同的项目或应用,业务业务隔离-Group分组:,例如:学生管理系统的配置集 可以定义一个group为:STUDENT_GROUP。

有两个微服务,一个是订单系统,一个是用户系统,用group对其分组

命名空间(Namespace)

命名空间(namespace)可用于进行不同环境的配置隔离。例如可以隔离开发环境、测试环境和生产环境,因为 它们的配置可能各不相同,或者是隔离不同的用户,不同的开发人员使用同一个nacos管理各自的配置,可通过 namespace隔离。不同的命名空间下,可以存在相同名称的配置分组(Group) 或 配置集。

Nacos 详解_第3张图片

4.2 命名空间管理

4.2.1namespace 隔离设计

namespace 的设计是 nacos 基于此做多环境以及多用户进行隔离,不同的开发环境就是创建不同的namespace,每个用户也有自己的namespace

新建命名空间

Nacos 详解_第4张图片

在编写程序获取配置集过程中没有感知到这个参数的输入,那么 nacos 统一会使用一个默认的 namespace 作为输入,nacos config 会使用一个空字符串作为默认的参数来初始化,对应界面上就是public命名空间。namesace 为 public 是 nacos 的一个保留空间,如果您需要创建自己的 namespace,不要和 public 重名,

Nacos支持 YAML、Properties、TEXT、JSON、XML、HTML 等常见配置格式

可以导入配置、导出配置、也可以克隆配置,克隆到其他命名空间。

Nacos通过提供配置版本管理及其一键回滚能力,帮助用户改错配置的时候能够快速恢复,降低微服务系统在配置 管理上的可用性风险。

4.2.3 监听查询

Nacos提供监听者查询能力,同时提供客户端当前配置的MD5校验值,以便帮助用户更好的检查配 置变更是否推送到 Client 端。

5 Nacos配置管理应用于分布式系统

创建两个微服务,service1、service2,并添加依赖和配置



    com.alibaba.cloud
    spring-cloud-starter-alibaba-nacos-config
server:
    port: 56010 #启动端口 命令行注入
spring:
    application:
        name: service1
    cloud:
        nacos:
            config:
                server‐addr: 127.0.0.1:8848 # 配置中心地址
                file‐extension: yaml
                namespace: c67e4a97‐a698‐4d6d‐9bb1‐cfac5f5b51c4 # 开发环境
                group: TEST_GROUP # 测试组

配置优先级:

Nacos 详解_第5张图片

C:内部规则,用服务名+后缀的 配置。

nacos集群:

(1)安装3个以上Nacos

我们可以复制之前已经解压好的nacos文件夹,分别命名为nacos、nacos1、nacos2

(2)配置集群配置文件

配置ip、端口号

  1. 在所有nacos目录的conf目录下,有文件 cluster.conf.example ,将其命名为 cluster.conf ,并将每行配置成 ip:port。(请配置3个或3个以上节点)
  2. 更改nacos/的conf目录下application.properties中server.port,防止端口冲突。

每一个都要这样配置,然后依次启动。

Nacos 详解_第6张图片

 

客户端配置:

spring:
    application:
        name: xxxx
    cloud:
        nacos:
            config:
                server‐addr: 127.0.0.1:8848,127.0.0.1:8849,127.0.0.1:8850

如果一个宕机了,就会选举一个新的leader

服务注册与服务发现:

静态服务调用需要在本地设置想要调用服务的ip和端口,如果服务发生变化,相应配置也要修改,不能够动态的分配。

在分布式开发者,会有多个服务,服务之间存在相互调用的关系。为了更好的管理服务,提出了服务注册中心,每一个服务都会注册进注册中心。一个服务通过注册中心,获取到注册到其中的服务实例的信息并调用。

服务调用

Spring Cloud 常见的集成方式是使用Feign+Ribbon技术来完成服务间远程调用及负载均衡的,

(2)微服务会定期从Nacos Server(服务发现中心)获取服务实例列表。

(3)当ServiceA调用ServiceB时,ribbon组件从本地服务实例列表中查找ServiceB的实例,如获取了多个实例如 Instance1、Instance2。这时ribbon会通过用户所配置的负载均衡策略从中选择一个实例。(轮询策略、随机策略、加权策略)

(4)最终,Feign组件会通过ribbon选取的实例发送http请求。 采用Feign+Ribbon的整合方式,是由Feign完成远程调用的整个流程。而Feign集成了Ribbon,Feign使用Ribbon 完成调用实例的负载均衡。

Nacos 详解_第7张图片

负载均衡就是将用户请求(流量)通过一定的策略,分摊在多个服务实例上执行它是系统处理高并发、缓解网络压力和进行服务端扩容的重要手段之一。它分为服务端负载均衡和客户端负载均衡。 

服务端负载均衡:

当客户端请求来临时,负载均衡服务器按照某种配置好的规则(负 载均衡算法)从可用服务实例清单中选取其一去处理客户端的请求。这就是服务端负载均衡。

例如Nginx,通过Nginx进行负载均衡,客户端发送请求至Nginx,Nginx通过负载均衡算法,在多个服务器 之间选择一个进行访问。即在服务器端再进行负载均衡算法分配。

客户端负载均衡:

在ribbon客户端会有一个服务实例地址列表,在发送请求前通过负载均衡算法选择一个服务实例,然后进行访问,这是客户端负载均衡。即在客户端就进行负载均 衡算法分配。

轮询、随机等策略

ZoneAvoidanceRule: 默认规则,复合判断server所在区域的性能和server的可用性选择服务器

BestAvailableRule: 会先过滤掉由于多次访问故障而处于断路器跳闸状态的服务,然后选择一个并发量最小的 服务;

account‐service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRul
//account-service 是调用的服务的名称,后面的组成部分是固定的。

Feign

Feign可以帮助我们更快捷、优雅地调用HTTP API

引入相关的依赖,

指定@FeignClient value为serviceB,则说明这个类的远程目标为spring cloud的服务名称为serviceB的微服 务。

你可能感兴趣的:(java,开发语言)