赞
踩
本文档中的Nacos为Alibaba Nacos
目录
application.yml和bootstrap.yml的区别
Nacos是阿里巴巴推出来的一个新开源项目,致力于帮助发现,配置和管理微服务.Nacos提供了一组简单易用的特性集,帮助快速实现动态服务发现,服务配置,服务元数据,及流量管理
Nacos是以服务为主要服务对象的中间件,Nacos支持所有主流的服务发现,配置和管理,Nacos主要提供以下四个功能:
nacos服务客户端(要注册到nacos的服务)启动时会每隔一段时间(默认5秒)向nacos发生心跳包,nacos注册中心15秒内没有检测到心跳包会默认认为nacos处于一种不健康的状态,30秒还没收到则认为这个服务已不可用。
将文件夹直接拷贝到指定盘(路径不能有中文),随后修改bin目录下的startup.cmd文件,集群模式改为单机模式
set MODE="cluster"修改为set MODE="standalone"
保存后单击此文件运行即可
启动后,直接在浏览器访问 localhost:8848/nacos,账号密码都是nacos
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
- </dependency>
- spring:
- cloud:
- nacos:
- discovery:
- server-addr: localhost:8848
- # 因部分本机可能安装了VMware虚拟机,因此可能不止一个网卡,所以需指定ip,如果没有则不需指定
- ip: 127.0.0.1
- @Bean
- @LoadBalanced
- RestTemplate restTemplate() {
- return new RestTemplate();
- }
服务提供者:
- package com.bdqn.qianmo.user.controller;
-
- import com.bdqn.beans.User;
- import com.bdqn.qianmo.user.service.UserService;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.beans.factory.annotation.Value;
- import org.springframework.web.bind.annotation.GetMapping;
- import org.springframework.web.bind.annotation.PathVariable;
- import org.springframework.web.bind.annotation.RequestMapping;
- import org.springframework.web.bind.annotation.RestController;
-
- @RestController
- @RequestMapping("/user")
- public class UserController {
- @Autowired
- UserService userService;
- @Value("${server.port}")
- int port;
- @GetMapping("/{id}")
- public User getUserById(@PathVariable Long id) {
- System.out.println("port: "+port);
- return userService.getById(id);
- }
- }

服务消费者:
- package com.bdqn.qianmo.order.service.impl;
-
- import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
- import com.bdqn.beans.Order;
- import com.bdqn.beans.User;
- import com.bdqn.qianmo.order.service.OrderService;
- import com.bdqn.qianmo.order.mapper.OrderMapper;
- import org.springframework.beans.factory.annotation.Autowired;
- import org.springframework.stereotype.Service;
- import org.springframework.transaction.annotation.Transactional;
- import org.springframework.web.client.RestTemplate;
-
- /**
- *
- */
- @Service
- @Transactional(rollbackFor = Exception.class)
- public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order>
- implements OrderService {
- @Autowired
- RestTemplate restTemplate;
-
- @Override
- public Order selectById(Long id) {
- Order order = this.getBaseMapper().selectById(id);
- User forObject = restTemplate.getForObject("http://user-service/user/" + order.getUserId(), User.class);
- order.setUser(forObject);
- return order;
- }
- }
-
-
-
-

