SpringBoot集成Nacos
Nacos启动/关闭
#先启动mysql
systemctl status mysql
systemctl start mysql
#跳转到对应目录下
[root@hadoop100 nacos]# cd /opt/software/nacos/bin
#单机模式
[root@hadoop100 bin]# ./startup.sh -m standalone
#集群模式
[root@hadoop100 bin]# ./startup.sh 或者 -p+端口号
#关闭nacos
[root@hadoop100 bin]# ./shutdown.sh
SpringBoot动态引入Nacos配置
使用pom文件动态导入到application.yml中,实现数据隔离+环境切换
1、父pom中引入对资源文件的过滤处理,替换占位符
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
</build>
2、声明好资源配置数值
<profiles>
<!-- 开发 -->
<profile>
<id>dev</id>
<properties>
<!--当前环境-->
<profile.name>dev</profile.name>
<!--Nacos服务地址-->
<config.server-addr>192.168.xxx.xxx:8848</config.server-addr>
<!--Nacos配置中心命名空间,-->
<config.namespace>257a31db-60ea-452f-bd18-c836d53e6faf</config.namespace>
<!--Nacos配置分组名称-->
<config.group>DEFAULT_GROUP</config.group>
<!--Nacos用户名-->
<config.username>nacos</config.username>
<!--Nacos密码-->
<config.password>nacos</config.password>
</properties>
</profile>
<!-- 测试 -->
<!-- 生产 -->
</profiles>
3、appliacton.yml声明
server:
port: 8000
spring:
application:
name: service-order
profiles:
active: @profile.name@
cloud:
nacos:
server-addr: @config.server-addr@
username: @config.username@
password: @config.password@
config:
import-check:
enabled: false
namespace: @config.namespace@
group: @config.group@
discovery:
namespace: @config.namespace@
group: @config.group@
config:
import:
- optional:nacos:service-order.yml
- optional:nacos:service-order-@profile.name@.yml
4、maven选择相应环境构建,启动项目
Nacos的远程调用和配置监听
参考尚硅谷教程
https://www.bilibili.com/video/BV1UJc2ezEFU
远程调用
下单场景
private Product getProductInfo(Long pid) {
//获取该服务的所有实例
// List<ServiceInstance> instances = discoveryClient.getInstances("service-product");
//取第一个实例
//ServiceInstance serviceInstance = instances.get(0);
//拼接出商品服务的远程url
// 传统方法是通过实例去拿到ip端口拼接,这里声明了负载均衡注解后只需要写服务名称即可
String url = "http://service-product/product/getById?id={productId}";
Map<String, Long> map = new HashMap<>();
map.put("productId", pid);
return restTemplate.getForObject(url, Product.class, map);
}
@Configuration
public class RestTemplateConfig {
@Bean
@LoadBalanced
public RestTemplate restTemplate(){
return new RestTemplate();
}
}
Nacos配置监听
@Bean
ApplicationRunner applicationRunner(NacosConfigManager nacosConfigManager){
return new ApplicationRunner() {
@Override
public void run(ApplicationArguments args) throws Exception {
ConfigService configService = nacosConfigManager.getConfigService();
configService.addListener("service-order.yml", "DEFAULT_GROUP", new Listener() {
@Override
public Executor getExecutor() {
return Executors.newFixedThreadPool(1);
}
@Override
public void receiveConfigInfo(String s) {
System.out.println(s);
System.out.println("配置变动监听");
}
});
System.out.println("======");
}
};
}
Nacos热点问题
1、注册中心宕机,远程调用还能成功吗?
- 调用过:远程调用不在依赖注册中心,可以通过(存在缓存)
- 没调用过:(第一次发起远程调用)不能通过
2、Nacos中的数据集和 application.próperties 有相同的 配置项,哪个生效?
命令行参数 > 系统属性 > 环境变量 > Nacos 配置 > 本地配置文件