Spring Cloud Config配置中心
Environment环境加载
Environment就是指Spring应用运行的环境信息,例如从系统变量、命令行、配置文件application.yml等文件中的信息加载之后都会保存到Environment中。
Environment的初始化
org.springframework.boot.SpringApplication#run(java.lang.String...)
ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments);
准备环境的过程中,主要就是创建和配置Spring容器的环境信息:
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments) {// Create and configure the environment//按照应用的类型创建标准的环境ConfigurableEnvironment environment = getOrCreateEnvironment();//配置环境的PropertySource,设置profilesconfigureEnvironment(environment, applicationArguments.getSourceArgs());ConfigurationPropertySources.attach(environment);//事件驱动加载环境配置listeners.environmentPrepared(environment);bindToSpringApplication(environment);if (!this.isCustomEnvironment) {environment = new EnvironmentConverter(getClassLoader()).convertEnvironmentIfNecessary(environment,deduceEnvironmentClass());}ConfigurationPropertySources.attach(environment);return environment;
}
1. 创建一个标准的环境
private ConfigurableEnvironment getOrCreateEnvironment() {if (this.environment != null) {return this.environment;}switch (this.webApplicationType) {case SERVLET://若是Servlet应用则创建Servlet环境return new StandardServletEnvironment();case REACTIVE://若是reactive应用则创建Servlet环境return new StandardReactiveWebEnvironment();default://否则创建标准环境return new StandardEnvironment();}
}
获取webApplicationType: org.springframework.boot.WebApplicationType#deduceFromClasspath
static WebApplicationType deduceFromClasspath() {//org.springframework.web.reactive.DispatcherHandler类存在,//且org.springframework.web.servlet.DispatcherServlet类不存在//且org.glassfish.jersey.servlet.ServletContainer类不存在,则为REACTIVE应用if (ClassUtils.isPresent(WEBFLUX_INDICATOR_CLASS, null) && !ClassUtils.isPresent(WEBMVC_INDICATOR_CLASS, null)&& !ClassUtils.isPresent(JERSEY_INDICATOR_CLASS, null)) {return WebApplicationType.REACTIVE;}//javax.servlet.Servlet类 //或org.springframework.web.context.ConfigurableWebApplicationContext类不存在则为普通的应用for (String className : SERVLET_INDICATOR_CLASSES) {if (!ClassUtils.isPresent(className, null)) {return WebApplicationType.NONE;}}//否则为Servlet应用return WebApplicationType.SERVLET;}
这里以Servlet应用为例,看下环境的类结构图:
StandardServletEnvironment初始化
由于AbstractEnvironment类初始化调用了customizePropertySource方法,而customizePropertySource在StandardServletEnvironment和StandardEnvironment都有重写,所以会优先执行他们的方法:
org.springframework.web.context.support.StandardServletEnvironment#customizePropertySources
protected void customizePropertySources(MutablePropertySources propertySources) {//将Servlet的配置封装成一个标准的属性源添加到动态可变的属性源列表中propertySources.addLast(new StubPropertySource(SERVLET_CONFIG_PROPERTY_SOURCE_NAME));//将Servlet的上下文封装成一个标准的属性源添加到动态可变的属性源列表中propertySources.addLast(new StubPropertySource(SERVLET_CONTEXT_PROPERTY_SOURCE_NAME));//添加JNDI的属性源if (JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {propertySources.addLast(new JndiPropertySource(JNDI_PROPERTY_SOURCE_NAME));}super.customizePropertySources(propertySources);
}
org.springframework.core.env.StandardEnvironment#customizePropertySources
protected void customizePropertySources(MutablePropertySources propertySources) {////将系统属性源System.getProperties()添加到动态可变的属性源列表中propertySources.addLast(new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));//将系统环境属性System.getenv()添加到动态可变的属性源列表中propertySources.addLast(new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));}
2.配置Environment和配置profiles
org.springframework.boot.SpringApplication#configureEnvironment
protected void configureEnvironment(ConfigurableEnvironment environment, String[] args) {//添加类型转化的服务 if (this.addConversionService) {ConversionService conversionService = ApplicationConversionService.getSharedInstance();environment.setConversionService((ConfigurableConversionService) conversionService);}//配置Environment中的propertysourcesconfigurePropertySources(environment, args);//配置profilesconfigureProfiles(environment, args);}
org.springframework.boot.SpringApplication#configurePropertySources
protected void configurePropertySources(ConfigurableEnvironment environment, String[] args) {MutablePropertySources sources = environment.getPropertySources();//若默认配置不为空,则将默认配置添加到MutablePropertySources,这个defaultProperties可以在SpringApplication中设置if (this.defaultProperties != null && !this.defaultProperties.isEmpty()) {sources.addLast(new MapPropertySource("defaultProperties", this.defaultProperties));}//若设置了命令行属性,则设置成SimpleCommandLinePropertySource添加到MutablePropertySources的最前面if (this.addCommandLineProperties && args.length > 0) {String name = CommandLinePropertySource.COMMAND_LINE_PROPERTY_SOURCE_NAME;if (sources.contains(name)) {PropertySource<?> source = sources.get(name);CompositePropertySource composite = new CompositePropertySource(name);composite.addPropertySource(new SimpleCommandLinePropertySource("springApplicationCommandLineArgs", args));composite.addPropertySource(source);sources.replace(name, composite);}else {sources.addFirst(new SimpleCommandLinePropertySource(args));}}}
org.springframework.boot.SpringApplication#configureProfiles
protected void configureProfiles(ConfigurableEnvironment environment, String[] args) {//若设置了activeProfiles则加入到环境中Set<String> profiles = new LinkedHashSet<>(this.additionalProfiles);profiles.addAll(Arrays.asList(environment.getActiveProfiles()));environment.setActiveProfiles(StringUtils.toStringArray(profiles));}
3.发送环境准备的事件
listeners.environmentPrepared(environment)
void environmentPrepared(ConfigurableEnvironment environment) {for (SpringApplicationRunListener listener : this.listeners) {listener.environmentPrepared(environment);}}
当所有实现了SpringApplicationRunListener的监听器,都会执行environmentPrepared的方法,在spring.factories配置了EventPublishingRunListener类:
org.springframework.boot.SpringApplicationRunListener=\
org.springframework.boot.context.event.EventPublishingRunListener
org.springframework.boot.context.event.EventPublishingRunListener#environmentPrepared
发送了一个ApplicationEnvironmentPreparedEvent事件
public void environmentPrepared(ConfigurableEnvironment environment) {this.initialMulticaster.multicastEvent(new ApplicationEnvironmentPreparedEvent(this.application, this.args, environment));}
而ConfigFileApplicationListener这个监听器正是来监听并处理ApplicationEnvironmentPreparedEvent事件的。
org.springframework.boot.context.config.ConfigFileApplicationListener#onApplicationEvent
public void onApplicationEvent(ApplicationEvent event) {if (event instanceof ApplicationEnvironmentPreparedEvent) {onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event);}if (event instanceof ApplicationPreparedEvent) {onApplicationPreparedEvent(event);}}
接着处理环境准备就绪的事件,配置加载过程
org.springframework.boot.context.config.ConfigFileApplicationListener#onApplicationEnvironmentPreparedEvent
private void onApplicationEnvironmentPreparedEvent(ApplicationEnvironmentPreparedEvent event) {List<EnvironmentPostProcessor> postProcessors = loadPostProcessors();postProcessors.add(this);AnnotationAwareOrderComparator.sort(postProcessors);for (EnvironmentPostProcessor postProcessor : postProcessors) {postProcessor.postProcessEnvironment(event.getEnvironment(), event.getSpringApplication());}}
ConfigFileApplicationListener同样实现了EnvironmentPostProcessor接口,所以最后达到postProcessEnvironment的方法
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {addPropertySources(environment, application.getResourceLoader());
}protected void addPropertySources(ConfigurableEnvironment environment, ResourceLoader resourceLoader) {//添加一个RandomValuePropertySource到Environment的MutablePropertySources中RandomValuePropertySource.addToEnvironment(environment);//加载spring boot中的配置信息,比如application.yml或者application.propertiesnew Loader(environment, resourceLoader).load();
}
new Loader(environment, resourceLoader).load()
这里是调用了FilteredPropertySource的apply方法,判断是否有设置defaultProperties,如果有则将默认配置设置一个FilteredPropertySource,然后再调用最后一个参数定义的匿名类(lambda表达式)
void load() {FilteredPropertySource.apply(this.environment, DEFAULT_PROPERTIES, LOAD_FILTERED_PROPERTY,(defaultProperties) -> {this.profiles = new LinkedList<>();this.processedProfiles = new LinkedList<>();this.activatedProfiles = false;this.loaded = new LinkedHashMap<>();initializeProfiles();while (!this.profiles.isEmpty()) {Profile profile = this.profiles.poll();if (isDefaultProfile(profile)) {addProfileToEnvironment(profile.getName());}load(profile, this::getPositiveProfileFilter,addToLoaded(MutablePropertySources::addLast, false));this.processedProfiles.add(profile);}load(null, this::getNegativeProfileFilter, addToLoaded(MutablePropertySources::addFirst, true));addLoadedPropertySources();applyActiveProfiles(defaultProperties);});
}
匿名类主要逻辑:
调用initializeProfiles初始化默认的Profile,没有设置的话就用默认,初始化之后保存到 private Deque<Profile> profiles; 中,它是一个LIFO队列。 因为 profiles 采用了 LIFO 队列,后进先出。所以会先加载profile为null的配置文件 ,也就是匹配 application.properties、application.yml 。
如果profiles不为空,则循环遍历每一个profiles,调用 load方法进行加载。
org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#initializeProfiles
该方法的作用是加载存在已经激活的 profiles,有自己设置的则加载自己设置的profiles,没有的话则使用默认的profiles
private void initializeProfiles() {// The default profile for these purposes is represented as null. We add it// first so that it is processed first and has lowest priority.this.profiles.add(null);Binder binder = Binder.get(this.environment);//获取spring.profiles.active的ProfilesSet<Profile> activatedViaProperty = getProfiles(binder, ACTIVE_PROFILES_PROPERTY);//获取spring.profiles.incloud的ProfilesSet<Profile> includedViaProperty = getProfiles(binder, INCLUDE_PROFILES_PROPERTY);//获取其他的ProfilesList<Profile> otherActiveProfiles = getOtherActiveProfiles(activatedViaProperty, includedViaProperty);this.profiles.addAll(otherActiveProfiles);// Any pre-existing active profiles set via property sources (e.g.// System properties) take precedence over those added in config files.this.profiles.addAll(includedViaProperty);addActiveProfiles(activatedViaProperty);if (this.profiles.size() == 1) { // only has null profile//如果没有设置司机的profiles,则使用默认的profilesfor (String defaultProfileName : this.environment.getDefaultProfiles()) {Profile defaultProfile = new Profile(defaultProfileName, true);this.profiles.add(defaultProfile);}}}
接下来就是具体加载每个Profile
org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#load
搜索约定配置文件的位置,循环每个位置,获取每个位置下的文件名称再进行加载
private void load(Profile profile, DocumentFilterFactory filterFactory, DocumentConsumer consumer) {getSearchLocations().forEach((location) -> {boolean isDirectory = location.endsWith("/");Set<String> names = isDirectory ? getSearchNames() : NO_SEARCH_NAMES;//按照每个名称进行加载names.forEach((name) -> load(location, name, profile, filterFactory, consumer));});}
org.springframework.boot.context.config.ConfigFileApplicationListener.Loader#load(java.lang.String, java.lang.String, org.springframework.boot.context.config.ConfigFileApplicationListener.Profile, org.springframework.boot.context.config.ConfigFileApplicationListener.DocumentFilterFactory, org.springframework.boot.context.config.ConfigFileApplicationListener.DocumentConsumer)
按照文件名称的后缀,获取具体的资源加载器,进行具体文件的加载过程
private void load(String location, String name, Profile profile, DocumentFilterFactory filterFactory,DocumentConsumer consumer) {if (!StringUtils.hasText(name)) {for (PropertySourceLoader loader : this.propertySourceLoaders) {if (canLoadFileExtension(loader, location)) {load(loader, location, profile, filterFactory.getDocumentFilter(profile), consumer);return;}}throw new IllegalStateException("File extension of config file location '" + location+ "' is not known to any PropertySourceLoader. If the location is meant to reference "+ "a directory, it must end in '/'");}Set<String> processed = new HashSet<>();for (PropertySourceLoader loader : this.propertySourceLoaders) {for (String fileExtension : loader.getFileExtensions()) {if (processed.add(fileExtension)) {loadForFileExtension(loader, location + name, "." + fileExtension, profile, filterFactory,consumer);}}}}
资源加载器目前自带的有两种,一种是properties文件加载器,一种是yaml/yml文件加载器:
# PropertySource Loaders
org.springframework.boot.env.PropertySourceLoader=\
org.springframework.boot.env.PropertiesPropertySourceLoader,\
org.springframework.boot.env.YamlPropertySourceLoader
至此,springBoot中的资源文件加载完毕,解析顺序从上到下。
Config Server获取配置
Spring Cloud Config Server提供了EnvironmentController,这样通过在浏览器访问即可从git中获取配置信息
EnvironmentController
@RequestMapping(path = "/{name}/{profiles:.*[^-].*}",produces = MediaType.APPLICATION_JSON_VALUE)public Environment defaultLabel(@PathVariable String name,@PathVariable String profiles) {return getEnvironment(name, profiles, null, false);}@RequestMapping(path = "/{name}/{profiles:.*[^-].*}",produces = EnvironmentMediaType.V2_JSON)public Environment defaultLabelIncludeOrigin(@PathVariable String name,@PathVariable String profiles) {return getEnvironment(name, profiles, null, true);}@RequestMapping(path = "/{name}/{profiles}/{label:.*}",produces = MediaType.APPLICATION_JSON_VALUE)public Environment labelled(@PathVariable String name, @PathVariable String profiles,@PathVariable String label) {return getEnvironment(name, profiles, label, false);}@RequestMapping(path = "/{name}/{profiles}/{label:.*}",produces = EnvironmentMediaType.V2_JSON)public Environment labelledIncludeOrigin(@PathVariable String name,@PathVariable String profiles, @PathVariable String label) {return getEnvironment(name, profiles, label, true);}
我们可以按照application、profiles、label三要素的配置方式来获取远程地址的配置信息,调用的都是getEnvironment方法:
public Environment getEnvironment(String name, String profiles, String label,boolean includeOrigin) {name = normalize(name);label = normalize(label);Environment environment = this.repository.findOne(name, profiles, label,includeOrigin);if (!this.acceptEmpty&& (environment == null || environment.getPropertySources().isEmpty())) {throw new EnvironmentNotFoundException("Profile Not found");}return environment;}
org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentRepository#findOne
以git远程地址为例,调用findOne获取Environment,其实git地址可以配置多个地址,从每个地址中拿到符合application、profiles、label三要素的配置信息
public Environment findOne(String application, String profile, String label,boolean includeOrigin) {for (PatternMatchingJGitEnvironmentRepository repository : this.repos.values()) {if (repository.matches(application, profile, label)) {for (JGitEnvironmentRepository candidate : getRepositories(repository,application, profile, label)) {try {if (label == null) {label = candidate.getDefaultLabel();}Environment source = candidate.findOne(application, profile,label, includeOrigin);if (source != null) {return source;}}catch (Exception e) {if (this.logger.isDebugEnabled()) {this.logger.debug("Cannot load configuration from " + candidate.getUri()+ ", cause: (" + e.getClass().getSimpleName()+ ") " + e.getMessage(),e);}continue;}}}}JGitEnvironmentRepository candidate = getRepository(this, application, profile,label);if (label == null) {label = candidate.getDefaultLabel();}if (candidate == this) {return super.findOne(application, profile, label, includeOrigin);}return candidate.findOne(application, profile, label, includeOrigin);}
org.springframework.cloud.config.server.environment.AbstractScmEnvironmentRepository#findOne(java.lang.String, java.lang.String, java.lang.String, boolean)
调用抽象类的findOne方法,主要有两个核心逻辑
调用getLocations从GIT远程仓库同步到本地
使用 NativeEnvironmentRepository 委托来读取本地文件内容
public synchronized Environment findOne(String application, String profile,String label, boolean includeOrigin) {NativeEnvironmentRepository delegate = new NativeEnvironmentRepository(getEnvironment(), new NativeEnvironmentProperties());Locations locations = getLocations(application, profile, label);delegate.setSearchLocations(locations.getLocations());Environment result = delegate.findOne(application, profile, "", includeOrigin);result.setVersion(locations.getVersion());result.setLabel(label);return this.cleaner.clean(result, getWorkingDirectory().toURI().toString(),getUri());}
至此,服务端获取远程git地址的配置信息完成。
ConfigClient获取配置
在spring boot项目启动时,有一个prepareContext的方法,它会回调所有实现了ApplicationContextInitializer 的实例,来做一些初始化工作。
org.springframework.boot.SpringApplication#prepareContext
private void prepareContext(ConfigurableApplicationContext context, ConfigurableEnvironment environment,SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments, Banner printedBanner) {context.setEnvironment(environment);postProcessApplicationContext(context);applyInitializers(context);listeners.contextPrepared(context);if (this.logStartupInfo) {logStartupInfo(context.getParent() == null);logStartupProfileInfo(context);}// Add boot specific singleton beansConfigurableListableBeanFactory beanFactory = context.getBeanFactory();beanFactory.registerSingleton("springApplicationArguments", applicationArguments);if (printedBanner != null) {beanFactory.registerSingleton("springBootBanner", printedBanner);}if (beanFactory instanceof DefaultListableBeanFactory) {((DefaultListableBeanFactory) beanFactory).setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);}if (this.lazyInitialization) {context.addBeanFactoryPostProcessor(new LazyInitializationBeanFactoryPostProcessor());}// Load the sourcesSet<Object> sources = getAllSources();Assert.notEmpty(sources, "Sources must not be empty");load(context, sources.toArray(new Object[0]));listeners.contextLoaded(context);}
org.springframework.cloud.bootstrap.config.PropertySourceBootstrapConfiguration#initialize
获取所有PropertySourceLocator, 遍历每个PropertySourceLocator,调用locateCollection获取属性源列表加入到Spring的MutablePropertySources 中
public void initialize(ConfigurableApplicationContext applicationContext) {List<PropertySource<?>> composite = new ArrayList<>();AnnotationAwareOrderComparator.sort(this.propertySourceLocators);boolean empty = true;ConfigurableEnvironment environment = applicationContext.getEnvironment();//遍历每个PropertySourceLocator for (PropertySourceLocator locator : this.propertySourceLocators) {Collection<PropertySource<?>> source = locator.locateCollection(environment);if (source == null || source.size() == 0) {continue;}List<PropertySource<?>> sourceList = new ArrayList<>();for (PropertySource<?> p : source) {//加入到sourceList中if (p instanceof EnumerablePropertySource) {EnumerablePropertySource<?> enumerable = (EnumerablePropertySource<?>) p;sourceList.add(new BootstrapPropertySource<>(enumerable));}else {sourceList.add(new SimpleBootstrapPropertySource(p));}}logger.info("Located property source: " + sourceList);composite.addAll(sourceList);empty = false;}//若获取的属性源不为空的情况下,加入到MutablePropertySources中if (!empty) {MutablePropertySources propertySources = environment.getPropertySources();String logConfig = environment.resolvePlaceholders("${logging.config:}");LogFile logFile = LogFile.get(environment);for (PropertySource<?> p : environment.getPropertySources()) {if (p.getName().startsWith(BOOTSTRAP_PROPERTY_SOURCE_NAME)) {propertySources.remove(p.getName());}}insertPropertySources(propertySources, composite);reinitializeLoggingSystem(environment, logConfig, logFile);setLogLevels(applicationContext, environment);handleIncludedProfiles(environment);}}
org.springframework.cloud.bootstrap.config.PropertySourceLocator#locateCollection(org.springframework.core.env.Environment)
PropertySource<?> locate(Environment environment);default Collection<PropertySource<?>> locateCollection(Environment environment) {return locateCollection(this, environment);}static Collection<PropertySource<?>> locateCollection(PropertySourceLocator locator,Environment environment) {PropertySource<?> propertySource = locator.locate(environment);if (propertySource == null) {return Collections.emptyList();}if (CompositePropertySource.class.isInstance(propertySource)) {Collection<PropertySource<?>> sources = ((CompositePropertySource) propertySource).getPropertySources();List<PropertySource<?>> filteredSources = new ArrayList<>();for (PropertySource<?> p : sources) {if (p != null) {filteredSources.add(p);}}return filteredSources;}else {return Arrays.asList(propertySource);}}
locateCollection获取属性源时,调用了locate方法,而locate方法是抽象方法,由其子类实现,Config Client提供了一个ConfigServicePropertySourceLocator:
org.springframework.cloud.config.client.ConfigServicePropertySourceLocator#locate
通过RestTemplate调用一个Config Server服务获得远程配置信息,然后将信息包装成OriginTrackedMapPropertySource,保存到 CompositePropertySource 中
@Retryable(interceptor = "configServerRetryInterceptor")public org.springframework.core.env.PropertySource<?> locate(org.springframework.core.env.Environment environment) {ConfigClientProperties properties = this.defaultProperties.override(environment);CompositePropertySource composite = new OriginTrackedCompositePropertySource("configService");RestTemplate restTemplate = this.restTemplate == null? getSecureRestTemplate(properties) : this.restTemplate;Exception error = null;String errorBody = null;try {String[] labels = new String[] { "" };if (StringUtils.hasText(properties.getLabel())) {labels = StringUtils.commaDelimitedListToStringArray(properties.getLabel());}String state = ConfigClientStateHolder.getState();// Try all the labels until one worksfor (String label : labels) {Environment result = getRemoteEnvironment(restTemplate, properties,label.trim(), state);if (result != null) {log(result);// result.getPropertySources() can be null if using xmlif (result.getPropertySources() != null) {for (PropertySource source : result.getPropertySources()) {@SuppressWarnings("unchecked")Map<String, Object> map = translateOrigins(source.getName(),(Map<String, Object>) source.getSource());composite.addPropertySource(new OriginTrackedMapPropertySource(source.getName(),map));}}if (StringUtils.hasText(result.getState())|| StringUtils.hasText(result.getVersion())) {HashMap<String, Object> map = new HashMap<>();putValue(map, "config.client.state", result.getState());putValue(map, "config.client.version", result.getVersion());composite.addFirstPropertySource(new MapPropertySource("configClient", map));}return composite;}}errorBody = String.format("None of labels %s found", Arrays.toString(labels));}catch (HttpServerErrorException e) {error = e;if (MediaType.APPLICATION_JSON.includes(e.getResponseHeaders().getContentType())) {errorBody = e.getResponseBodyAsString();}}catch (Exception e) {error = e;}if (properties.isFailFast()) {throw new IllegalStateException("Could not locate PropertySource and the fail fast property is set, failing"+ (errorBody == null ? "" : ": " + errorBody),error);}logger.warn("Could not locate PropertySource: "+ (error != null ? error.getMessage() : errorBody));return null;}
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
相关文章
- 使用OpenVINO部署并行的人体关键点检测模型
使用OpenVINO部署并行的人体关键点检测模型1 OpenVINO工具包 简介2 OpenVINO 推理引擎的介绍2.1 使用模型优化器转化为IR文件2.2 使用推理引擎进行推理3 OpenVINO 查看推理引擎可用设备4 单线程运行推理引擎4.1 使用Intel 集成GPU 单线程运行4.2 使用Intel 第二代神经计算棒(N…...
2024/5/8 2:09:09 - SRE是什么?
SRE是什么? SRE(Site Reliability Engineering),站点可靠性工程,起源于2003年。在系统管理员模式下,通常是通过人工操作完成任务,而SRE倾向通过设计、构建自动化工具来取代人工操作。SRE的本质是用软件工程的思维和方法解决复杂的运维问题。 DevOps是在2008年年末流行起来,…...
2024/4/24 10:24:21 - Git原理架构概述
Git是一个开源分布式版本控制系统,可以高速并且有效的处理很小到非常大的项目版本管理。Git是Linus Torvalds为了帮助管理Linux内核开发而开发的一个开源版本控制软件 什么是版本控制? 版本控制一般是指程序开发过程中的代码版本,配置文件及说明文档等文件修改变更的管理,版…...
2024/5/7 16:44:43 - 小白业余时间整理一些面试题-2
毕业一年后,趁工作闲暇之余整理一些Java面试题,上传到网上纯粹当做笔记,有错欢迎指出 --(2) java基础篇 一、JDK 和 JRE 有什么区别? jdk:java开发工具包,包含jre,jre中包含jvm jre:java运行环境 jvm:jre的一部分,他是整个java实现跨平台的最核心部分,负责解释执行Java字…...
2024/5/8 2:01:00 - 苹果X更换电池-苹果x电池寿命80%要换吗?
手机电池寿命小于80%,是否需要更换电池,这主要取决于用户的使用体验。苹果电池更换。我爱家电维修网告诉你如果感觉还可以,没有明显的使用经验,不一定需要立即更换,可以继续使用。 如果感觉寿命明显下降,并且伴随着电话卡的变化,建议更换新电池,让设备新鲜,可以更好地…...
2024/4/29 4:37:18 - 一对一视频直播APP开发要点
每个时代都有每个时代的印记,季节轮回交替,生命生生不息。科学技术蓬勃发展的今天,你记住了这个时代的什么呢?这是个色彩斑斓的世界,每一刻都值得被记录。 在这场激烈的竞争之中,少不了程序大神的付出,代码的从无到有,从初始到完善,无论是一对一直播还是传统直播模式,…...
2024/5/7 13:39:40 - 在CentOS8下安装使用MySQL8
1、下载安装CentOS81.1 下载搜索下载安装CentOS8(https://www.centos.org/download/)。1.2 安装在虚拟机中选择DVD ISO文件路径,自定义安装,不要缺省安装,选择中文。1.3 更新安装完成后重启,在登录界面用root登录,然后更新系统:[root@localhost~]# dnf upgrade更新完成…...
2024/4/21 23:11:17 - 一个java版本的复杂spark例子
首先说一下这个spark程序的目的。这个程序是要求对网站收到的http请求数据计算一些特征值,要求每10秒钟计算一次最近2小时的数据的特征值。这就需要用到spark的滑动窗口运算了。数据是从topic为app的kafka中读取,计算出来的特征值发往topic为app_FEATURE的kafka中。代码如下:…...
2024/5/8 2:39:29 - Redis复习总结面试资料
Redis复习总结面试资料 文章目录Redis复习总结面试资料概述什么是RedisRedis有哪些优缺点为什么要用 Redis /为什么要用缓存为什么要用 Redis 而不用 map/guava 做缓存?Redis为什么这么快数据类型Redis有哪些数据类型Redis的应用场景持久化什么是Redis持久化?Redis 的持久化机…...
2024/5/8 0:00:00 - SpringBoot之缓存@CachePut的使用
背景: 由于开发过程中总会涉及到一些业务需要实现数据信息的高效响应,而且对内存的要求又不是很大的前提下缓存是比较好的选择。1. SpringBoot为我们提供了一些高速开发的缓存其中@Cache就是比较官方化的,而且是符合JSP107规范。关于具体的缓存介绍请看上篇博客:JSR107缓存…...
2024/5/2 5:54:05 - 面试 | 百度测试开发岗位面试题目回顾
本文为霍格沃兹测试学院学员 JQY 同学面试百度高级测试开发工程师岗位的经历汇总,自带二次元呆萌搞笑风格. 百度测试开发面试题整理 一面题目 1、自我介绍一下2、说一下你们工作中的测试流程3、数据库熟吗?用过哪些数据库?索引会吗?事务了解吗?写一个 SQL 查询语句:给一…...
2024/5/7 19:01:44 - zookeeper复习总结面试资料
zookeeper复习总结面试资料 1. ZooKeeper 是什么? ZooKeeper 是一个开源的分布式协调服务。它是一个为分布式应用提供一致性服务的软件,分布式应用程序可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分…...
2024/5/8 6:19:10 - .net core 3.1 webapi接口项目框架搭建二:JWT 身份验证
JWT 身份验证引言引用依赖包添加身份认证相关服务到容器中swagger 中配置JWT开启中间件生成Token获取claims中的参数信息接口中添加[Authorize()]jwt 自定义策略 引言 JWT定义与优缺点 引用依赖包Microsoft.AspNetCore.Authentication.JwtBearer System.IdentityModel.Tokens.J…...
2024/4/18 23:27:11 - 基于JavaWeb的SSH的人力资源管理系统(源码+数据库+论文)
人力资源是现代企业发展的重要资源之一,加强人力资源的管理对于提高企业的核心竞争力和促进企业的长远发展有着深刻的意义。传统的人员管理方法在使用上存在着保密性低、模式老化、查询不方便等弊病。随着先进的人力资源管理思想的引进和计算机技术在企业管理领域的应用日益广…...
2024/5/8 3:17:30 - 消息中间件MQ(RabbitMQ)复习总结面试资料
文章目录为什么使用MQ?MQ的优点消息队列有什么优缺点?RabbitMQ有什么优缺点?你们公司生产环境用的是什么消息中间件?Kafka、ActiveMQ、RabbitMQ、RocketMQ 有什么优缺点?MQ 有哪些常见问题?如何解决这些问题?什么是RabbitMQ?rabbitmq 的使用场景RabbitMQ基本概念Rabbit…...
2024/5/7 18:45:07 - Spring Cloud Bus 服务总线,实现全局广播/定点通知
本文目录:写在开头环境说明1.了解 Spring Cloud Bus2.1 Bus 何方神圣 (Bus 是什么)2.2 Bus 原理2.Bus的两种设计思想2.1 触发客户端2.2 触发服务端2.3 如何选型3.环境搭建4.Bus 动态刷新全局广播配置4.1 集群版客户端组建4.2 服务端配置中心/客户端 pom 引入Bus总线依赖4.3 服…...
2024/5/7 7:02:08 - Tomcat复习总结面试资料
Tomcat复习总结面试资料 文章目录Tomcat复习总结面试资料Tomcat是什么?Tomcat的缺省端口是多少,怎么修改tomcat 有哪几种Connector 运行模式(优化)?Tomcat有几种部署方式?tomcat容器是如何创建servlet类实例?用到了什么原理?Tomcat工作模式Tomcat顶层架构Tomcat顶层架构小…...
2024/5/6 1:32:41 - 自动控制之PID原理
自动控制原理 从控制的方式看,自动控制系统有闭环和开环两种。 闭环控制: 闭环控制也就是(负)反馈控制,原理与人和动物的目的性行为相似,系统组成包括传感器(相当于感官),控制装置(相当于脑和神经),执行机构(相当于手腿和肌肉)。传感器检测被控对象的状态信息(输…...
2024/5/8 0:15:05 - 后端面试38讲——数据结构原理(笔记)
数组 (1)连续内存空间 (2)相同数据类型 优点:知道下标可以快速查询内容 链表 (1)内存空间可以不连续 (2)有指向下一个数据元素的地址指针 优点:插入、删除操作简单 Hash表 以K-V方式存储,Hash 表的物理存储其实是一个数组,如果我能够根据 Key 计算出数组下标,那么就…...
2024/4/29 3:22:06 - 1.16亿起拍!或是史上最贵法拍房?
如何捡漏法拍房?如何避坑?如何实现拍到即赚到? 请关注云拍圈! 近日,厦门顶级豪宅——云顶庄园有一套总价1.16亿的别墅爆出即将被拍卖。目前已经吸引了8725人围观,448人设置提醒。 据阿里法拍官网显示,该房源是厦门目前标价最高的70年住宅性质法拍房。 云顶庄园此次爆出的…...
2024/4/25 7:33:56
最新文章
- 爬虫学习:XPath匹配网页数据
目录 一、安装XPath 二、XPath的基础语法 1.选取节点 三、使用XPath匹配数据 1.浏览器审查元素 2.具体实例 四、总结 一、安装XPath 控制台输入指令:pip install lxml 二、XPath的基础语法 XPath是一种在XML文档中查找信息的语言,可以使用它在HTM…...
2024/5/8 6:43:24 - 梯度消失和梯度爆炸的一些处理方法
在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言,在此感激不尽。 权重和梯度的更新公式如下: w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...
2024/5/7 10:36:02 - yolov9直接调用zed相机实现三维测距(python)
yolov9直接调用zed相机实现三维测距(python) 1. 相关配置2. 相关代码2.1 相机设置2.2 测距模块2.2 实验结果 相关链接 此项目直接调用zed相机实现三维测距,无需标定,相关内容如下: 1. yolov4直接调用zed相机实现三维测…...
2024/5/7 4:57:37 - Unity核心学习
目录 认识模型的制作流程模型的制作过程 2D相关图片导入设置图片导入概述纹理类型设置纹理形状设置纹理高级设置纹理平铺拉伸设置纹理平台打包相关设置 SpriteSprite Editor——Single图片编辑Sprite Editor——Multiple图片编辑Sprite Editor——Polygon图片编辑SpriteRendere…...
2024/5/5 8:40:53 - 416. 分割等和子集问题(动态规划)
题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义:dp[i][j]表示当背包容量为j,用前i个物品是否正好可以将背包填满ÿ…...
2024/5/7 19:05:20 - 【Java】ExcelWriter自适应宽度工具类(支持中文)
工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...
2024/5/7 22:31:36 - Spring cloud负载均衡@LoadBalanced LoadBalancerClient
LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon,直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件,我们讨论Spring负载均衡以Spring Cloud2020之后版本为主,学习Spring Cloud LoadBalance,暂不讨论Ribbon…...
2024/5/8 1:37:40 - TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案
一、背景需求分析 在工业产业园、化工园或生产制造园区中,周界防范意义重大,对园区的安全起到重要的作用。常规的安防方式是采用人员巡查,人力投入成本大而且效率低。周界一旦被破坏或入侵,会影响园区人员和资产安全,…...
2024/5/7 14:19:30 - VB.net WebBrowser网页元素抓取分析方法
在用WebBrowser编程实现网页操作自动化时,常要分析网页Html,例如网页在加载数据时,常会显示“系统处理中,请稍候..”,我们需要在数据加载完成后才能继续下一步操作,如何抓取这个信息的网页html元素变化&…...
2024/5/8 1:37:39 - 【Objective-C】Objective-C汇总
方法定义 参考:https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...
2024/5/7 16:57:02 - 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】🌏题目描述🌏输入格…...
2024/5/7 14:58:59 - 【ES6.0】- 扩展运算符(...)
【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数࿰…...
2024/5/7 1:54:46 - 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?
文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕,各大品牌纷纷晒出优异的成绩单,摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称,在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁,多个平台数据都表现出极度异常…...
2024/5/7 21:15:55 - Go语言常用命令详解(二)
文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令,这些命令可以帮助您在Go开发中进行编译、测试、运行和…...
2024/5/8 1:37:35 - 用欧拉路径判断图同构推出reverse合法性:1116T4
http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b,我们在 a i a_i ai 和 a i 1 a_{i1} ai1 之间连边, b b b 同理,则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然࿰…...
2024/5/7 16:05:05 - 【NGINX--1】基础知识
1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息,并安装一些有助于配置官方 NGINX 软件包仓库的软件包: apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...
2024/5/7 16:04:58 - Hive默认分割符、存储格式与数据压缩
目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限(ROW FORMAT)配置标准HQL为: ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...
2024/5/8 1:37:32 - 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法
文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中,传感器和控制器产生大量周…...
2024/5/7 16:05:05 - --max-old-space-size=8192报错
vue项目运行时,如果经常运行慢,崩溃停止服务,报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中,通过JavaScript使用内存时只能使用部分内存(64位系统&…...
2024/5/8 1:37:31 - 基于深度学习的恶意软件检测
恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞,例如可以被劫持的合法软件(例如浏览器或 Web 应用程序插件)中的错误。 恶意软件渗透可能会造成灾难性的后果,包括数据被盗、勒索或网…...
2024/5/8 1:37:31 - JS原型对象prototype
让我简单的为大家介绍一下原型对象prototype吧! 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定,每一个构造函数都有一个 prototype 属性,指向另一个对象,所以我们也称为原型对象…...
2024/5/7 11:08:22 - C++中只能有一个实例的单例类
C中只能有一个实例的单例类 前面讨论的 President 类很不错,但存在一个缺陷:无法禁止通过实例化多个对象来创建多名总统: President One, Two, Three; 由于复制构造函数是私有的,其中每个对象都是不可复制的,但您的目…...
2024/5/7 7:26:29 - python django 小程序图书借阅源码
开发工具: PyCharm,mysql5.7,微信开发者工具 技术说明: python django html 小程序 功能介绍: 用户端: 登录注册(含授权登录) 首页显示搜索图书,轮播图࿰…...
2024/5/8 1:37:29 - 电子学会C/C++编程等级考试2022年03月(一级)真题解析
C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...
2024/5/7 17:09:45 - 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...
解析如下:1、长按电脑电源键直至关机,然后再按一次电源健重启电脑,按F8健进入安全模式2、安全模式下进入Windows系统桌面后,按住“winR”打开运行窗口,输入“services.msc”打开服务设置3、在服务界面,选中…...
2022/11/19 21:17:18 - 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。
%读入6幅图像(每一幅图像的大小是564*564) f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...
2022/11/19 21:17:16 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...
win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面,在等待界面中我们需要等待操作结束才能关机,虽然这比较麻烦,但是对系统进行配置和升级…...
2022/11/19 21:17:15 - 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...
有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows,请勿关闭计算机”的提示,要过很久才能进入系统,有的用户甚至几个小时也无法进入,下面就教大家这个问题的解决方法。第一种方法:我们首先在左下角的“开始…...
2022/11/19 21:17:14 - win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...
置信有很多用户都跟小编一样遇到过这样的问题,电脑时发现开机屏幕显现“正在配置Windows Update,请勿关机”(如下图所示),而且还需求等大约5分钟才干进入系统。这是怎样回事呢?一切都是正常操作的,为什么开时机呈现“正…...
2022/11/19 21:17:13 - 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...
Win7系统开机启动时总是出现“配置Windows请勿关机”的提示,没过几秒后电脑自动重启,每次开机都这样无法进入系统,此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一:开机按下F8,在出现的Windows高级启动选…...
2022/11/19 21:17:12 - 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...
有不少windows10系统用户反映说碰到这样一个情况,就是电脑提示正在准备windows请勿关闭计算机,碰到这样的问题该怎么解决呢,现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法:1、2、依次…...
2022/11/19 21:17:11 - 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...
今天和大家分享一下win7系统重装了Win7旗舰版系统后,每次关机的时候桌面上都会显示一个“配置Windows Update的界面,提示请勿关闭计算机”,每次停留好几分钟才能正常关机,导致什么情况引起的呢?出现配置Windows Update…...
2022/11/19 21:17:10 - 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...
只能是等着,别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚,只能是考虑备份数据后重装系统了。解决来方案一:管理员运行cmd:net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...
2022/11/19 21:17:09 - 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?
原标题:电脑提示“配置Windows Update请勿关闭计算机”怎么办?win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢?一般的方…...
2022/11/19 21:17:08 - 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...
关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!关机提示 windows7 正在配…...
2022/11/19 21:17:05 - 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...
钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...
2022/11/19 21:17:05 - 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...
前几天班里有位学生电脑(windows 7系统)出问题了,具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面,长时间没反应,无法进入系统。这个问题原来帮其他同学也解决过,网上搜了不少资料&#x…...
2022/11/19 21:17:04 - 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...
本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法,并在最后教给你1种保护系统安全的好方法,一起来看看!电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中,添加了1个新功能在“磁…...
2022/11/19 21:17:03 - 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...
许多用户在长期不使用电脑的时候,开启电脑发现电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机。。.这要怎么办呢?下面小编就带着大家一起看看吧!如果能够正常进入系统,建议您暂时移…...
2022/11/19 21:17:02 - 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...
配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!配置windows update失败 还原更改 请勿关闭计算机&#x…...
2022/11/19 21:17:01 - 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...
不知道大家有没有遇到过这样的一个问题,就是我们的win7系统在关机的时候,总是喜欢显示“准备配置windows,请勿关机”这样的一个页面,没有什么大碍,但是如果一直等着的话就要两个小时甚至更久都关不了机,非常…...
2022/11/19 21:17:00 - 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...
当电脑出现正在准备配置windows请勿关闭计算机时,一般是您正对windows进行升级,但是这个要是长时间没有反应,我们不能再傻等下去了。可能是电脑出了别的问题了,来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...
2022/11/19 21:16:59 - 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...
我们使用电脑的过程中有时会遇到这种情况,当我们打开电脑之后,发现一直停留在一个界面:“配置Windows Update失败,还原更改请勿关闭计算机”,等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢࿰…...
2022/11/19 21:16:58 - 如何在iPhone上关闭“请勿打扰”
Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...
2022/11/19 21:16:57