一、前言Nacos是一款集服务发现、服务健康监测、动态配置服务、动态 DNS 服务、服务及其元数据管理于一身的开源软件这节主要记录Nacos的服务注册发现功能的使用。借助Spring Cloud Alibaba Nacos Discovery我们可以轻松地使用Spring Cloud编程模型体验Nacos的服务注册发现功能。本节使用的Spring Cloud Alibaba版本为2.2.3.RELEASESpring Boot版本为2.3.2.RELEASE。二、Nacos简介官方参考文档2.1 基本架构及概念2.2 逻辑架构及其组件服务管理实现服务CRUD域名CRUD服务健康状态检查服务权重管理等功能配置管理实现配置管CRUD版本管理灰度管理监听管理推送轨迹聚合数据等功能元数据管理提供元数据CURD 和打标能力插件机制实现三个模块可分可合能力实现扩展点SPI机制事件机制实现异步化事件通知sdk数据变化异步通知等逻辑日志模块管理日志分类日志级别日志可移植性尤其避免冲突日志格式异常码帮助文档回调机制sdk通知数据通过统一的模式回调用户处理。接口和数据结构需要具备可扩展性寻址模式解决ip域名nameserver、广播等多种寻址模式需要可扩展推送通道解决server与存储、server间、server与sdk间推送性能问容量管理管理每个租户分组下的容量防止存储被写爆影响服务可用性流量管理按照租户分组等多个维度对请求频率长链接个数报文大小请求流控进行控制缓存机制容灾目录本地缓存server缓存机制。容灾目录使用需要工具启动模式按照单机模式配置模式服务模式dns模式或者all模式启动不同的程序UI一致性协议解决不同数据不同一致性要求情况下不同一致性机制存储模块解决数据持久化、非持久化存储解决数据分片问题Nameserver解决namespace到clusterid的路由问题解决用户环境与nacos物理环境映射问题CMDB解决元数据存储与三方cmdb系统对接问题解决应用人资源关系Metrics暴露标准metrics数据方便与三方监控系统打通Trace暴露标准trace方便与SLA系统打通日志白平化推送轨迹等能力并且可以和计量计费系统打通接入管理相当于阿里云开通服务分配身份、容量、权限过程用户管理解决用户管理登录sso等问题权限管理解决身份识别访问控制角色管理等问题审计系统扩展接口方便与不同公司审计系统打通通知系统核心数据变更或者操作方便通过SMS系统打通通知到对应人数据变更OpenAPI暴露标准Rest风格HTTP接口简单易用方便多语言集成Console易用控制台做服务管理、配置管理等操作SDK多语言sdkAgentdns-f类似模式或者与mesh等方案集成CLI命令行对产品进行轻量化管理像git一样好用2.3 构建物、部署及启动模式两种交付工件Nacos 支持标准 Docker 镜像(TODO: 0.2版本开始支持及 zip(tar.gz)压缩包的构建物。两种启动模式Nacos 支持将注册中心(Service Registry与配置中心(Config Center) 在一个进程合并部署或者将2者分离部署的两种模式。免费的公有云服务模式除了您自己部署和启动 Nacos 服务之外在云计算时代Nacos 也支持公有云模式在阿里云公有云的商业产品如ACM, EDAS) 中会提供 Nacos 的免费的公有云服务。也欢迎和支持其他的公有云提供商提供 Nacos 的公有云服务。2.4 版本说明官方文档参考2.4.1 组件版本关系Spring Cloud Alibaba VersionSentinel VersionNacos VersionRocketMQ VersionDubbo VersionSeata Version2.2.3.RELEASE or 2.1.3.RELEASE or 2.0.3.RELEASE1.8.01.3.34.4.02.7.81.3.02.2.1.RELEASE or 2.1.2.RELEASE or 2.0.2.RELEASE1.7.11.2.14.4.02.7.61.2.02.2.0.RELEASE1.7.11.1.44.4.02.7.4.11.0.02.1.1.RELEASE or 2.0.1.RELEASE or 1.5.1.RELEASE1.7.01.1.44.4.02.7.30.9.02.1.0.RELEASE or 2.0.0.RELEASE or 1.5.0.RELEASE1.6.31.1.14.4.02.7.30.7.12.4.2 版本依赖关系Spring Cloud VersionSpring Cloud Alibaba VersionSpring Boot VersionSpring Cloud Hoxton.SR82.2.3.RELEASE2.3.2.RELEASESpring Cloud Greenwich.SR62.1.3.RELEASE2.1.13.RELEASESpring Cloud Hoxton.SR82.2.2.RELEASE2.3.2.RELEASESpring Cloud Hoxton.SR32.2.1.RELEASE2.2.5.RELEASESpring Cloud Hoxton.RELEASE2.2.0.RELEASE2.2.X.RELEASESpring Cloud Greenwich2.1.2.RELEASE2.1.X.RELEASESpring Cloud Finchley2.0.2.RELEASE2.0.X.RELEASESpring Cloud Edgware1.5.1.RELEASE(停止维护建议升级)1.5.X.RELEASE三、Nacos安装3.1 下载解压Nacos下载地址https://github.com/alibaba/nacos/releases,选择最新版本 nacos-server-1.3.1.zip 下载并解压。3.2 数据源配置打开conf目录下的配置文件在application.properties中添加数据源配置spring.datasource.platformmysql db.num1 db.url.0jdbc:mysql://127.0.0.1:3306/nacosdb?characterEncodingutf8connectTimeout1000socketTimeout3000autoReconnecttrueuseUnicodetrueuseSSLfalseserverTimezoneUTCdb.usernacos db.passwordnacos1233.3 数据导入安装数据库版本要求5.6.5我的本地是5.7.23创建数据库和用户createdatabasenacosdbdefaultcharactersetutf8collateutf8_general_ci;createusernacos%identifiedbynacos123;createusernacoslocalhostidentifiedbynacos123;grantallprivilegesonnacosdb.*tonacos%identifiedbynacos123;grantallprivilegesonnacosdb.*tonacoslocalhostidentifiedbynacos123;flushprivileges;导入Nacos解压包conf目录下的nacos-mysql.sql脚本导入后库表如下图所示3.4 启动测试数据层准备好后我们就可以启动Nacos了。本地使用windows10 64bit直接点击bin目录下startup.cmd。linux环境下执行sh startup.sh -m standalone启动单机版Nacos。注意:1.3.2版本在windows上启动单机模式双击startup.cmd可能会报错建议启动时候使用startup.cmd -m standalone这样启动浏览器访问http://127.0.0.1:8848/nacos说明Nacos启动成功账号密码都为nacos。四、框架搭建使用IDEA创建一个maven项目artifactId为spring-cloud-alibaba-nacos-register然后在其下面创建两个ModuleSpring Boot项目artifactId分别为consumer和provider充当服务消费端和服务提供端项目结构如下图所示spring-cloud-alibaba-nacos-register的pom内容?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.3.2.RELEASE/versionrelativePath/!-- lookup parent from repository --/parentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-nacos-register/artifactIdversion0.0.1-SNAPSHOT/versionnameAlibaba-Nacos-Register/namedescriptionDemo project for Spring Boot/descriptionpackagingpom/packagingmodulesmoduleconsumer/modulemoduleprovider/module/modulespropertiesjava.version1.8/java.versionspring-cloud-alibaba.version2.2.3.RELEASE/spring-cloud-alibaba.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-devtools/artifactIdscoperuntime/scopeoptionaltrue/optional/dependencydependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactIdoptionaltrue/optional/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scopeexclusionsexclusiongroupIdorg.junit.vintage/groupIdartifactIdjunit-vintage-engine/artifactId/exclusion/exclusions/dependency/dependenciesdependencyManagementdependenciesdependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project因为本节演示的是Nacos的服务注册发现功能所以引入的是spring-cloud-alibaba-nacos-discovery依赖。provider的pom的内容如下所示?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-nacos-register/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIdprovider/artifactIdnameAlibaba-Provider/namedescriptionDemo project for Spring Boot/descriptionbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/projectconsumer的pom内容如下?xml version1.0 encodingUTF-8?projectxmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdcom.wno704/groupIdartifactIdspring-cloud-alibaba-nacos-register/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../pom.xml/relativePath/parentartifactIdconsumer/artifactIdnameAlibaba-Consumer/namedescriptionDemo project for Spring Boot/descriptionbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project五、Nacos作为注册中心5.1 provider在provider的com.wno704.alibaba目录下新建controller包然后在该包下新建HelloControllerRestControllerRequestMapping(provide)publicclassHelloController{GetMapping({message})publicStringhello(PathVariableStringmessage){returnString.format(hello %s,message);}}提供了一个REST接口供consumer调用。然后在provider的项目配置文件application.yml里添加如下配置server:port:8900spring:application:name:providercloud:nacos:server-addr:127.0.0.1:8848server.portprovider服务端口为8001spring.application.name服务名称为providerspring.cloud.nacos.server-addr指定Nacos注册中心的地址。5.2 consumerprovider代码准备好后接着在consumer项目的com.wno704.alibaba目录下新建controller包然后在该包下新建ConsumeControllerRestControllerRequestMapping(consume)publicclassConsumeController{AutowiredprivateLoadBalancerClientloadBalancerClient;AutowiredprivateRestTemplaterestTemplate;GetMapping(hello/{message})publicStringhello(PathVariableStringmessage){ServiceInstanceserviceInstanceloadBalancerClient.choose(provider);StringpathString.format(http://%s:%s/provide/%s,serviceInstance.getHost(),serviceInstance.getPort(),message);StringresultrestTemplate.getForObject(path,String.class);returnString.format(%s from %s %s,result,serviceInstance.getHost(),serviceInstance.getPort());}}因为spring-cloud-alibaba-nacos-discovery内置了Ribbon所以我们可以直接注入LoadBalancerClientRestTemplate我们稍后再配置。hello()方法中我们通过服务提供者的名称provider即provider项目配置的spring.application.name从Nacos注册中心中获取对应的服务实例然后访问其提供的/provide/{message} GET服务。这些在《Spring Cloud Ribbon客户端负载均衡》一节中都介绍过了有不懂的可以参阅下。接着在consumer项目的com.wno704.alibaba目录下新建config包然后在该包下新建ConsumerConfigConfigurationpublicclassConsumerConfig{BeanpublicRestTemplaterestTemplate(){returnnewRestTemplate();}}上面代码配置了RestTemplate Bean。最后在consumer项目的配置文件application.yml中添加如下配置server:port:8901spring:application:name:consumercloud:nacos:server-addr:127.0.0.1:8848配置和provider项目类似不再赘述。5.3 启动测试分别启动provider和consumer项目观察Nacos控制台服务列表可以看到两个服务都注册进来了。接着浏览器访问http://localhost:8901/consume/hello/nacos调用成功说明服务发现成功。六、负载均衡我们启动多个provider服务服务名启动参数端口AlibabaProviderApplication-8905server.port89058905AlibabaProviderApplication-8906server.port89058906AlibabaProviderApplication-8907server.port89058907把原来启动AlibabaProviderApplication服务关掉启动新建的三个服务观察Nacos控制台可以看到provider已经有三个实例了然后多次访问http://localhost:8901/consume/hello/nacos可以看到请求是均衡的默认为轮询算法七、Nacos注册中心配置更多可用Nacos Descovery配置配置项Key默认值说明服务端地址spring.cloud.nacos.discovery.server-addr无Nacos Server 启动监听的ip地址和端口服务名spring.cloud.nacos.discovery.service${spring.application.name}给当前的服务命名服务分组spring.cloud.nacos.discovery.groupDEFAULT_GROUP设置服务所处的分组权重spring.cloud.nacos.discovery.weight1取值范围 1 到 100数值越大权重越大网卡名spring.cloud.nacos.discovery.network-interface无当IP未配置时注册的IP为此网卡所对应的IP地址如果此项也未配置则默认取第一块网卡的地址注册的IP地址spring.cloud.nacos.discovery.ip无优先级最高注册的端口spring.cloud.nacos.discovery.port-1默认情况下不用配置会自动探测命名空间spring.cloud.nacos.discovery.namespace无常用场景之一是不同环境的注册的区分隔离例如开发测试环境和生产环境的资源如配置、服务隔离等。AccessKeyspring.cloud.nacos.discovery.access-key无当要上阿里云时阿里云上面的一个云账号名SecretKeyspring.cloud.nacos.discovery.secret-key无当要上阿里云时阿里云上面的一个云账号密码Metadataspring.cloud.nacos.discovery.metadata无使用Map格式配置用户可以根据自己的需要自定义一些和服务相关的元数据信息日志文件名spring.cloud.nacos.discovery.log-name无集群spring.cloud.nacos.discovery.cluster-nameDEFAULT配置成Nacos集群名称接入点spring.cloud.nacos.discovery.enpointUTF-8地域的某个服务的入口域名通过此域名可以动态地拿到服务端地址是否集成Ribbonribbon.nacos.enabledtrue一般都设置成true即可是否开启Nacos Watchspring.cloud.nacos.discovery.watch.enabledtrue可以设置成false来关闭 watch
