Nacos实战
实战
环境
Nacos Server
System(uname -a)
: Linux VM-0-15-centos 3.10.0-1127.19.1.el7.x86_64 #1 SMP Tue Aug 25 17:23:54 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
Nacos Version
: nacos-server-2.0.3
Demo Application:
System
: macOS 10.14.6
JDK
: 1.8.0_251
Spring Boot
:2.2.13.RELEASE
Spring Cloud
:Hoxton.SR12
Spring Cloud Alibaba
: 2.2.5.RELEASE
Nacos Server 安装
配置中心
项目:wfbi-nacos
pom依赖
pom关键依赖
<!-- nacos config -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
Spring Boot & Spring Cloud Version
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.13.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.2.5.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR12</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
添加注解
配置使用类上添加@RefreshScope
支持配置动态刷新
@RefreshScope
public class WfbiNacosApplication {
...
}
字段添加@Value
注入配置值
@Value("${version:0.0}")
private String version;
添加配置
启动类bootstrap.properties
:
spring.application.name=nacos-service
# nacos config
spring.cloud.nacos.config.server-addr=192.168.1.10:8848
spring.cloud.nacos.config.namespace=84d737d0-bb77-4877-8e33-b971aeda2031
spring.cloud.nacos.config.group=user
namespace默认public
,group默认DEFAULT_GROUP
Nacos 增加如下配置:
在 Nacos Spring Cloud 中,dataId
的完整格式如下:
${prefix}-${spring.profiles.active}.${file-extension}
- prefix 默认为 spring.application.name 的值,也可以通过配置项
spring.cloud.nacos.config.prefix来配置。 - spring.profiles.active 即为当前环境对应的
profile,详情可以参考 Spring Boot文档。 注意:当 spring.profiles.active 为空时,对应的连接符 - 也将不存在,dataId 的拼接格式变成 p r e f i x . {prefix}. prefix.{file-extension} - file-exetension 为配置内容的数据格式,可以通过配置项 spring.cloud.nacos.config.file-extension 来配置。目前只支持
properties 和 yaml 类型。
服务注册/发现
项目:wfbi-nacos,服务消费者
项目:wfbi-good,服务生产者
pom依赖
pom关键依赖
<!-- nacos discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- 通过feign实现http调用-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
Feign(详细戳)是Spring Cloud提供的一个声明式的伪Http客户端, 它使得调用远程服务就像调用本地服务一样简单, 只需要创建一个接口并添加一个注解即可。
Nacos很好的兼容了Feign, Feign默认集成了 Ribbon(详细戳), 所以在Nacos下使用Fegin默认就实现了负载均衡的效果。
添加注解
- 早期在启动类上需要加上 @EnableDiscoveryClient注解开启服务注册/发现,现在已经可以不需要加了。
- 启动类添加
@EnableFeignClients
开启feign调用。
服务添加配置
启动类bootstrap.properties
:
# nacos discovery
spring.cloud.nacos.discovery.server-addr=192.168.1.10:8848
spring.cloud.nacos.discovery.namespace=84d737d0-bb77-4877-8e33-b971aeda2031
spring.cloud.nacos.discovery.group=user
namespace默认public
,group默认DEFAULT_GROUP
问题
Spring Boot&Spring Cloud&Spring Cloud Alibaba版本问题
描述:使用Spring Boot 2.5.4、Spring Cloud Hoxton.SR12、Spring Cloud Alibaba 2.2.5.RELEASE 报错
异常:
2021-09-10 16:16:09.101 ERROR 6705 — [ main] o.s.boot.SpringApplication : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘configurationPropertiesBeans’ defined in class path resource [org/springframework/cloud/autoconfigure/ConfigurationPropertiesRebinderAutoConfiguration.class]: Post-processing of merged bean definition failed; nested exception is java.lang.IllegalStateException: Failed to introspect Class [org.springframework.cloud.context.properties.ConfigurationPropertiesBeans] from ClassLoader [sun.misc.Launcher A p p C l a s s L o a d e r @ 2 a 139 a 55 ] a t o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . d o C r e a t e B e a n ( A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . j a v a : 579 ) [ s p r i n g − b e a n s − 5.3.9. j a r : 5.3.9 ] a t o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . c r e a t e B e a n ( A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . j a v a : 524 ) [ s p r i n g − b e a n s − 5.3.9. j a r : 5.3.9 ] a t o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t B e a n F a c t o r y . l a m b d a AppClassLoader@2a139a55] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) ~[spring-beans-5.3.9.jar:5.3.9] at org.springframework.beans.factory.support.AbstractBeanFactory.lambda AppClassLoader@2a139a55]atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:579) [spring−beans−5.3.9.jar:5.3.9]atorg.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:524) [spring−beans−5.3.9.jar:5.3.9]atorg.springframework.beans.factory.support.AbstractBeanFactory.lambdadoGetBean$0(AbstractBeanFactory.java:335) ~[spring-beans-5.3.9.jar:5.3.9]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234) ~[spring-beans-5.3.9.jar:5.3.9]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333) ~[spring-beans-5.3.9.jar:5.3.9]
解决:三者版本有对应关系
Spring Cloud&Spring Boot:依赖关系
Spring Cloud Alibaba&Spring Boot:依赖关系
Nacos 地址配置文件位置不正确
描述:Nacos相关参数配置在了application.properties文件中
异常:
java.net.ConnectException: [NACOS HTTP-GET] The maximum number of tolerable server reconnection errors has been reached
解决:
将Nacos相关参数配置到bootstrap.properties文件中
原理
服务治理概述
服务治理是微服务架构中最核心最基本的模块。用于实现各个微服务的自动化注册与发现
。
服务注册:
在服务治理框架中,都会构建一个注册中心,每个服务单元向注册中心登记自己提供服务的详细信息。并在注册中心形成一张服务的清单,服务注册中心需要以心跳的方式去监测清单中的服务是否可用,如果不可用,需要在服务清单中剔除不可用的服务。
服务发现:
服务调用方向服务注册中心咨询服务,并获取所有服务的实例清单,实现对具体服务实例的访问。
注册中心的原理
- 我们再启动的时候,就会把服务的信息告诉注册中心,同时拉去一份最新的1服务列表信息在本地。
- 每隔一段时间就会去给注册中心发送一个心跳包,告诉注册中心我还活着,同时会拉去一份最新的服务列表信息。
- 如果这个服务挂了,那么他就不会再给注册中心发送心跳包了。注册中心发现连续几次都没有发送心跳包,那么注册中心就会将这个服务的节点信息给剔除掉,从而1实现动态的注册和踢出服务,就不需要我们手动管理。
注册中心在微服务架构中主要起到了协调作用,一般有如下功能。
-
服务注册/发现
:
服务注册:保存服务提供者和服务调用者的信息。
服务订阅:服务消费者订阅服务提供者的信息,注册中心向订阅者推送提供者的信息。 -
服务健康检测
:检测服务的健康情况,如果发现服务连续几次都没有发送心跳包,说明这个服务有异常,执行服务剔除。
常见注册中心
Zookeeper
Zookeeper是一个分布式服务框架,是Apache Hadoop 的一个子项目,它主要是用来解决分布式应用中经常遇到的一些数据管理问题,如:统一命名服务、状态同步服务、集群管理、分布式应用配置项的管理等。
Eureka
Eureka是Springcloud Netflflix中的重要组件,主要作用就是做服务注册和发现。但是现在已经闭源
Nacos
Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。它是 SpringCloud Alibaba 组件之一,负责服务注册发现和服务配置。
Nacos是阿里巴巴2018年7月推出来的一个开源项目,是一个更易于构建云原生应用的动态服务注册与发现、配置管理和服务管理平台。Nacos致力于快速实现动态服务注册与发现、服务配置、服务元数据及流量管理。
核心功能
服务注册
Nacos Client会通过发送REST请求想Nacos Server注册自己的服务,提供自身的元数据,比如IP地址,端口等信息。Nacos Server接收到注册请求后,就会把这些元数据存储到一个双层的内存Map中。服务心跳
: 在服务注册后,Nacos Client会维护一个定时心跳来维持统治Nacos Server,说明服务一致处于可用状态,防止被剔除,默认5s发送一次心跳。服务同步
:Nacos Server集群之间会相互同步服务实例,用来保证服务信息的一致性。服务发现
:服务消费者(Nacos Client)在调用服务提供的服务时,会发送一个REST请求给Nacos Server,获取上面注册的服务清单,并且缓存在Nacos Client本地,同时会在Nacos Client本地开启一个定时任务拉取服务最新的注册表信息更新到本地缓存。服务健康检查
:Nacos Server 会开启一个定时任务来检查注册服务实例的健康情况,对于超过15s没有收到客户端心跳的实例会将他的healthy属性设置为false(客户端服务发现时不会发现),如果某个实例超过30s没有收到心跳,直接剔除该实例(被剔除的实例如果恢复发送心跳则会重新注册)。
配置中心原理
- Nacos 客户端会循环请求服务端变更的数据,并且超时时间设置为30s,当配置发生变化时,请求的响应会立即返回,否则会一直等到 29.5s+ 之后再返回响应。
- Nacos 客户端能够实时感知到服务端配置发生了变化。
- 实时感知是建立在客户端拉和服务端“推”的基础上,但是这里的服务端“推”需要打上引号,因为服务端和客户端直接本质上还是通过 http 进行数据通讯的,之所以有“推”的感觉,是因为服务端主动将变更后的数据通过 http 的 response 对象提前写入了。