本文档基于v2.0.3进行整理。html
Nacos 致力于帮助您发现、配置和管理微服务。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据及流量管理。(配置中心和注册中心)java
目前市面上用的比较多的配置中心有:Spring Cloud Confifig、Apollo、Nacos和Disconf等。 因为Disconf再也不维护,下面主要对比一下Spring Cloud Confifig、Apollo和Nacos。mysql
从配置中心角度来看,性能方面Nacos的读写性能最高,Apollo次之,Spring Cloud Confifig依赖Git场景不适合开 放的大规模自动化运维API。功能方面Apollo最为完善,nacos具备Apollo大部分配置管理功能,而Spring Cloud Confifig不带运维管理界面,须要自行开发。Nacos的一大优点是整合了注册中心、配置中心功能,部署和操做相比 Apollo都要直观简单,所以它简化了架构复杂度,并减轻运维及部署工做。git
综合来看,Nacos的特色和优点仍是比较明显的,下面咱们一块儿进入Nacos的世界。github
目前市面上用的比较多的服务发现中心有:Nacos、Eureka、Consul和Zookeeper。web
Nacos主要提供如下四大功能:spring
服务发现与服务健康检查sql
Nacos使服务更容易注册,并经过DNS或HTTP接口发现其余服务,Nacos还提供服务的实时健康检查,以防止向不健康的主机或服务实例发送请求。数据库
动态配置管理bootstrap
动态配置服务容许您在全部环境中以集中和动态的方式管理全部服务的配置。Nacos消除了在更新配置时从新部署应用程序,这使配置的更改更加高效和灵活。
动态DNS服务
Nacos提供基于DNS 协议的服务发现能力,旨在支持异构语言的服务发现,支持将注册在Nacos上的服务以域名的方式暴露端点,让三方应用方便的查阅及发现。
服务和元数据管理
Nacos 能让您从微服务平台建设的视角管理数据中心的全部服务及元数据,包括管理服务的描述、生命周期、服务的静态依赖分析、服务的健康状态、服务的流量管理、路由及安全策略。
这里动态配置管理的特性说明了Naocs的配置管理能力。
单机模式时nacos默认使用嵌入式数据库实现数据的存储,若想使用外部mysql存储nacos数据,须要进行如下步骤:
spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://11.162.196.16:3306/nacos_config? characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true db.user=nacos_devtest db.password=youdontknow
注意:支持MySQL 8须要添加插件。
什么是配置?
应用程序在启动和运行的时候每每须要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,好比:数据库链接参数、启动参数等。
配置主要有如下几个特色:
配置是独立于程序的只读变量
配置伴随应用的整个生命周期
配置能够有多种加载方式
配置须要治理
什么是配置中心?
总得来讲,配置中心就是一种统一管理各类应用配置的基础服务组件。
在传统巨型单体应用纷纷转向细粒度微服务架构的历史进程中,配置中心是微服务化不可缺乏的一个系 统组件,在这种背景下中心化的配置服务即配置中心应运而生,一个合格的配置中心须要知足以下特性:
step1:使用Nacos的界面发布配置
step2:经过Nacos API获取配置
/** * 演示使用Nacos API 对配置中心数据进行增删改查的过程 */ public class NacosApiDemo { public static void main(String[] args) throws NacosException, InterruptedException { String serverAddr = "localhost"; String dataId = "application.yml"; String group = "demo"; String nameSpace = "6f97a206-ce19-44c2-85be-c601170d306e"; Properties properties = new Properties(); properties.put(PropertyKeyConst.SERVER_ADDR, serverAddr); properties.put(PropertyKeyConst.NAMESPACE, nameSpace); ConfigService configService = NacosFactory.createConfigService(properties); // 启动的时候读取配置中心的配置 String content = configService.getConfig(dataId, group, 5000); System.out.println("配置内容:"); System.out.println(content); // 监听配置中心数据的变化 configService.addListener(dataId, group, new Listener() { @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } @Override public Executor getExecutor() { return null; } }); // 向数据中心推送数据,改变原有配置 boolean isPublishOk = configService.publishConfig(dataId, group, "content"); System.out.println(isPublishOk); //再次读取数据 Thread.sleep(3000); content = configService.getConfig(dataId, group, 5000); System.out.println(content); // 删除配置中心数据 boolean isRemoveOk = configService.removeConfig(dataId, group); System.out.println(isRemoveOk); Thread.sleep(3000); // 再次读书数据 content = configService.getConfig(dataId, group, 5000); System.out.println(content); Thread.sleep(300000); } }
对于Nacos配置管理,经过Namespace、group、Data ID可以定位到一个配置集。
配置集(Data ID)
在系统中,一个配置文件一般就是一个配置集,一个配置集能够包含了系统的各类配置信息,例如,一个配置集可 能包含了数据源、线程池、日志级别等配置项。每一个配置集均可以定义一个有意义的名称,就是配置集的ID即Data ID。
配置项
配置集中包含的一个个配置内容就是配置项。它表明一个具体的可配置的参数与其值域,一般以 key=value 的形 式存在。例如咱们常配置系统的日志输出级别(logLevel=INFO|WARN|ERROR) 就是一个配置项。
配置分组(Group)
配置分组是对配置集进行分组,经过一个有意义的字符串(如 Buy 或 Trade )来表示,不一样的配置分组下能够有 相同的配置集(Data ID)。当您在 Nacos 上建立一个配置时,若是未填写配置分组的名称,则配置分组的名称默 认采用 DEFAULT_GROUP 。配置分组的常见场景:可用于区分不一样的项目或应用,例如:学生管理系统的配置集 能够定义一个group为:STUDENT_GROUP。
命名空间(Namespace)
命名空间(namespace)可用于进行不一样环境的配置隔离。例如能够隔离开发环境、测试环境和生产环境,由于 它们的配置可能各不相同,或者是隔离不一样的用户,不一样的开发人员使用同一个nacos管理各自的配置,可经过 namespace隔离。不一样的命名空间下,能够存在相同名称的配置分组(Group) 或 配置集。
最佳实践
Nacos抽象定义了Namespace、Group、Data ID的概念,具体这几个概念表明什么,取决于咱们把它们当作什 么,这里推荐给你们一种用法,以下图:
namespace 的设计是 nacos 基于此作多环境以及多租户(多个用户共同使用nacos)数据(配置和服务)隔离的。
从一个租户(用户)的角度来看,若是有多套不一样的环境,那么这个时候能够根据指定的环境来建立不一样的 namespce,以此来实现多环境的隔离。例如,你可能有开发,测试和生产三个不一样的环境,那么使用一套 nacos 集群能够分别建如下三个不一样的 namespace。以下图所示:
从多个租户(用户)的角度来看,每一个租户(用户)可能会有本身的 namespace,每一个租户(用户)的配置数据以及注 册的服务数据都会归属到本身的 namespace 下,以此来实现多租户间的数据隔离。例如超级管理员分配了三 个租户,分别为张3、李四和王五。分配好了以后,各租户用本身的帐户名和密码登陆后,建立本身的命名 空间。以下图所示:
上面监听查询的功能说下:能够经过IP地址查询,查询client端已经读取到的配置文件的MD5值,用这个MD5值和配置文件详情中的MD5值对比就能够知道客户端拿到的配置文件是否是最新的。
将演示如何使用 Spring Cloud Alibaba Nacos Confifig在Spring Cloud应用中集成Nacos,经过 Spring cloud原生方式快捷的获取配置内容。
Spring Cloud是什么:
Spring Cloud是一系列框架的有序集合。它利用Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,均可以用Spring Boot 的开发风格作到一键启动和部署。Spring Cloud并无重复制造轮子,它只是将目前各家公司开发的比较成 熟、经得起实际考验的服务框架组合起来,集成最多的组件要属Netflflix公司,经过Spring Boot风格进行再封 装屏蔽掉了复杂的配置和实现原理,最终给开发者留出了一套简单易懂、易部署和易维护的分布式系统开发 工具包。
Spring Cloud Alibaba Nacos Confifig是什么:
Spring Cloud Alibaba Nacos Confifig是Spring Cloud Alibaba的子项目,而Spring Cloud Alibaba是阿里巴巴公司提供的开源的基于Spring cloud的微服务套件合集,它致力于提供微服务开发的一站式解决方案,能够理解为spring cloud是一套微服务开发的 标准 ,spring cloud alibaba与spring cloud Netflflix是实现。使用 Spring Cloud Alibaba方案,开发者只须要添加一些注解和少许配置,就能够将 Spring Cloud 应用接入阿里分布式应用解决方案,经过阿里中间件来迅速搭建分布式应用系统。
step1:添加依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> <version>2.2.6.RELEASE</version> </dependency> </dependencies>
step2:添加配置(bootstrap.yml)
#日志配置 logging: config: classpath:logback-app.xml #Server相关配置 server: port: ${port:9999} #Spring相关配置 spring: application: name: cloud-app profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.1:8848 file-exetension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo
在 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 的拼接格式变成 ${prefix}.${file-extension}
file-exetension
为配置内容的数据格式,能够经过配置项 spring.cloud.nacos.config.file-extension
来配置。目前只支持 properties
和 yaml
类型。step3:经过 Spring Cloud 原生注解 @RefreshScope
实现配置自动更新
@RestController @RequestMapping("/config") @RefreshScope public class ConfigController { @Value("${useLocalCache:false}") private boolean useLocalCache; @RequestMapping("/get") public boolean get() { return useLocalCache; } }
共享配置文件
spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.2:8848 file-extension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo # 这边的shared-configs不能配置namespace,和上面的配置共享一个namespace,因此通常用于读取一个团队内部的共享文件 shared-configs[0]: data-id: common.yaml refresh: true group: common
spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: config: server-addr: 127.0.0.2:8848 file-extension: yaml namespace: 6f97a206-ce19-44c2-85be-c601170d306e group: demo extensionConfigs[0]: data-id: jdbc.yaml refresh: true group: demo extensionConfigs[1]: data-id: o32.yaml refresh: true group: demo shared-configs[0]: data-id: common.yaml refresh: true group: common
配置文件优先级
假如依赖的配置文件有冲突。
主配置文件(经过nacos配置肯定的配置文件)> 扩展配置1 > 扩展配置0 > 公共配置
微服务环境下,服务常常是多实例部署的。并且常常会增长实例或者下线实例,服务以前怎么互相感知,就是服务发现须要研究的问题。
总结一下,在微服务环境中,因为服务运行实例的网络地址是不断动态变化的,服务实例数量的动态变化 ,所以无 法使用固定的配置文件来记录服务提供方的网络地址,必须使用动态的服务发现机制用于实现微服务间的相互感知。各服务实例会上报本身的网络地址,这样服务中心就造成了一个完整的服务注册表,各服务实例会经过服务发现中心来获取访问目标服务的网络地址,从而实现服务发现的机制。
采用Feign+Ribbon的整合方式,是由Feign完成远程调用的整个流程。而Feign集成了Ribbon,Feign使用Ribbon
完成调用实例的负载均衡。 (Feign作远程调用,Ribbon用来作负载均衡)
Ribbon 简介
Ribbon是一个客户端负载均衡器,它的责任是从一组实例列表中挑选合适的实例,如何挑选?取决于负载均衡策略 。
Ribbon核心组件IRule是负载均衡策略接口,它有以下实现:
可经过下面方式在spring boot 配置文件中修改默认的负载均衡策略:
account‐service.ribbon.NFLoadBalancerRuleClassName=com.netflix.loadbalancer.RandomRule
account-service 是调用的服务的名称,后面的组成部分是固定的。
Feign介绍
Feign是Netflflix开发的声明式、模板化的HTTP客户端, Feign能够帮助咱们更快捷、优雅地调用HTTP API。Feign 的英文表意为“伪装,假装,变形”, 能够理解为将HTTP报文请求方式假装为简单的java接口调用方式。
# Server相关配置 server: port: 18080 #Spring相关配置 spring: application: name: server1 profiles: active: @profiles.active@ cloud: nacos: discovery: server-addr: 127.0.0.2:8848
依赖:
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
启动服务端:
@SpringBootApplication @EnableDiscoveryClient public class CloudServer1 { private static Logger logger = LoggerFactory.getLogger(CloudServer1.class); public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); logger.info("CloudServer1 begin to start..."); SpringApplication.run(CloudServer1.class, args); logger.info("CloudServer1 start success..."); } }
step1:添加依赖
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> </dependency> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId> </dependency> </dependencies>
step2:添加配置
server: port: 9999 #Spring相关配置 spring: application: name: cloud-comsumer profiles: active: @profiles.active@ cloud: nacos: discovery: server-addr: 127.0.0.2:8848
step3:添加客户端调用
@FeignClient(name = "server1") public interface ServerConsumerClient { @GetMapping("/echo/chen") String echoChen(); @GetMapping("/echo/zhao") String echoZhen(); }
step4:启动应用
@SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class CloudApp { private static Logger logger = LoggerFactory.getLogger(CloudApp.class); public static void main(String[] args) { System.setProperty("nacos.logging.default.config.enabled","false"); logger.info("app begin to start..."); SpringApplication.run(CloudApp.class, args); logger.info("app start success..."); } }
Nacos 客户端读取配置、更新配置、删除配置和监听服务端配置变化的原理;
Nacos 各个日志的功能;
配置多个数据库的原理;
Nacos 接入用户时必须指定用户密码;
Nacos 用户权限管理。 --- http://www.javashuo.com/article/p-cvslcoxc-wt.html 对服务发现有没有影响