Nacos 注册中心和配置中心 1、Nacos简介 Nacos:Dynamic Naming and Configuration Service
前四个字母分别为Namic和Configuration的前两个字母,最后的s为Service。
1.1、Nacos是什么 Nacos是一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台,是注册中心+配置中心的组合。
作用:1.替代Eureka做服务注册中心
2.替代Config做服务配置中心
2、Nacos安装
[root@localhost ~]# cd /usr/upload [root@localhost upload]# tar -zxvf nacos-server-1.4.1.tar.gz -C /usr/local
# 启动 [root@localhost local]# cd nacos/bin/ [root@localhost bin]# ./startup.sh -m standalone #非集群模式启动
# 关闭 [root@localhost bin]# ./shutdown.sh
3、Nacos注册中心(存放服务的ip和port)
注册中心主要有三部分组成:
Nacos-Server:注册中心 ———— 提供服务的注册和发现
Nacos-Provider:服务提供方 ———— 把自身的服务实例注册到 Nacos Server 中
Nacos-Consumer :服务调用方 ———— 通过Nacos Server获取服务列表,消费服务
3.1、创建服务提供者:nacos_provider pom.xml
<dependency > <groupId > com.alibaba.cloud</groupId > <artifactId > spring-cloud-starter-alibaba-nacos-discovery</artifactId > </dependency >
application.yml
spring: cloud: nacos: discovery: server-addr: 192.168 .150 .132 :8848 application: name: nacos-provider
NacosProviderApp
@SpringBootApplication @EnableDiscoveryClient public class NacosProviderApp { public static void main (String[] args) { SpringApplication.run(NacosProviderApp.class, args); } }
测试:
3.2、创建服务消费者:nacos_consumer pom.xml
<dependency > <groupId > com.alibaba.cloud</groupId > <artifactId > spring-cloud-starter-alibaba-nacos-discovery</artifactId > </dependency >
application.yml
server: port: 80 spring: cloud: nacos: discovery: server-addr: 192.168 .150 .132 :8848 application: name: nacos-consumer
NacosConsumerApp
@SpringBootApplication @EnableDiscoveryClient public class NacosConsumerApp { public static void main (String[] args) { SpringApplication.run(NacosConsumerApp.class, args); } }
controller
@RestController @RequestMapping("/consumer") public class UserController { @Autowired private RestTemplate restTemplate; @Autowired private DiscoveryClient discoveryClient; @RequestMapping("/getUserById/{id}") public User getUserById (@PathVariable Integer id) { List<String> serviceList = discoveryClient.getServices(); for (String serviceName : serviceList) { System.out.println(serviceName); } ServiceInstance service = discoveryClient.getInstances("nacos-provider" ).get(0 ); String url = "http://" + service.getHost() +":" + service.getPort() +"/provider/getUserById/" +id; return restTemplate.getForObject(url, User.class); } }
测试:
4、nacos配置中心(存放配制文件) 4.1、新增工程 创建nacos_config
pom.xml
<?xml version="1.0" encoding="UTF-8" ?> <project xmlns ="http://maven.apache.org/POM/4.0.0" xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" > <parent > <artifactId > springcloud_parent</artifactId > <groupId > com.code</groupId > <version > 1.0-SNAPSHOT</version > </parent > <modelVersion > 4.0.0</modelVersion > <artifactId > nacos_config</artifactId > <properties > <maven.compiler.source > 8</maven.compiler.source > <maven.compiler.target > 8</maven.compiler.target > </properties > <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 > com.alibaba.cloud</groupId > <artifactId > spring-cloud-starter-alibaba-nacos-discovery</artifactId > </dependency > </dependencies > </project >
bootstrap.yml
bootstrap.yml比 applicaton.yml 优先加载,应用于系统级别参数配置,一般不会变动;
application.yml应用于SpringBoot项目的自动化配置
注: 客户端配置文件的名称必须为bootstrap.yml
spring: cloud: nacos: config: server-addr: 192.168 .150 .132 :8848 prefix: nacos-config file-extension: yaml
NacosConfigApp
@SpringBootApplication @EnableDiscoveryClient public class NacosConfigApp { public static void main (String[] args) { SpringApplication.run(NacosConfigApp.class); } }
controller
@RestController @RefreshScope public class ConfigController { @Value("${spring.datasource.driver-class-name}") private String driverClassName; @Value("${spring.datasource.url}") private String url; @Value("${spring.datasource.username}") private String username; @Value("${spring.datasource.password}") private String password; @Value("${spring.datasource.type}") private String type; @GetMapping("/config/info") public String getConfigInfo () { System.out.println(this ); String configInfo = driverClassName+"<br>" +url+"<br>" +username+"<br>" +password+"<br>" +type; return configInfo; } }
4.2、在nacos中新建配置文件
配置内容:
server: port: 8081 spring: cloud: nacos: discovery: server-addr: 192.168 .150 .132 :8848 datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.150.130:3306/ican?characterEncoding=UTF-8 username: root password: 5555 type: com.alibaba.druid.pool.DruidDataSource application: name: nacos-config
测试:
启动时加载配置文件
修改配置文件后nacos监听到MD5有变化则推送消息给客户端,客户端收到消息后会拉取最新配置(参考配置管理->监听查询菜单)
3.浏览器访问:http://127.0.0.1:8081/config/info
4.3、配置隔离 4.3.1、Nacos配置管理模型 通过Namespace、group、Data ID能够定位到一个配置集。
Namespace: 代表不同的环境的配置隔离, 如: 开发、测试、生产等
Group: 代表某个项目, 如XX医疗项目, XX电商项目
DataId: 每个项目下往往有若干个工程, 每个配置集(DataId)是一个工程的主配置文件
获取配置集需要指定:
nacos服务地址,必须指定
namespace,如不指定默认public
group,如不指定默认DEFAULT_GROUP
dataId,必须指定
4.3.2、namespace隔离 命名空间(Namespace)是用于隔离多个环境的(如开发、测试、生产),而每个应用在不同环境的同一个配置(如数据库数据源)的值是不一样的。因此,我们应针对企业项目实际研发流程、环境进行规划。如某软件公司拥有开发、测试、生产三套环境,那么我们应该针对这三个环境分别建立三个namespace。
1.新建namespace
建立好所有namespace后,在配置管理与服务管理模块下所有页面,都会包含用于切换namespace的选项卡,如下图:
2.克隆配置文件 点击左下角克隆按钮,将会弹出克隆对话框,此功能可用于将配置迁移到其他Namespace。
3.读取配置文件 spring: cloud: nacos: config: server-addr: 192.168 .204 .129 :8848 file-extension: yaml prefix: nacos-config namespace: a66ca122-fb24-46ba-bde0-58508c2d6689
4.3.3、group隔离 1.新建配置文件 新建配置文件并修改Group名
不同的配置分组下可以有相同的配置
2.读取配置文件 spring: cloud: nacos: config: server-addr: 192.168 .150 .132 :8848 prefix: nacos-config file-extension: yaml namespace: test group: NACOS_GROUP
4.4.服务隔离 4.4.1.修改配置文件 server: port: 80 spring: cloud: nacos: discovery: server-addr: 192.168 .150 .132 :8848 namespace: test group: nacos_group application: name: nacos-consumer
4.4.2.测试
5.Nacos集群和持久化 5.1、持久化 5.1.1、为什么要持久化? nacos默认使用自带的嵌入式数据库derby,集群模式下会导致每台nacos的配置文件不一样
5.1.2、持久化步骤(切换数据库) 修改conf/application.properties文件,增加支持mysql数据源配置(目前只支持mysql,版本要求:5.6.5+)
spring.datasource.platform =mysql db.num =1 db.url.0 =jdbc:mysql://192.168.31.19:3306/nacos?characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&useSSL=false&serverTimezone=UTC db.user.0 =root db.password.0 =1111
5.1.2、初始化数据库 创建nacos数据库并导入sql
5.1.3、测试 重启nacos测试nacos所有写到嵌入式数据库的数据是否都写到了mysql:
5.2、集群 5.2.1、部署架构图:
5.2.2、节点规划
节点
端口
192.168.150.132
8848
192.168.150.132
8849
192.168.150.132
8850
5.3.3、集群搭建 3台原因:投票超过半数 投票原因:选leader 选leader:同步数据
找到conf/cluster.conf.example ,将其改名为 conf/cluster.conf ,并将内容改为如下:
192.168.150.132 :8848 192.168.150.132 :8849 192.168.150.132 :8850
复制三份Nacos
[root@localhost bin]# cd /usr/local [root@localhost java]# mkdir nacos_cluster [root@localhost java]# cp -r nacos nacos_cluster/nacos_8848 [root@localhost java]# cp -r nacos nacos_cluster/nacos_8849 [root@localhost java]# cp -r nacos nacos_cluster/nacos_8850
将 conf/application.properties 中的端口号分别改为:
server.port =8848 server.port =8849 server.port =8850
5.3、配置代理服务 5.3.1、安装nginx
yum -y install gcc pcre pcre-devel zlib zlib-devel openssl openssl-devel
wget -c https://nginx.org/download/nginx-1.12.0.tar.gz
tar -zxvf nginx-1.12.0.tar.gz
配置nginx安装包
cd nginx-1.12.0 ./configure --prefix=/usr/local/nginx
注意 :./configure配置nginx安装到/usr/java/nginx目录下
5.3.2.配置nginx代理nacos upstream nacosList { 192.168.150.132:8848 192.168.150.132:8849 192.168.150.132:8850 } server { listen 80 ; server_name localhost; location / { proxy_pass http://nacosList; } }
5.4.测试 1.启动nacos集群(把虚拟机内存调至3g)
[root@localhost upload]# cd /usr/local/nacos_cluster/nacos_8848/bin [root@localhost bin]# ./startup.sh [root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8849/bin [root@localhost bin]# ./startup.sh [root@localhost bin]# cd /usr/local/nacos_cluster/nacos_8850/bin [root@localhost bin]# ./startup.sh
2.启动nginx
[root@localhost nginx]# cd /usr/local/nginx/sbin/ [root@localhost sbin]# ./nginx
3.将微服务注册到Nacos集群
4.访问nacos集群
启动nacos-config服务,并通过nginx访问nacos集群:http://192.168.150.132/nacos
6、Nacos开机自启 6.1、添加开机自启动文件 vim /lib/systemd/system/nacos.service:
nacos.service文件内容:
[Unit] Description=nacos After=network.target [Service] Type=forking ExecStart=/usr/local/nacos/bin/startup.sh -m standalone ExecReload=/usr/local/nacos/bin/shutdown.sh ExecStop=/usr/local/nacos/bin/shutdown.sh PrivateTmp=true [Install] WantedBy=multi-user.target
6.2、修改nacos的startup.sh 修改JAVA_HOME路径
[ ! -e "$JAVA_HOME /bin/java" ] && JAVA_HOME=/usr/local/jdk1.8.0_191
注销JAVA_HOME路径下面的3行配置
6.3、设置开机自启 systemctl daemon-reload systemctl start nacos.service systemctl stop nacos.service systemctl status nacos.service systemctl enable nacos.service