注:服务提供者和服务消费者为两个分开运行的SpringBoot项目中,项目启动后效果如图
当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。而Nacos一方面可以将配置集中配置,另一方面可以在配置变更时,及时通知微服务,实现配置的热更新
那么,如何在Nacos中配置管理呢,步骤如下
在pom文件中添加nacos-config依赖
- <dependency>
- <groupId>com.alibaba.cloud</groupId>
- <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
- </dependency>
需要注意的是,此处的文件名应该为bootstrap.yml文件
- spring:
- cloud:
- nacos:
- config:
- #nacos配置中心的地址
- server-addr: localhost:8848
- #文件后缀
- file-extension: yml
- #共享的配置文件列表
- shared-configs:
- - application-common.yml
- #微服务名称
- application:
- name: user-service
在SpringCloud的官方文档中有描述两个文件的区别
原文经过翻译后,大致意思如下:
Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap, 另外一种是 application, bootstrap 是应用程序的父上下文,也就是说 bootstrap 加载优先于 applicaton。bootstrap 主要用于从额外的资源来加载配置信息,还可以在本地外部配置文件中解密属性。这两个上下文共用一个环境,它是任何Spring应用程序的外部属性的来源。bootstrap 里面的属性会优先加载,它们默认也不能被本地相同配置覆盖。
因此,对比application文件,bootstrap配置文件有以下几个特性
bootstrap/application的应用场景:
application主要用于SpringBoot项目的自动配置
bootstrap配置文件则有以下几个应用场景:
总结:
优先级为:bootstrap.properties>bootstrap.yml>application.properties>application.yml
bootstrap为系统级别,application为应用级别
需要注意的是,此处的Data ID必须要和项目中配置的微服务名称和文件后缀一样,比如在4.2中配置的是user-service的微服务名称,后缀为yml,那么此处的Data ID就必须为"user-service.yml"
添加完后,即可正常启动项目了
启动流程如下:
Nacos中的配置文件更新时,如何在项目不重新启动的情况下也能做到热更新呢,其实很简单,只需要在Controller中添加@RefreshScope注解修饰类即可
- @RestController
- @RequestMapping("/user")
- @RefreshScope
- public class UserController {
- @Autowired
- UserService userService;
-
- @Value("${server.port}")
- int port;
-
- @Value("${activeTest}")
- String activeTest;
-
-
-
- @GetMapping("/{id}")
- public User getUserById(@PathVariable Long id) {
- System.out.println("port: "+port);
- return userService.getById(id);
- }
-
- @GetMapping("/getTest")
- public String get() {
- return activeTest;
- }
- }

这样,当配置文件中的属性被修改时,则可以在不重启项目的情况下进行属性值的更新
@RefreshScope: 经过@RefreshScope注解修饰的Bean,将被RefreshScope进行代理,当配置变更时可以在不重启jvm的前提下刷新Bean中相关的属性值和Bean的热更新。
在实际应用场景中,运行的环境可能分为测试环境和dev环境或本地环境,预发布环境,线上环境,那如何在不修改微服务名称的情况下,进行配置文件的切换呢?只需要在bootstrap中添加一个属性即可
profiles.active的规则:
active的值,直接影响项目在nacos中寻找配置文件:微服务名称+"-"+"."+文件类型,例如:
在Nacos单机模式中,nacos使用嵌入式数据库实现数据的存储,不方便观察数据存储的基本情况,因此需要配置mysql数据库,可视化的查看数据的存储情况,步骤如下:
先创建一个空的数据库
在nacos的安装路径下,找到conf文件夹下的nacos-mysql.sql文件
转储此文件,效果如下:
在nacos的安装路径下,找到conf文件夹下的application.properties文件
修改后如下:
为了避免在实际项目中会产生的单点故障,Nacos的运行模式要从单机转为集群
以下操作,所有nacos都需要进行,有一个没有修改则无法运行集群模式
安装三个nacos来模拟集群环境
然后检查启动器(安装路径下bin目录的startup.cmd文件)的运行模式:
a. 修改nacos安装路径下config文件夹中的application.properties文件,修改端口号
注意的是,三个nacos的端口号都应该避免重复,以避免端口号占用
b. 同样的文件,修改ip号(如果本机没有安装虚拟机,且只有一个网卡则无需配置)
c. 复制一个安装路径下conf文件夹下的cluster.conf.example文件,并删除.example后缀
d.修改cluster.conf文件,将三个修改后的nacos端口号添加进去
依次启动三个nacos,效果如图:
微服务项目中的配置如图:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。