# springboot-nacos **Repository Path**: Mricecool/springboot-nacos ## Basic Information - **Project Name**: springboot-nacos - **Description**: No description available - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-12-25 - **Last Updated**: 2021-12-25 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # springboot-nacos #### 介绍 Nacos是Alibaba旗下的开源项目,它致力于解决微服务中的统一配置、服务注册与发现等问题。提供了一组简单易用的特性集,帮助开发者快速实现动态服务发现、服务配置、服务元数据及流量管理。 **服务 (Service)** 服务是指一个或一组软件功能(例如特定信息的检索或一组操作的执行),其目的是可以为不同的客户端提供不同的目的重用(例如通过跨进程的网络调用)。Nacos 支持主流的服务生态,如 Kubernetes Service、gRPC|Dubbo RPC Service 或者 Spring Cloud RESTful Service. **服务注册中心 (Service Registry)** 服务注册中心,它是服务、服务实例及元数据的数据库。服务实例在启动时注册到服务注册表,并在关闭时注销。服务消费者客户端可以查询服务注册表查找服务的可用实例。服务注册中心可能会调用服务实例的健康检查 API 来验证它是否能够处理请求。 **服务元数据 (Service Metadata)** 服务元数据是指包括服务端点(endpoints)、服务标签、服务版本号、服务实例权重、路由规则、安全策略等描述服务的数据 **服务提供方 (Service Provider)** 是指提供可复用和可调用服务的应用方。 **服务消费方 (Service Consumer)** 是指会发起对某个服务调用的应用方。 **配置 (Configuration)** 在系统开发过程中通常会将一些需要变更的参数、变量等从代码中分离出来独立管理,以独立的配置文件的形式存在。目的是让静态的系统工件或者交付物(如 WAR,JAR 包等)更好地和实际的物理运行环境进行适配。配置管理一般包含在系统部署的过程中,由系统管理员或者运维人员完成这个步骤。配置变更是调整系统运行时的行为的有效手段之一。 **配置服务 (Configuration Service)** 在服务或者应用运行过程中,提供动态配置或者元数据以及配置管理的服务提供者。 **NameServer** 通过VIP(Vritual IP)或者DNS的方式实现Nacos高可用集群的服务路由。 **NacosServer** Nacos服务提供者,里面包含的Open API是功能访问入口,Config Service、Naming Service是Nacos提供的配置服务、名字服务模块。Consistency Protocol是一致性协议,用来实现Nacos集群节点的数据同步。 https://nacos.io/zh-cn/docs/what-is-nacos.html #### 软件架构 软件架构说明 ![输入图片说明](image.png) #### 安装教程 **安装环境要求** 64 bit OS Linux/Unix/Mac,推荐使用Linux系统。 64 bit JDK 1.8+; Maven 3.2.x+; 3个或3个以上Nacos节点才能构成集群。 MySQL数据库,版本要求:5.6.5+ **下载地址** https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.zip https://github.com/alibaba/nacos/releases/download/1.3.0/nacos-server-1.3.0.tar.gz **解压安装包** tar -zxvf nacos-server-1.3.0.tar.gz unzip nacos-server-1.3.0.zip #### 使用说明 **解压后的文件夹:** - bin(服务启动/停止脚本) - conf(配置文件) - logs(日志) - data(derby数据库存储) - target(编译打包后的文件) **在config目录下,包含以下文件:** - application.properties:Spring Boot项目默认配置文件 - cluster.conf.example:集群配置样例文件 - nacos-mysql.sql:MySQL数据库脚本 - nacos-logback.xml:Nacos日志配置文件 配置集群需要用到cluster.conf文件,多个节点中的 cluster.conf配置要保持一致。 ``` #ip:port 200.8.9.16:8848 200.8.9.17:8848 200.8.9.18:8848 ``` **配置MySQL** 在0.7版本之前,在单机模式时nacos使用derby嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,0.7版本增加了支持mysql数据源能力。在生产环境集群部署推荐使用MySQL替换。具体的操作步骤: - 1. 安装数据库,版本要求:5.6.5+ - 2. 初始化mysql数据库,数据库初始化文件:nacos-mysql.sql - 3. 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql),添加mysql数据源的url、用户名和密码。 ``` spring.datasource.platform=mysql db.num=1 db.url.0=jdbc:mysql://ip:port/xx db.user=name db.password=pwd ``` **启动Nacos服务** - 单机:sh startup.sh -m standalone - 集群:sh startup.sh -p embedded(使用内置数据源) sh startup.sh(使用外置数据源) 启动成功后浏览器访问 http://ip:port/nacos **为什么要使用配置中心 ** SpringBoot项目默认提供一个application.properties或application.yml文件,我们可以把一些全局性的配置写入此文件,比如功能开关或一些服务地址等。为了解决不同环境下服务连接配置信息差异,SpringBoot还提供了基于spring.profiles.active={profile}的机制来实现不同环境的切换。但是随着单体架构像服务化架构的演进,这种各个应用独自维护本地配置的方式也有不足之处: 配置的动态更新:在实际应用中会有动态更新的配置的需求,比如修改服务连接地址、功能开关等。在传统模式下,需要手动修改配置文件并且重启应用才会生效,不仅效率低,而且重启也会造成服务的暂时不可用。 配置的集中式管理:在微服务架构中,某些核心服务为了保证高性能会部署上百个节点,如果每个节点都维护一个配置文件,一旦配置文件中某个属性需要修改,工作量将会是巨大的。 配置内容的安全性:配置文件随源代码统一提交到代码库中,容易操作生产环境配置信息的数据泄漏。 **1、创建命名空间** 用于进行租户粒度的配置隔离。不同的命名空间下,可以存在相同的 Group 或 Data ID 的配置。Namespace 的常用场景之一是不同环境的配置的区分隔离,例如开发测试环境和生产环境的资源(如配置、服务)隔离等。 **2、创建配置集** 一组相关或者不相关的配置项的集合称为配置集。在系统中,一个配置文件通常就是一个配置集,包含了系统各个方面的配置。例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。 **配置集 ID** Nacos 中的某个配置集的 ID。配置集 ID 是组织划分配置的维度之一。Data ID 通常用于组织划分系统的配置集。一个系统或者应用可以包含多个配置集,每个配置集都可以被一个有意义的名称标识。Data ID 通常采用类 Java 包(如 com.taobao.tc.refund.log.level)的命名规则保证全局唯一性。此命名规则非强制。 **配置分组** Nacos 中的一组配置集,是组织配置的维度之一。通过一个有意义的字符串对配置集进行分组,从而区分 Data ID 相同的配置集。默认采用 DEFAULT_GROUP 。 ``` info=hello nacos 3.0 ``` ``` { "name":"nacos 1.0", "age":"3" } ``` ``` spring: redis: database: 0 host: 127.0.0.1 port: 30009 password: ``` #### 项目集成 **添加项目依赖** ``` com.alibaba.boot nacos-config-spring-boot-starter 0.2.7 ``` **application.yml添加nacos配置** ``` nacos: config: server-addr: 127.0.0.1:8090 ``` **读取text** @NacosPropertySource:用于加载dataId为“config_str”的配置集,autoRefreshed表示开启自动更新。 @NacosValue:设置属性的值。info表示key,冒号后的hello local表示默认值,即如果读取不到配置时使用的默认值。 ``` @Controller @RequestMapping("/config") @NacosPropertySource(dataId = "config_str",autoRefreshed = true) public class ConfigController { @NacosValue(value = "${info:hello local}", autoRefreshed = true) private String info; @RequestMapping(value = "/get", method = GET) @ResponseBody public String get() { return info; } } ``` **读取json** 方式一: ``` @Controller @RequestMapping("/json") @NacosPropertySource(dataId = "config_json",type = ConfigType.JSON,autoRefreshed = true) public class JsonController { @NacosValue(value = "${name:name local}", autoRefreshed = true) private String name; @RequestMapping(value = "/get", method = GET) @ResponseBody public String getAttr() { return name; } } ``` 方式二: ``` @NacosConfigurationProperties(dataId = "config_json",type = ConfigType.JSON,autoRefreshed = true) public class NacosInfo { @NacosValue(value = "${name:name local}", autoRefreshed = true) private String name; @NacosValue(value = "${age:age local}", autoRefreshed = true) private String age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getAge() { return age; } public void setAge(String age) { this.age = age; } } ``` ``` @Controller @RequestMapping("/config") public class ConfigController { @Autowired private NacosInfo json; @RequestMapping(value = "/getJson", method = GET) @ResponseBody public NacosInfo getJson() { return json; } } ``` **不同环境配置切换** 1、在Nacos管理后台dev和pro环境下分别创建Data ID为“app.yaml”的配置文件,文件类型yaml,以redis为例: DEV ``` spring: redis: database: 0 host: 127.0.0.1 port: 6379 password: 123456 ``` PRO ``` spring: redis: database: 0 host: 192.168.0.1 port: 6379 password: 654321 ``` 2、在SpringBoot后端添加application-dev.yml和application-pro.yml配置文件,配置不同的nacos命名空间,示例: application-dev.yml ``` nacos: config: server-addr: 127.0.0.1:8090 namespace: 14ec7f2f-f9df-485a-bd85-0d989bfe9ea2 ``` application-pro.yml ``` nacos: config: server-addr: 127.0..0.1:8090 namespace: 59dbc274-33aa-4e31-9d9a-3771201937f9 ``` 3、Nacos配置加载 ``` @SpringBootApplication @NacosPropertySource(dataId = "app.yaml",autoRefreshed = true) public class NacosDemoApplication implements ApplicationRunner { @NacosInjected ConfigService configService; @NacosValue(value = "${app.name:nacos}", autoRefreshed = true) private String name; @Autowired RedisProperties redisProperties; @Autowired StringRedisTemplate stringRedisTemplate; public static void main(String[] args) { SpringApplication.run(NacosDemoApplication.class, args); } @Override public void run(ApplicationArguments args) throws Exception { System.out.println(name); System.out.println(redisProperties.getHost()); System.out.println(redisProperties.getPort()); System.out.println(redisProperties.getPassword()); //System.out.println(stringRedisTemplate.keys("*").toString()); initListener(); } @Bean public NacosInfo nacosInfo(){ return new NacosInfo(); } private void initListener() throws NacosException{ configService.addListener("config_json", "DEFAULT_GROUP", new Listener() { @Override public void receiveConfigInfo(String configInfo) { System.out.println("recieve:" + configInfo); } @Override public Executor getExecutor() { return null; } }); } } ``` 不同环境启动输出不同环境的redis配置参数 4、多配置文件切换方式 - 命令行:--spring.profiles.active=dev - 配置文件:spring.profiles.active=dev - jvm参数:-Dspring.profiles.active=dev #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)