本套mode使用的是Alibaba的2021.0.1版,springboot的2.6.3实现(适用于springboot 2.7~2.4),Nacos使用的最新的2.2.3版本,如果需要看安装nacos和基础搭建可以看我下面的博客!
nacos的安装和基本配置使用可以查看我这篇博客,或者关注下面的专栏后续会持续更新其他的Spring Cloud 组件介绍以及使用
Nacos下载与安装配置(2.2.3版本示例)
Spring Cloud Alibaba专栏
大致架构如下:
其他的一些依赖这里就不放了,只放nacos的相关依赖,第一个是服务注册的依赖,第二个是使得加载bootstrap.yml
文件在application.yml
文件前面加载。第三个是读取nacos配置中心的依赖(该依赖不加无法读取到nacos配置中心的内容,但不会报错!)。第四个是用于自动读取加载和刷新nacos中最新的配置的,@NacosValue
注解是依靠它
:如果没有报错,并且配置也没有错,就很大可能是少了这个依赖,或者是nacos的版本和spring的版本不兼容!
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discoveryartifactId>
dependency>
<dependency>
<groupId>org.springframework.cloudgroupId>
<artifactId>spring-cloud-starter-bootstrapartifactId>
dependency>
<dependency>
<groupId>com.alibaba.cloudgroupId>
<artifactId>spring-cloud-starter-alibaba-nacos-configartifactId>
dependency>
<dependency>
<groupId>com.alibaba.bootgroupId>
<artifactId>nacos-config-spring-boot-starterartifactId>
<version>0.2.12version>
dependency>
bootstrap配置文件和application配置文件使用区别:
- bootstrap配置文件用于加载应用程序的基础配置,例如连接配置中心(如Nacos、Consul等)、配置加密等。
- application配置文件用于加载应用程序的业务配置。
两个bolg-product项目配置文件除了端口其他的一样的。
这里不做什么配置就简单的配置名字和端口。
server:
port: 8203
spring:
application:
name: bolg-product
spring:
# 注入到nacos
cloud:
nacos:
#配置中心配置
discovery:
namespace: a5b81f44-9ca6-42b6-99ff-a2a11626a09d
server-addr: 192.168.0.104:8848
username: nacos #账号
password: nacos #密码
#注册中心配置:主要配置,一般情况下配置前面的就可以了
config:
server-addr: 192.168.0.104:8848 #注册的地址
username: nacos #账号
password: nacos #密码
namespace: a5b81f44-9ca6-42b6-99ff-a2a11626a09d #命名空间
file-extension: yml #配置文件的后缀
prefix: bolg-product #配置文件前缀 ,如果不写 默认使用${spring.application.name}的值
group: BOLG_GROUP #组名
auto-refresh: true # 开启自动刷新
#配置次配置文件:在一些特殊时候可能要配置多个,
extension-configs:
- data-id: config-a-dev.yml #配置文件全名
group: GROUP-A #组名
refresh: true #是否支持热加载刷新
- data-id: config-b-dev.yml
group: GROUP-A
refresh: false
#共享配置文件 ---优先级低(比本地的低)
shared-configs:
- data-id: application.yml
group: GROUP-A
这个地方的DataID的值是需要是:${prefix}-${spring.profiles.active}.${file-extension}
我这里写的是bolg-order.yml
是因为我没有配置spring.profiles.active
这个参数
而${prefix}
如果不写默认会去取${spring.application.name}
因为我要用openfeign远程调用使用加了其他的一些参数配置
server:
port: 8201
spring:
application:
name: bolg-order
# profiles:
# active: dev
# 开启负载均衡(默认是不开启的)
feign:
circuitbreaker:
enabled: true
# 熔断配置
hystrix:
command:
default:
execution.isolation.thread.timeoutInMilliseconds: 3000 # 设置Hystrix超时时间(毫秒)
ProductFeignClient#getProducts:
execution.isolation.thread.timeoutInMilliseconds: 1000 # 为特定的Feign方法设置超时时间
这个地方我为了对比差异尝试,配置中心和注册中心应该是分开的,他们的配置可以不设置在同一个命名空间里,这里我注册中心配置在了dev空间,而配置中心我放在了默认的public命名空间,不设置${namespace}
参数就是默认的命名空间
server:
port: 8201
spring:
# 注入到nacos
cloud:
nacos:
#配置中心配置
discovery:
namespace: a5b81f44-9ca6-42b6-99ff-a2a11626a09d
server-addr: 192.168.0.104:8848
username: nacos #账号
password: nacos #密码
#注册中心配置
config:
server-addr: 192.168.0.104:8848
username: nacos #账号
password: nacos #密码
# namespace: a5b81f44-9ca6-42b6-99ff-a2a11626a09d #不写命名空间默认是public
file-extension: yml #配置文件的后缀
prefix: bolg-order #配置文件前缀 ,如果不写 默认使用${spring.application.name}的值
group: BOLG_GROUP #组名
auto-refresh: true
这里我就加一个测试读取nacos远程文件的接口吧
@Value
注解也可以读取到远程的内容的,因为它加载时加被加载一起加载到本地了@NacosValue
注解需要加第四个依赖才可以读取到远程的内容@RestController
@RequestMapping("/admin/acl/index")
@Slf4j
public class index {
@Resource
private ProductFeignClient productFeignClient;
@NacosValue(value = "${bolg.name}" ,autoRefreshed = true)
private String NacosName;
@Value( "${bolg.name}")
private String NacosName2;
@Value("${server.port}")
private Integer Port;
/**
* 测试订单服务是否有问题
* @author yingfeng
* @return * @return Result
*/
@PostMapping("/login")
public Result login(){
log.info("nacos名字:{},{},本地端口:{}",NacosName,NacosName2,Port);
HashMap<String, String> map = new HashMap<>(16);
map.put("token","token-admin");
System.out.println();
return Result.ok(map);
}
读取到的内容:可以看到如果本地和远程写了同样的内容,优先级上远程的要高一些。
具体的优先级如下:
- 配置文件优先级(由高到低):
nacos远程的配置 -> 本地application.properties -> application.yml ->本地bootstrap.properties -> bootstrap.yml