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: bootnacos
cloud:
nacos:
config:
namespace: 0c669785-19df-4df0-9fa8-6c6a7ce8c689
#分组 不填就是默认分组 DEFAULT_GROUP
group: MY_GROUP
#必填 nacos地址和端口
server-addr: 192.168.19.128:8848
#配置项类型 默认 properties
file-extension: yaml
# dataId prefix名称
name: bootnacos
# 多个配置文件
extension-configs[0]:
data-id: nacosserver-dev.yaml
refresh: true
#完全开启/关闭配置
enabled: true
#nacos开启了权限管理 需要配置用户名密码
username: nacos
password: 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;
@Data
static class Pet {
private String name;
private Integer weight;
}
}
@RestController
@RequestMapping("/config")
@RefreshScope
public class ConfigController {
@Autowired
private 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: 8888
person:
userName: wangwu
boss: false
birth: 2019/12/12 20:12:33
age: 18
pet:
name: tomcat
interests:
- 游泳
- 篮球
animal: [jerry,mario]
score:
english:
first: 30
second: 30
thrid: 30
math:
first: 70
second: 71
thrid: 72
chinese: {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: nacos1
container_name: nacos1
image: nacos/nacos-server:${NACOS_VERSION}
volumes:
- ./cluster-logs/nacos1:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8848:8848"
- "9848:9848"
- "9555:9555"
env_file:
- ../env/nacos-hostname.env
restart: always
nacos2:
hostname: nacos2
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos2
volumes:
- ./cluster-logs/nacos2:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8849:8848"
- "9849:9848"
env_file:
- ../env/nacos-hostname.env
restart: always
nacos3:
hostname: nacos3
image: nacos/nacos-server:${NACOS_VERSION}
container_name: nacos3
volumes:
- ./cluster-logs/nacos3:/home/nacos/logs
- ./init.d/custom.properties:/home/nacos/init.d/custom.properties
ports:
- "8850:8848"
- "9850:9848"
env_file:
- ../env/nacos-hostname.env
restart: always
修改 nacos-hostname.env
#nacos dev env
PREFER_HOST_MODE=hostname
NACOS_SERVERS=nacos1:8848 nacos2:8848 nacos3:8848
MYSQL_SERVICE_HOST=192.168.19.128
MYSQL_SERVICE_DB_NAME=nacos
MYSQL_SERVICE_PORT=3306
MYSQL_SERVICE_USER=root
MYSQL_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的地址即可