技术交流28群

服务热线

135-6963-3175

微信服务号

nacos注册配置中心的使用 更新时间 2021-10-21 浏览5488次

nacos的使用

nacos可以做配置中心和微服务注册中心

前置操作:

在nacos建立命名空间(dev,fat,prod)

1602685840223.png


一、配置中心

1、pom引入依赖:

 <dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
 </dependency>

2、nacos新建配置

1602684721056.png


nacos配置

当做配置中心时多环境配置:

可以通过namespace用于区分环境,用data-id用于区分配置文件。

Data-id匹配规则:服务名(一般为服务名)-dev(环境).yml(文件类型)

${spring.cloud.nacos.config.prefix}-${spring.profile.active}.${spring.cloud.nacos.config.file-extension}


springcloud的bootstrap.yml配置文件中:

#微服务应用配置
spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      config:
        file-extension: yaml
        server-addr: http://nacos.local.com:8481
        namespace: 1095bdf9-564c-43a2-9b37-ba79b4263446
        prefix: cloud-gateway
        group: DEFAULT_GROUP
  profiles:
    active: dev


启动项目,查看控制台日志:


Connected to the target VM, address: '127.0.0.1:52693', transport: 'socket'
  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.2.6.RELEASE)
2020-10-14 22:25:38.721 [main] INFO  c.a.n.client.config.impl.LocalConfigInfoProcessor - LOCAL_SNAPSHOT_PATH:/Users/zhangzhixiang/nacos/config
2020-10-14 22:25:38.776 [main] INFO  com.alibaba.nacos.client.config.impl.Limiter - limitTime:5.0
2020-10-14 22:25:38.839 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[cloud-gateway] & group[DEFAULT_GROUP]
2020-10-14 22:25:38.848 [main] WARN  c.a.cloud.nacos.client.NacosPropertySourceBuilder - Ignore the empty nacos configuration and get it based on dataId[cloud-gateway.yaml] & group[DEFAULT_GROUP]
2020-10-14 22:25:38.869 [main] INFO  com.alibaba.nacos.client.config.utils.JVMUtil - isMultiInstance:false
2020-10-14 22:25:38.870 [main] DEBUG c.a.cloud.nacos.client.NacosPropertySourceBuilder - Loading nacos data, dataId: 'cloud-gateway-dev.yaml', group: 'DEFAULT_GROUP', data: spring:
  datasource:
    driver-class-name: com.mysql.jdbc.Driver
    type: org.apache.commons.dbcp2.BasicDataSource
    url: jdbc:mysql://192.168.1.104:3306/nacos?useUnicode=true&amp;characterEncoding=UTF-8&useSSL=false
    username: root
    password: 123456
  aop:
    proxy-target-class: true
  redis:
    password: 1234
    database: 10
    port: 6379
    jedis:
      pool:
        max-idle: 8
        min-idle: 0
        max-active: 8
        max-wait: -1
    host: 192.168.1.104
    timeout: 5000
2020-10-14 22:25:38.877 [main] INFO  o.s.c.b.c.PropertySourceBootstrapConfiguration - Located property source: [BootstrapPropertySource {name='bootstrapProperties-cloud-gateway-dev.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-cloud-gateway.yaml,DEFAULT_GROUP'}, BootstrapPropertySource {name='bootstrapProperties-cloud-gateway,DEFAULT_GROUP'}]
2020-10-14 22:25:38.883 [main] INFO  com.sinotrans.frosapp.gateway.GatewayApplication - The following profiles are active: dev
2020-10-14 22:25:40.118 [main] INFO  o.springframework.cloud.context.scope.GenericScope - BeanFactory id=5f2f82ae-ff80-39f3-a361-838fa822e856
2020-10-14 22:25:40.572 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-10-14 22:25:40.574 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactiveLoadBalancerConfig' of type [org.springframework.cloud.client.loadbalancer.reactive.LoadBalancerBeanPostProcessorAutoConfiguration$ReactiveLoadBalancerConfig] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-10-14 22:25:40.577 [main] INFO  o.s.c.s.PostProcessorRegistrationDelegate$BeanPostProcessorChecker - Bean 'deferringLoadBalancerExchangeFilterFunction' of type [org.springframework.cloud.client.loadbalancer.reactive.DeferringLoadBalancerExchangeFilterFunction] is not eligible for getting processed by all BeanPostProcessors (for example: not eligible for auto-proxying)
2020-10-14 22:25:40.944 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 3002 (http)

