Nacos详解

444 阅读5分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

CAP理论

CAP理论是分布式架构中重要理论

  • 一致性(Consistency) (所有节点在同一时间具有相同的数据)
  • 可用性(Availability) (保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作)

Nacos注册概括来说有6个步骤

  1. 服务容器负责启动,加载,运行服务提供者。
  2. 服务提供者在启动时,向注册中心注册自己提供的服务。
  3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
  4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
  5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
  6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

核心概念

  • Region:物理数据中心,资源创建后不可修改
  • Available Zone:一个Region内的物理区域,具有独立的网络等
  • Endpoint:Region内每个服务的入口域名
  • Namespace:命名空间,用于隔离租户配置,每个命名空间可以包含同名的Group或Data ID;最常见的用途是区分不同的环境,如开发环境、测试环境
  • Configuration:配置文件
  • Configuration Management:配置管理
  • Configuration Item:配置项,以 key=value形式出现
  • Configuration Set:配置集,每个配置文件都是一个配置集
  • Data ID:配置集的ID,管理配置的维度之一,每个系统都有多个配置集,Data ID 用来标识每个配置集
  • Group:配置集的分组,也是组织配置的维度之一,每个分组可以包含相同的Data ID,默认分组DEFAULT_GROUP,典型应用是对于每个程序或组件使用一个分组
  • Configuration Snapshot:配置快照,nacos客户端会生成快照,当nacos不可用时,程序可使用快照继续工作
  • Service:通过网络给客户端提供的功能
  • Service Name:服务名,唯一标识一个Service
  • Service Registry:存储服务实例和服务负载均衡策略的数据库
  • Service Discovery:服务发现
  • Metadata:自定义配置信息,如灾难恢复策略、负载均衡策略、认证配置和各种标签,从作用范围上划分为服务级别元信息、虚拟集群元信息和实例元信息
  • Application:service的一个属性,用于标记Service是谁提供的
  • Service Group:服务组
  • Virtual Cluster:同一服务下的服务实例可以进一步分类。这种分类的一个可能单位是虚拟集群
  • Instance:提供一个或多个服务的具有可访问网络地址(IP:Port)的进程
  • Weight:实例级配置。Weight是一个浮点数。权重越大,实例期望分配的流量就越大
  • Health Check:以指定方式对服务下的实例进行健康检查,以确保实例能够正常工作
  • Protect Threshold:保护阈值

Protect Threshold:

为了防止由于某些不健康实例而导致流量流向健康实例,从而导致流量压力、健康实例崩溃和最终雪崩,健康保护阈值应该定义为0到1之间的浮点数。

当域名健康状态实例占实例总数的比例小于该值时,无论该实例的健康状态如何,都将该实例返回给客户端。尽管这可能导致丢失一些流量,但我们确保剩余的健康实例能够正常工作

配置管理

配置

在 bootstrap.properties文件中,添加配置:

spring.cloud.nacos.config.server-addr=127.0.0.1:8848
spring.application.name=example

Data ID的构成规则: prefix{prefix}-{spring.profiles.active}.${file-extension}

  • prefix:就是 spring.application.name
  • file-extension:支持properties和yaml

使用

在nacos中,添加example.properties配置:

user.name=nacos-config-properties
user.age=90

代码中使用:

@SpringBootApplication
public class ProviderApplication {

    public static void main(String[] args) {
        ConfigurableApplicationContext applicationContext = SpringApplication.run(ProviderApplication.class, args);
        String userName = applicationContext.getEnvironment().getProperty("user.name");
        String userAge = applicationContext.getEnvironment().getProperty("user.age");
        System.err.println("user name :"+userName+"; age: "+userAge);
    }
}

默认启用 自动更新功能,可以使用 spring.cloud.nacos.config.refresh.enabled=false 关闭

可以彻底关闭配置功能,使用 spring.cloud.nacos.config.enabled = false

服务发现

配置(服务端和客户端都需要配置)

application.properties 中添加:

server.port=8070
spring.application.name=service-provider
spring.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 {
		@RequestMapping(value = "/echo/{string}", method = RequestMethod.GET)
		public String echo(@PathVariable String string) {
			return "Hello Nacos Discovery " + string;
		}
	}
}

客户端

@SpringBootApplication
@EnableDiscoveryClient
public class NacosConsumerApplication {

    @LoadBalanced
    @Bean
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }

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

    @RestController
    public class TestController {

        private final RestTemplate restTemplate;

        @Autowired
        public TestController(RestTemplate restTemplate) {this.restTemplate = restTemplate;}

        @RequestMapping(value = "/echo/{str}", method = RequestMethod.GET)
        public String echo(@PathVariable String str) {
            return restTemplate.getForObject("http://service-provider/echo/" + str, String.class);
        }
    }
}

配置介绍

配置项Key默认值说明
服务端地址spring.cloud.nacos.discovery.server-addrNacos Server 启动监听的ip地址和端口
服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名
服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组
权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100,数值越大,权重越大
网卡名spring.cloud.nacos.discovery.network-interface当IP未配置时,注册的IP为此网卡所对应的IP地址,如果此项也未配置,则默认取第一块网卡的地址
注册的IP地址spring.cloud.nacos.discovery.ip优先级最高
注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置,会自动探测
命名空间spring.cloud.nacos.discovery.namespace常用场景之一是不同环境的注册的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。
AccessKeyspring.cloud.nacos.discovery.access-key当要上阿里云时,阿里云上面的一个云账号名
SecretKeyspring.cloud.nacos.discovery.secret-key当要上阿里云时,阿里云上面的一个云账号密码
Metadataspring.cloud.nacos.discovery.metadata使用Map格式配置,用户可以根据自己的需要自定义一些和服务相关的元数据信息
日志文件名spring.cloud.nacos.discovery.log-name
集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称
接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名,通过此域名可以动态地拿到服务端地址
是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可
是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch
注册的IP地址类型spring.cloud.nacos.discovery.ip-typeIPv4可以配置IPv4和IPv6两种类型