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
开启服务注册发现功能
案例:配置中心的代码。
四、参考文档
https://github.com/alibaba/nacos
以上是关于NACOS原理与实战的主要内容,如果未能解决你的问题,请参考以下文章
SpringCloud系列——nacos组件服务注册与发现功能实战
微服务架构 | *2.4 Nacos 获取配置与事件订阅机制的源码分析