可以发现nacos配置中心配置已生效。


二、注册中心

1、pom引入依赖:

<dependency>
     <groupId>com.alibaba.cloud</groupId>
     <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>

2、配置

spring:
  application:
    name: cloud-gateway
  cloud:
    nacos:
      discovery:
        namespace: 1095bdf9-564c-43a2-9b37-ba79b4263446
        server-addr: http://nacos.local.com:8481
  profiles:
    active: dev

3、查看日志

2020-10-14 22:42:38.618 [main] INFO  com.alibaba.nacos.client.naming - initializer namespace from System Property :null
2020-10-14 22:42:38.628 [main] DEBUG com.alibaba.nacos.client.naming - server list provided by user: [http://nacos.local.com:8481]
2020-10-14 22:42:38.628 [com.alibaba.nacos.client.naming.updater] DEBUG com.alibaba.nacos.client.naming - server list provided by user: [http://nacos.local.com:8481]
2020-10-14 22:42:38.636 [com.alibaba.nacos.naming.failover] DEBUG com.alibaba.nacos.client.naming - failover switch is not found, failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
2020-10-14 22:42:38.891 [main] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/service/list?app=unknown&pageSize=2147483647&groupName=DEFAULT_GROUP&encoding=UTF-8&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&pageNo=1
2020-10-14 22:42:38.892 [Nacso-Watch-Task-Scheduler-1] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/service/list?app=unknown&pageSize=2147483647&groupName=DEFAULT_GROUP&encoding=UTF-8&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&pageNo=1
2020-10-14 22:42:39.358 [main] INFO  o.s.boot.web.embedded.netty.NettyWebServer - Netty started on port(s): 3002
2020-10-14 22:42:39.366 [main] INFO  com.alibaba.nacos.client.naming - [BEAT] adding beat: {"cluster":"DEFAULT","ip":"192.168.1.200","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":3002,"scheduled":false,"serviceName":"DEFAULT_GROUP@@cloud-gateway","stopped":false,"weight":1.0} to beat map.
2020-10-14 22:42:39.414 [main] INFO  com.alibaba.nacos.client.naming - [REGISTER-SERVICE] 1095bdf9-564c-43a2-9b37-ba79b4263446 registering service DEFAULT_GROUP@@cloud-gateway with instance: {"clusterName":"DEFAULT","enabled":true,"ephemeral":true,"healthy":true,"instanceHeartBeatInterval":5000,"instanceHeartBeatTimeOut":15000,"ip":"192.168.1.200","ipDeleteTimeout":30000,"metadata":{"preserved.register.source":"SPRING_CLOUD"},"port":3002,"weight":1.0}
2020-10-14 22:42:39.423 [main] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/instance?app=unknown&metadata=%7B%22preserved.register.source%22%3A%22SPRING_CLOUD%22%7D&ip=192.168.1.200&weight=1.0&ephemeral=true&serviceName=DEFAULT_GROUP%40%40cloud-gateway&encoding=UTF-8&groupName=DEFAULT_GROUP&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&port=3002&enable=true&healthy=true&clusterName=DEFAULT
2020-10-14 22:42:39.435 [main] INFO  c.a.cloud.nacos.registry.NacosServiceRegistry - nacos registry, DEFAULT_GROUP cloud-gateway 192.168.1.200:3002 register finished
2020-10-14 22:42:39.438 [main] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/service/list?app=unknown&pageSize=2147483647&groupName=DEFAULT_GROUP&encoding=UTF-8&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&pageNo=1
2020-10-14 22:42:39.456 [main] INFO  com.sinotrans.frosapp.gateway.GatewayApplication - Started GatewayApplication in 4.508 seconds (JVM running for 4.99)
2020-10-14 22:42:39.462 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [subscribe] cloud-gateway+DEFAULT_GROUP+1095bdf9-564c-43a2-9b37-ba79b4263446
2020-10-14 22:42:39.463 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [add-listener] ok, tenant=1095bdf9-564c-43a2-9b37-ba79b4263446, dataId=cloud-gateway, group=DEFAULT_GROUP, cnt=1
2020-10-14 22:42:39.464 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [subscribe] cloud-gateway-dev.yaml+DEFAULT_GROUP+1095bdf9-564c-43a2-9b37-ba79b4263446
2020-10-14 22:42:39.464 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [add-listener] ok, tenant=1095bdf9-564c-43a2-9b37-ba79b4263446, dataId=cloud-gateway-dev.yaml, group=DEFAULT_GROUP, cnt=1
2020-10-14 22:42:39.464 [main] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [subscribe] cloud-gateway.yaml+DEFAULT_GROUP+1095bdf9-564c-43a2-9b37-ba79b4263446
2020-10-14 22:42:39.464 [main] INFO  com.alibaba.nacos.client.config.impl.CacheData - [fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] [add-listener] ok, tenant=1095bdf9-564c-43a2-9b37-ba79b4263446, dataId=cloud-gateway.yaml, group=DEFAULT_GROUP, cnt=1
2020-10-14 22:42:39.473 [com.alibaba.nacos.client.Worker.longPolling.fixed-nacos.local.com_8481-1095bdf9-564c-43a2-9b37-ba79b4263446] INFO  com.alibaba.nacos.client.config.impl.ClientWorker - get changedGroupKeys:[]
2020-10-14 22:42:43.637 [com.alibaba.nacos.naming.failover] DEBUG com.alibaba.nacos.client.naming - failover switch is not found, failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
2020-10-14 22:42:44.416 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - [BEAT] 1095bdf9-564c-43a2-9b37-ba79b4263446 sending beat to server: {"cluster":"DEFAULT","ip":"192.168.1.200","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":3002,"scheduled":false,"serviceName":"DEFAULT_GROUP@@cloud-gateway","stopped":false,"weight":1.0}
2020-10-14 22:42:44.419 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/instance/beat?app=unknown&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&port=3002&clusterName=DEFAULT&ip=192.168.1.200&serviceName=DEFAULT_GROUP%40%40cloud-gateway&encoding=UTF-8
2020-10-14 22:42:48.639 [com.alibaba.nacos.naming.failover] DEBUG com.alibaba.nacos.client.naming - failover switch is not found, failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
2020-10-14 22:42:49.439 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - [BEAT] 1095bdf9-564c-43a2-9b37-ba79b4263446 sending beat to server: {"cluster":"DEFAULT","ip":"192.168.1.200","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":3002,"scheduled":false,"serviceName":"DEFAULT_GROUP@@cloud-gateway","stopped":false,"weight":1.0}
2020-10-14 22:42:49.442 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/instance/beat?app=unknown&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&port=3002&clusterName=DEFAULT&ip=192.168.1.200&serviceName=DEFAULT_GROUP%40%40cloud-gateway&encoding=UTF-8
2020-10-14 22:42:53.644 [com.alibaba.nacos.naming.failover] DEBUG com.alibaba.nacos.client.naming - failover switch is not found, failover00-00---000-VIPSRV_FAILOVER_SWITCH-000---00-00
2020-10-14 22:42:54.454 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - [BEAT] 1095bdf9-564c-43a2-9b37-ba79b4263446 sending beat to server: {"cluster":"DEFAULT","ip":"192.168.1.200","metadata":{"preserved.register.source":"SPRING_CLOUD"},"period":5000,"port":3002,"scheduled":false,"serviceName":"DEFAULT_GROUP@@cloud-gateway","stopped":false,"weight":1.0}
2020-10-14 22:42:54.456 [com.alibaba.nacos.naming.beat.sender] DEBUG com.alibaba.nacos.client.naming - Request from server: http://nacos.local.com:8481/nacos/v1/ns/instance/beat?app=unknown&namespaceId=1095bdf9-564c-43a2-9b37-ba79b4263446&port=3002&clusterName=DEFAULT&ip=192.168.1.200&serviceName=DEFAULT_GROUP%40%40cloud-gateway&encoding=UTF-8

4、查看nacos注册中心列表

1602686790965.png

扩展知识:

1、通过nacos java sdk进行数据的存取

主要涉及函数接口:

//发布或更新配置:
boolean publishConfig = configService.publishConfig(dataId, group, content);
//获取配置
String config = configService.getConfig(dataId, group, 5000);
//增加监听配置
configService.addListener(dataId, group, new PropertiesListener() {
   @Override
   public void innerReceive(Properties properties) {
       LOGGER.info("innerReceive: {}", properties);
   }
});
//删除配置
boolean removeConfig = configService.removeConfig(dataId, group);


代码示例:

@Autowired
private NacosDiscoveryProperties nacosDiscoveryProperties;
/**
*
* 发布或者更新配置 
*/
@Test
public void testPublishConfig(){
    Properties properties = new Properties();
    properties.put("serverAddr", nacosDiscoveryProperties.getServerAddr());
    if (!org.springframework.util.StringUtils.isEmpty(namespace)) {
       properties.put("namespace", namespace);
    }
    ConfigService configService = NacosFactory.createConfigService(properties);
    //第一个参数dataId,第二个参数groupName,第三个参数为内容
    configService.publishConfig("gateway-demo", "group-1", "123");
}

/**
*
* 监听
*/
@Test
public void testListenerConfig(){
    Properties properties = new Properties();
    properties.put("serverAddr", nacosDiscoveryProperties.getServerAddr());
    if (!org.springframework.util.StringUtils.isEmpty(namespace)) {
       properties.put("namespace", namespace);
    }
    ConfigService configService = NacosFactory.createConfigService(properties);
    Listener listener = new Listener() {
          @Override
          public Executor getExecutor() {
              return null;
          }
          @Override
          public void receiveConfigInfo(String configInfo) {
              refreshConfig(configInfo);
          }
     };
     //该方法在获取配置后,随即注册一个监听器,避免监听器通知用户刚刚才拉取的配置信息
     //第一个参数dataId,第二个参数groupName
     String configInfo = configService.getConfigAndSignListener("gateway-demo", "group-1", 4000, listener);
     refreshConfig(configInfo);    
}
/**
*处理刷新
*/
public void refreshConfig(String config){
  
}

/**
 * 删除配置
 * @param config
 */
@Test
public void removeConfig(String config){
        String namespace="dev";
        Properties properties = new Properties();
        properties.put("serverAddr", nacosDiscoveryProperties.getServerAddr());
        if (!org.springframework.util.StringUtils.isEmpty(namespace)) {
            properties.put("namespace", namespace);
        }
        try {
            ConfigService configService = NacosFactory.createConfigService(properties);
            boolean removeConfig = configService.removeConfig("gateway-demo", "group-1");
        }catch (Exception e){
            e.printStackTrace();
        }
}

2、增加nacos校验

nacos.core.auth.enabled=true..

3、nacos脑裂现象

一般是因为leader假死,节点通信故障导致重新选举产生多个小集群。

解决:

可以通过创建集群时保证选举的节点数量>总节点/2,且节点个数为奇数个有利于选举,比如3、5、7。

待补充.....