NACOS原理与实战

Posted 镜水灵动

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NACOS原理与实战相关的知识,希望对你有一定的参考价值。

一、NACOS原理

1.2.1 生产者注册与心跳

服务提供者启动得时候将自己注册到NacosServer,并且后期定时发送心跳。

1.2.2 消费者拉取与更新

消费者启动时去NacosServer拉去服务列表,并且后面10s定时拉去到本地。服务调用也是基于内存中得服务列表,根据负载均衡算法选举一个发起调用。

1.2.3 NacosServer

ConcurrentHashMap保存服务列表(服务元数据信息以及服务实例),基于RAFT算法同步给其他节点。探活以及健康检查。定时检查,挂了得服务通过UDP发送给消费者。对于不健康得服务,减少权重即调用次数。

Nacos可以搭建主从架构。Nacos自己实现了SpringCloud 对外开放的ServiceRegistry接口,注册,不注册,销毁,状态设置与获取从而融入SpringCloud生态。

1.2.4 集群搭建

  • 启动3台nacosServer。注意一定要连接同一台数据库。

  • 通过nginx进行负载均衡

    upstream nacos {
    server 127.0.0.1:8848;
    server 127.0.0.1:8849;
    server 127.0.0.1:8850;
    }

    server {
    listen 8088;
    server_name localhost;
    location /nacos/ {
      proxy_pass http://nacos/nacos/;
    }
    }
  • 代码中指定连接nginx,通过Nginx来访问nacos

    spring.cloud.nacos.disdiscovery.server-addr = 127.0.0.1:8088
    spring.cloud.nacos.config.server-addr = 127.0.0.1:8088

二、配置中心

server.port=8099
#配置默认的配置文件nacos-server.properties
spring.application.name=nacos-server

spring.cloud.nacos.config.namespace=0c242c4f-e79c-4b92-a3e2-2dbc65d390d5
spring.cloud.nacos.config.group=dev
#默认是properties
#spring.cloud.nacos.config.file-extension=yml

spring.cloud.nacos.disdiscovery.server-addr = 127.0.0.1:8848
spring.cloud.nacos.config.server-addr = 127.0.0.1:8848

#配置第二个配置文件dubbo.properties
spring.cloud.nacos.config.extension-configs[0].refresh=true
spring.cloud.nacos.config.extension-configs[0].data-id=mydubbo.yaml
spring.cloud.nacos.config.extension-configs[0].group=dev
#配置第三个配置文件kafka.properties
spring.cloud.nacos.config.extension-configs[1].refresh=true
spring.cloud.nacos.config.extension-configs[1].data-id=mykafka.yaml
spring.cloud.nacos.config.extension-configs[1].group=dev

通过 Spring Cloud 原生注解 @RefreshScope 实现配置自动更新

package top.happylaishop.nacos.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.client.ServiceInstance;
import org.springframework.cloud.client.loadbalancer.LoadBalancerClient;
import org.springframework.context.ApplicationContext;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;
import top.happylaishop.common.dto.ObjectRestResponse;

@RestController
@Slf4j
public class BaseController {

  @Autowired
  private LoadBalancerClient loadBalancerClient;
  @Autowired
  private RestTemplate restTemplate;
  @Autowired
  private ApplicationContext applicationContext;
  @Value("${mydubbo.enable:false}")
  private boolean mydubbo;
  @Value("${mykafka.name:kafka}")
  private String mykafka;

  /**
    * 这里注意restTemplate若使用ip:port方式restTemplate不能加loadBalance注解
    * @param ip
    * @return
    */
  @RequestMapping("/demo/{ip}")
  public ObjectRestResponse<String> demo(@PathVariable String ip) {
      String name = applicationContext.getEnvironment().getProperty("common.name");
      log.info("get from config common.name:{}", name);
      log.info("get from config common.mykafka:{}, mydubbo:{}", mykafka, mydubbo);
      ServiceInstance sentinel = loadBalancerClient.choose("sentinel");
      log.info("sentinel ip:{}, port:{}", sentinel.getUri(), sentinel.getPort());
      return restTemplate.getForObject(sentinel.getUri() + "/limit?ip=" + ip, ObjectRestResponse.class);
  }
}

注意:

1.扩展配置优先级是 spring.cloud.nacos.config.extension-configs[n].data-id 其中n的值越大,优先级越高。
2.通过 spring.cloud.nacos.config.extension-configs[n].data-id 的配置方式来支持多个 Data Id 的配置。
通过 spring.cloud.nacos.config.extension-configs[n].group 的配置方式自定义 Data Id 所在的组,默认DEFAULT_GROUP。
3.通过 spring.cloud.nacos.config.extension-configs[n].refresh 的配置方式来控制该 Data Id 在配置变更时,是否支持应用中可动态刷新, 感知到最新的配置值。默认是不支持的。
4.spring.cloud.nacos.config.file-extension=properties不影响extension-configs[n]配置
spring.cloud.nacos.config.extension-configs[n].data-id=kafka.properties
spring.cloud.nacos.config.extension-configs[n].data-id=kafka.yaml
5.默认的data-id
[spring.application.name].[spring.cloud.nacos.config.file-extension]
6.namespace用来指定某个微服务,group用来指定环境(dev,uat,pro)

三、注册中心

server.port=8099
spring.application.name=nacos-server
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848

通过 Spring Cloud 原生注解 @EnableDiscoveryClient 开启服务注册发现功能

案例:配置中心的代码。

四、参考文档

  1. https://github.com/alibaba/nacos


以上是关于NACOS原理与实战的主要内容,如果未能解决你的问题,请参考以下文章

nacos配置与注册

SpringCloud系列——nacos组件服务注册与发现功能实战

微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析

微服务架构 | *3.5 Nacos 服务注册与发现的源码分析 #yyds干货盘点#

学习Nacos?咱先把服务搞起来,实战教程~

微服务架构 | *2.5 Nacos 长轮询定时机制的源码分析