服务启动与访问
第一步:启动Nacos服务。
Linux/Unix/Mac启动命令(standalone代表着单机模式运行,非集群模式):
./startup.sh -m standalone
Windows启动命令(standalone代表着单机模式运行,非集群模式):
startup.cmd -m standalone
yml文件和配置中心如果不存在logging.level.com.cy
yml文件是读取了存入Map集合中,@Value("${logging.level.com.cy:debug}")注解如果读取不到配置中心和配置文件需要给默认值,冒号后面那个。
server:
port: 8082
spring:
application:
name: sca-provider
cloud:
nacos:
discovery:
server-addr: localhost:8848 #nacos在一台电脑可以不配置
config:
server-addr: localhost:8848 #配置地址
file-extension: yml #定义配置中心配置的格式
namespace: 3a5fe565-1aa9-41d0-bd3c-e4da7cf27ac0 # 默认命名空间为public
#group: DEFAULT_GROUP_51
shared-configs[0]: #这是配置共享配置文件的配置
data-id: app-public.yml # 这个名字为nacos中指定命名空间的data id
refresh: true #配置中心内容发生变化,是否动态刷新
logging:
level:
com.cy: debug #配置com.cy包的日志级别
下面代码用到了双重校验,很重要
package com.cy.provider.Controller;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.cloud.context.config.annotation.RefreshScope;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.concurrent.CopyOnWriteArrayList;
/**
* 测试配置分组
*/
@RestController
@RefreshScope
public class ProviderCacheController {
@Value("${useLocalCache:false}")//这是设置了默认值,false,防止检查不到yml配置文件或者nacos配置中心报错
private boolean useLocalCache;
@RequestMapping("/provider/cache")
public String doUseLocalCache(){
return "useLocalCache'value is "+useLocalCache;
}
//构建一个本地(local)缓存对象(基于jvm中的一个对象)
private List<String> list = new CopyOnWriteArrayList<>();
@RequestMapping("/provider/cache02")
public List<String> doUseLocalCache02(){
//假设这部分信息分类信息是从数据库是从数据库获取
if (!useLocalCache){//如果开启了就不走下面了直接return
System.out.println("++++++++++get data from database");
return Arrays.asList("A", "B", "C");
}
if (!useLocalCache) {
synchronized (list) {
if (list.isEmpty()) {
System.out.println("++++++++++get data from database");
List<String> list2 = Arrays.asList("A", "B", "C");
list.addAll(list2);
}
}
}
return list;
}
}
package com.cy;
import java.util.Timer;
import java.util.TimerTask;
/**
* 单线程任务调度
*/
public class TimerUtils {
public static void main(String[] args) {
//1.构建执行任务的对象
Timer timer = new Timer();//Timer创建时会创建一个线程,并且会为线程分配一个队列,所以他是单线程的
//2.构建任务对象
TimerTask task1 = new TimerTask() {
@Override
public void run() {
System.out.println(System.currentTimeMillis());
timer.cancel();//终结任务调度
}
};
//3.定时执行任务
timer.schedule(task1,//要执行的任务
30000,//1秒以后开始执行
30000);//每隔一秒执行一次
//基于Timer类执行定时是任务时,最大的缺陷是多个任务不能并发执行
}
}
Day05~Nacos配置管理模型
核心知识点
配置管理模型存在的意义
配置管理模型三要素及其要素关系
Nacos中读取指定命名空间和分组下的配置
Naocs中的共享配置的设计(对很多配置文件中的共性的一种提取方式)
常见问题分析
如何理解配置的命名空间(Namesapce)?(定义一些配置的作用域,做配置的分类管理,不同环境不同配置)
为什么要进行配置分组?(一个命名空间可以有多个分组,同一个生产环境下的不同活动会有不同配置)
配置中心运行有共享配置吗,如何引用?(可以,基于shared-configs元素进行引用)
Java程序中读取不到配置?(依赖,配置文件,命名空间,分组,data-id,空格,缩进,重启,放大招)
在ProviderCacheController类中添加一个本地Cache对象,在保证其线程安全的前提下,提高其性能
//构建一个本地(Local)缓存对象(基于jvm中的一个对象存储从数据库获取的数据).
private List<String> cache=new CopyOnWriteArrayList<>();
@RequestMapping("/provider/cache02")
public List<String> doUseLocalCache02(){
if(!useLocalCache){//假如没有打开本地Cache,则直接访问数据库
System.out.println("==Get data from database==");
return Arrays.asList("Category-A", "Category-B", "Category-C");
}
if(cache.isEmpty()) {
synchronized (cache) {
if (cache.isEmpty()) {//Thread-A,Thread-B,...
System.out.println("==Get data from database==");
//假设这部分分类信息是从数据库获取的,但是,我不希望每次获取分类信息都要从数据库查
List<String> cates = Arrays.asList("Category-A", "Category-B", "Category-C");
cache.addAll(cates);
}
}
}
return cache;
}//生产层面
单线程定义任务工具类
package com.jt.common.util;
import java.util.Timer;
import java.util.TimerTask;
import java.util.concurrent.ScheduledExecutorService;
/**
* 单线程定义任务工具类
*/
public class TimerUtils {
public static void main(String[] args) {
//1.构建执行任务的对象(这里选择java中的Timer对象)
//Timer对象创建时会创建一个线程,并且为线程分配一个任务队列
Timer timer=new Timer();
//2.构建任务对象
TimerTask task1=new TimerTask() {
@Override
public void run() {
System.out.println(System.currentTimeMillis());
//timer.cancel(); 结束任务调度
}
};
//3.定时执行任务
timer.schedule(task1,//要执行的任务
1000,//1秒以后开始执行
1000);//每隔1秒执行1次
//基于Timer类执行定时任务时,最大的缺陷是多个任务不能并发执行.
}
}
小节面试分析
Nacos配置管理模型的背景?(环境不同配置不同)
Nacos配置中的管理模型是怎样的?(namespace,group,service/data-id)
Nacos客户端(微服务)是否可以读取共享配置?(可以)
总结(Summary)
重难点分析
配置中心的选型。(市场活跃度、稳定性、性能、易用)
Nacos配置中心基本应用。(新建,修改、删除配置以后,在Nacos客户端应用配置)
配置管理模型应用。(namespace,group,service/dataId)
Nacos配置变更的动态感知。(底层原理分析)
FAQ分析
为什么需要配置中心?(动态管理发布配置,无需重启服务,更好保证服务的可用)
配置中一般要配置什么内容?(经常变化的配置数据-日志级别,线程池、连接池、…)
市面上有哪些主流配置中心?(Nacos,….)
配置中心选型时要重点考虑哪些因素?(市场活跃度、稳定性、性能、易用)
Nacos客户端(微服务业务)如何动态感知配置中心数据变化的?(nacos2.0之前nacos客户端采用长轮询机制每隔30秒拉取nacos配置信息.)
Nacos配置管理模型是怎样的?(命名空间-namespace,分组-group,服务实例-dataId)