服务热线
135-6963-3175
nacos的使用
nacos可以做配置中心和微服务注册中心
前置操作:
在nacos建立命名空间(dev,fat,prod)
一、配置中心
1、pom引入依赖:
<dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency>
2、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&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注册中心列表
扩展知识:
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。
待补充.....