1. nacos 配置管理
1.1 什么是配置中心
1.1.1 什么是配置
应用程序在启动和运行的时候往往需要读取一些配置信息,配置基本上伴随着应用程序的整个生命周期,比如:数据库连接参数、启动参数等。
配置的特点:
- 配置是独立于程序的只读变量
- 同一份程序在不同的配置下会有不同的行为
- 程序通过配置来改变自己的行为,但是程序不应该去改变配置
- 配置伴随应用的整个生命周期
- 应用在启动时通过读取配置来初始化,在运行时根据配置调整行为。比如: 启动时需要读取服务的端口号、系统在运行过程中需要读取定时策略指定定时任务等。
- 配置可以多种加载方式
- 常见的有程序内部硬编码,配置文件,环境变量,启动参数,基于数据库等
配置需要治理
服务发现和服务健康监测
- 动态配置服务
- 动态 DNS 服务
- 服务及其元数据管理
nacos: Dynamic Naming and Configuration Service nacos文档 github代码
1.3 nacos快速入门
1.3.1 nacos server docker 单机安装
配置外部数据支持: 从官网下载解压后获取sql文件 在本地执行 nacos-db.sql
docker 安装说明
docker run -d \-e MODE=standalone \-e NACOS_AUTH_ENABLE=true \-e SPRING_DATASOURCE_PLATFORM=mysql \-e MYSQL_SERVICE_HOST=192.168.19.128 \-e MYSQL_SERVICE_PORT=3306 \-e MYSQL_SERVICE_DB_NAME=nacos \-e MYSQL_SERVICE_USER=root \-e MYSQL_SERVICE_PASSWORD=123456 \-p 8848:8848 \--name nacos \nacos/nacos-server
访问 http://192.168.19.128:8848/nacos
1.3.2 配置说明
命名空间(Namespace)
命名空间( namespace )可用于进行不同环境的配置隔离。不同的命名空间下,可以存在相同名称的配置分组(Group)或配置集。
配置分组(Group)
配置分组是对配置集进行分组,不同的配置分组下可以有相同的配置集( DataID)。当在Nacos上创建一个配置时 ,如果未填写配置分组的名称,则配置分组的名称默认采用DEFAULT. GROUP。
配置集(Data ID)
在系统中,一个配置文件通常就是一个配置集, 一个配置集可以包含了系统的各种配置信息,例如,一个配置集可能包含了数据源、线程池、日志级别等配置项。
配置项
就是我们的配置内容
1.4 nacos配置管理基础应用
springboot版本: 2.4.2
nacos版本:2.0.2
1.4.1 springboot项目集成
目前 springboot注解配置 最高支持到2.3.X,2.4以下可以集成以下配置
<dependency><groupId>com.alibaba.boot</groupId><artifactId>nacos-config-spring-boot-starter</artifactId><version>0.2.8</version></dependency>
2.4以上可以集成该配置
<dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId><version>2021.1</version></dependency># 一定要加这个配置 不然读取不到配置<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-bootstrap</artifactId><version>3.0.1</version><exclusions><exclusion><artifactId>spring-cloud-context</artifactId><groupId>org.springframework.cloud</groupId></exclusion><exclusion><artifactId>spring-cloud-commons</artifactId><groupId>org.springframework.cloud</groupId></exclusion></exclusions></dependency>
1.4.2 springboot项目配置
application.yml
spring:profiles:active: dev
bootstrap.yml
spring:#配置了spring.cloud.nacos.config.name的情况下该配置无需配置,且spring.cloud.nacos.config.name优先级更高#application:# name: bootnacoscloud:nacos:config:namespace: 0c669785-19df-4df0-9fa8-6c6a7ce8c689#分组 不填就是默认分组 DEFAULT_GROUPgroup: MY_GROUP#必填 nacos地址和端口server-addr: 192.168.19.128:8848#配置项类型 默认 propertiesfile-extension: yaml# dataId prefix名称name: bootnacos# 多个配置文件extension-configs[0]:data-id: nacosserver-dev.yamlrefresh: true#完全开启/关闭配置enabled: true#nacos开启了权限管理 需要配置用户名密码username: nacospassword: nacos
配置了spring.cloud.nacos.config.name的情况下不用配置spring.application.name,且spring.cloud.nacos.config.name优先级更高
配置上面spring.cloud.nacos.config.name是为了组成Data Id ( ${prefix}-${spring.profiles.active}.${fileextension})
在项目启动时会去加载 dataId 默认会去找三个,配置一个即可
- bootnacos.yml
- bootnacos-dev.yml (建议使用该配置,颗粒度更细)
- bootnacos
配置一个配置类和一个控制类
@Component@Data@ConfigurationProperties(prefix = "person")public class Person {private String userName;private Boolean boss;private Date birth;private Integer age;private Pet pet;private String[] interests;private List<String> animal;private Map<String, Object> score;private Set<Double> salarys;private Map<String, List<Pet>> allPets;@Datastatic class Pet {private String name;private Integer weight;}}
@RestController@RequestMapping("/config")@RefreshScopepublic class ConfigController {@Autowiredprivate Person person;@Value("${user.name}")private String name;@Value("${user.age}")private Integer age;@GetMapping("/getPerson")public Person getPerson() {return person;}@GetMapping("/getUserName")public String getUserName() {return name;}@GetMapping("/getUserAge")public Integer getUserAge() {return age;}}
nacosServer 配置:
bootnacos-dev.yaml
server:port: 8888person:userName: wangwuboss: falsebirth: 2019/12/12 20:12:33age: 18pet:name: tomcatinterests:- 游泳- 篮球animal: [jerry,mario]score:english:first: 30second: 30thrid: 30math:first: 70second: 71thrid: 72chinese: {first:28,second:89,thrid:78}salarys: [5979.3,45545]all-pets:sick:- {name: tom}- {name: 小黑, jerry, weight: 47}health: [{name: juccy, weight: 47},{name: juccy, weight: 47}]
nacosserver-dev.yaml
user:name: 曹操age: 45
启动项目 访问 http://localhost:8888/config/getPerson 可以获取数据
实时修改 nacosserver-dev.yaml中的数据数据 可以在不重新启动项目的情况下 获取最新的数据 http://localhost:8888/config/getUserName
注意:实时获取最新数据需要加注解@RefreshScope
1.5 nacos 集群管理
官网配置
多台docker容器部署使用ip模式,单台docker构建容器使用hostname模式
本次使用hostname模式 外置挂载mysql
1.5.1 配置修改
git clone --depth 1 https://github.com/nacos-group/nacos-docker.git
修改 cluster-hostname.yaml
version: "3"services:nacos1:hostname: nacos1container_name: nacos1image: nacos/nacos-server:${NACOS_VERSION}volumes:- ./cluster-logs/nacos1:/home/nacos/logs- ./init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- "8848:8848"- "9848:9848"- "9555:9555"env_file:- ../env/nacos-hostname.envrestart: alwaysnacos2:hostname: nacos2image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos2volumes:- ./cluster-logs/nacos2:/home/nacos/logs- ./init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- "8849:8848"- "9849:9848"env_file:- ../env/nacos-hostname.envrestart: alwaysnacos3:hostname: nacos3image: nacos/nacos-server:${NACOS_VERSION}container_name: nacos3volumes:- ./cluster-logs/nacos3:/home/nacos/logs- ./init.d/custom.properties:/home/nacos/init.d/custom.propertiesports:- "8850:8848"- "9850:9848"env_file:- ../env/nacos-hostname.envrestart: always
修改 nacos-hostname.env
#nacos dev envPREFER_HOST_MODE=hostnameNACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848MYSQL_SERVICE_HOST=192.168.19.128MYSQL_SERVICE_DB_NAME=nacosMYSQL_SERVICE_PORT=3306MYSQL_SERVICE_USER=rootMYSQL_SERVICE_PASSWORD=123456#开启权限NACOS_AUTH_ENABLE=true
启动容器
docker-compose -f cluster-hostname.yaml up -d
1.5.2配置nginx
user nginx;worker_processes 1;error_log /var/log/nginx/error.log warn;pid /var/run/nginx.pid;events {worker_connections 1024;}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;keepalive_timeout 65;upstream cluster{server 192.168.19.128:8848 weight=1 max_fails=2 fail_timeout=30s;server 192.168.19.128:8849 weight=1 max_fails=2 fail_timeout=30s;server 192.168.19.128:8850 weight=1 max_fails=2 fail_timeout=30s;}server{listen 13306;server_name localhost;large_client_header_buffers 4 16k; # 读取大型客户端请求头的缓冲区的最大数量和大小client_max_body_size 300m; #设置nginx能处理的最大请求主体大小。client_body_buffer_size 128k; #请求主体的缓冲区大小。fastcgi_connect_timeout 300;fastcgi_send_timeout 300;fastcgi_read_timeout 300;fastcgi_buffer_size 64k;fastcgi_buffers 8 32k;fastcgi_busy_buffers_size 128k;fastcgi_temp_file_write_size 64k;location / {proxy_pass http://cluster;}}include /etc/nginx/conf.d/*.conf;}
访问 http://192.168.19.128:13306/nacos
在项目配置的时候就可以直接配置nginx的地址即可

