Feign简介

  • Feign是一种声明式、模板化的HTTP客户端。声明式调用就像调用本地方法一样调用远程方法,无感知远程HTTP请求,让我们无需关注与远程的交互细节,更无需关注分布式环境开发。

  • 集成 Ribbon 和 Eureka 提供的负载均衡的客户端,支持断路器Hystrix,实现服务熔断和降级 。

基本使用

1.引入jar包

<dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId><version>2.1.2.RELEASE</version>
</dependency>

2.启动类加注解EnableFeignClients

@SpringBootApplication
@ComponentScan(basePackages = {"com.example","com.mock"})
@EnableFeignClients(basePackages = {"com.example"})
public class DemoApplication {public static void main(String[] args) {SpringApplication.run(DemoApplication.class, args);}
}

3.定义接口及方法

@FeignClient(value = "userService")
public interface UserFeignClient {@RequestMapping("/user/id")String findById(String id);
}

4.业务中调用

@Resource
private UserFeignClient userFeignClient;
@Override
public String findUser(String id) {return userFeignClient.findById(id);
}

通过以上方式,让我们在微服务之间调用就如同调用本地方法一般,内部的HTTP远程调用细节全部封装在Feign客户端中。

源码解读

1.启动扫描过程

启动类注解EnableFeignClients引入FeignClientsRegistrar,这个类实现了ImportBeanDefinitionRegistrar接口,在IOC容器的启动过程中,会扫描到该接口是实现类并注册为bean definition,最终添加到容器中。

@Overridepublic void registerBeanDefinitions(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {// 注册默认的配置registerDefaultConfiguration(metadata, registry);// 为每一个添加了FeignClient的接口注册一个FeignClientFactoryBeanregisterFeignClients(metadata, registry);}

这个过程并没有实例化bean到容器中,只是先解析成BeanDefinition。default.com.example.demo.DemoApplication

第一步,registerDefaultConfiguration()方法:

private void registerDefaultConfiguration(AnnotationMetadata metadata,BeanDefinitionRegistry registry) {// 获取启动类EnableFeignClients注解的属性Map<String, Object> defaultAttrs = metadata.getAnnotationAttributes(EnableFeignClients.class.getName(), true);// 如果存在defaultConfiguration,则解析EnableFeignClients配置类// 然后构造beanName,为default+启动类的全限定名if (defaultAttrs != null && defaultAttrs.containsKey("defaultConfiguration")) {String name;if (metadata.hasEnclosingClass()) {name = "default." + metadata.getEnclosingClassName();}else {name = "default." + metadata.getClassName();}// 这里执行注册配置类到容器中(这个方法在下面其他地方还有用到)registerClientConfiguration(registry, name,defaultAttrs.get("defaultConfiguration"));}
}

registerClientConfiguration()方法:

private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name,Object configuration) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class);// 添加namebuilder.addConstructorArgValue(name);// 添加指定的配置builder.addConstructorArgValue(configuration);registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(),builder.getBeanDefinition());
}

这里将EnableFeignClients上配置的defaultConfiguration属性值包装成一个FeignClientSpecification放到容器中。

我们来看FeignClientSpecification这个类的结构,name就是default,configuration就是我们defaultConfiguration属性指定的配置类。

class FeignClientSpecification implements NamedContextFactory.Specification {private String name;private Class<?>[] configuration;}

需要注意的是,这里是将我们配置的类包装进一个FeignClientSpecification对象中,即使我们在启动类注解上没有指定配置类,这里仍然会存在一个FeignClientSpecification,只是它的configuration为空而已。

注册默认配置的过程结束。

第二步,registerFeignClients()方法:

EnableFeignClients有几个属性是用来指定FeignClient的,registerFeignClients方法前面部分就是在解析获取需要扫描包的,这里不做细说。

String[] basePackages() default {};
Class<?>[] basePackageClasses() default {};
Class<?>[] clients() default {};

我们来看真正注册FeignClient的代码:

  • 解析每个客户端的配置
for (String basePackage : basePackages) {Set<BeanDefinition> candidateComponents = scanner.findCandidateComponents(basePackage);for (BeanDefinition candidateComponent : candidateComponents) {if (candidateComponent instanceof AnnotatedBeanDefinition) {// verify annotated class is an interfaceAnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();Assert.isTrue(annotationMetadata.isInterface(),"@FeignClient can only be specified on an interface");// 获取FeignClient注解的属性Map<String, Object> attributes = annotationMetadata.getAnnotationAttributes(FeignClient.class.getCanonicalName());// 按照优先级将配置的contextId,value,name,,serviceId值当做FeignClint的唯一的名称,这个名称会与该客户端绑定。String name = getClientName(attributes);// 如同解析启动类注解的配置类一样,这里解析各个Feign客户端指定的配置类。再一次调用了registerClientConfiguration方法。registerClientConfiguration(registry, name,attributes.get("configuration"));// 注册客户端registerFeignClient(registry, annotationMetadata, attributes);}}
}

这里再一次调用了registerClientConfiguration方法,会为每一个FeignClient生成一个FeignClientSpecification。所以,如果我们的的程序中有N个Feign客户端,那么IOC容器中就会有N+1个FeignClientSpecification。

  • 注册客户端
private void registerFeignClient(BeanDefinitionRegistry registry,AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {String className = annotationMetadata.getClassName();// 这里是将每个客户端解析后包装成FeignClientFactoryBeanBeanDefinitionBuilder definition = BeanDefinitionBuilder.genericBeanDefinition(FeignClientFactoryBean.class);validate(attributes);definition.addPropertyValue("url", getUrl(attributes));definition.addPropertyValue("path", getPath(attributes));String name = getName(attributes);definition.addPropertyValue("name", name);String contextId = getContextId(attributes);definition.addPropertyValue("contextId", contextId);definition.addPropertyValue("type", className);definition.addPropertyValue("decode404", attributes.get("decode404"));definition.addPropertyValue("fallback", attributes.get("fallback"));definition.addPropertyValue("fallbackFactory", attributes.get("fallbackFactory"));definition.setAutowireMode(AbstractBeanDefinition.AUTOWIRE_BY_TYPE);String alias = contextId + "FeignClient";AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();boolean primary = (Boolean) attributes.get("primary"); // has a default, won't be                                           beanDefinition.setPrimary(primary);String qualifier = getQualifier(attributes);if (StringUtils.hasText(qualifier)) {alias = qualifier;}BeanDefinitionHolder holder = new BeanDefinitionHolder(beanDefinition, className,new String[] { alias });BeanDefinitionReaderUtils.registerBeanDefinition(holder, registry);
}

这里是将客户端配置的各种属性解析后放到FeignClientFactoryBean对象中,如同之前包装配置类一样,这里将客户端信息再一次进行了包装。如同BeanDefinition是对bean进行描述,FeignClientFactoryBean是对feign客户端进行描述。

class FeignClientFactoryBean implements FactoryBean<Object>, InitializingBean, ApplicationContextAware {private Class<?> type;private String name;private String url;private String contextId;private String path;private boolean decode404;private ApplicationContext applicationContext;private Class<?> fallback = void.class;private Class<?> fallbackFactory = void.class;   }

FeignClientFactoryBean的属性与FeignClient对应。

启动过程执行流程图

启动加载流程图

总结:1.注册N+1个配置描述类FeignClientSpecification

​ 2.注册客户端描述类FeignClientFactoryBean

​ 3.因为feign是面向接口,接口不能实例化,所以将客户端信息包装后,再通过这个包装类获取代理类

2.实例化客户端代理类

FeignClientFactoryBean这个类是Feign中核心的类,获取代理类的入口就在这里。

getTarget方法最终会返回一个代理类,这个代理类最终被注入IOC容器中。

<T> T getTarget() {FeignContext context = this.applicationContext.getBean(FeignContext.class);Feign.Builder builder = feign(context);if (!StringUtils.hasText(this.url)) {if (!this.name.startsWith("http")) {this.url = "http://" + this.name;}else {this.url = this.name;}this.url += cleanPath();return (T) loadBalance(builder, context,new HardCodedTarget<>(this.type, this.name, this.url));}if (StringUtils.hasText(this.url) && !this.url.startsWith("http")) {this.url = "http://" + this.url;}String url = this.url + cleanPath();Client client = getOptional(context, Client.class);if (client != null) {if (client instanceof LoadBalancerFeignClient) {// not load balancing because we have a url,// but ribbon is on the classpath, so unwrapclient = ((LoadBalancerFeignClient) client).getDelegate();}builder.client(client);}Targeter targeter = get(context, Targeter.class);return (T) targeter.target(this, builder, context,new HardCodedTarget<>(this.type, this.name, url));
}

2.1 FeignContext

FeignContext的类图:

feigncontext类图

FeignAutoConfiguration

根据springboot的starter机制,在feign的META-INF目录的spring.factories文件中可以找到FeignAutoConfiguration,

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.cloud.openfeign.ribbon.FeignRibbonClientAutoConfiguration,\
org.springframework.cloud.openfeign.FeignAutoConfiguration,\
org.springframework.cloud.openfeign.encoding.FeignAcceptGzipEncodingAutoConfiguration,\
org.springframework.cloud.openfeign.encoding.FeignContentGzipEncodingAutoConfiguration
public class FeignAutoConfiguration {@Autowired(required = false)private List<FeignClientSpecification> configurations = new ArrayList<>();@Beanpublic FeignContext feignContext() {FeignContext context = new FeignContext();context.setConfigurations(this.configurations);return context;}}  

在这个自动装配的类中,会通过容器得到所有的FeignClientSpecification实例(就是在启动扫描中注册的默认配置和每个客户端配置),存入集合configurations中,在FeignContext构造方法中将这些配置设置进去。setConfigurations()方法是FeignContext父类NamedContextFactory中的方法。

NamedContextFactory

public abstract class NamedContextFactory<C extends NamedContextFactory.Specification>implements DisposableBean, ApplicationContextAware {private final String propertySourceName;private final String propertyName;// 存放子容器的地方private Map<String, AnnotationConfigApplicationContext> contexts = new ConcurrentHashMap<>();// 这里存放的是所有的FeignClientSpecification,N+1private Map<String, C> configurations = new ConcurrentHashMap<>();private ApplicationContext parent;private Class<?> defaultConfigType;

所以,所有的FeignClientSpecification都存入了configurations集合中。我们还需要关注的是contexts这个属性,存放的是为每个客户端创建的子容器

FeignContext为feign上下文,全局只有一个,里面保存了各个客户端的配置以及子容器。

2.2 Feign.Builder

BuilderFeign的一个内部类。我们看一下他们的结构。

public abstract class Feign {		public static class Builder {private final List<RequestInterceptor> requestInterceptors =new ArrayList<RequestInterceptor>();private Logger.Level logLevel = Logger.Level.NONE;private Contract contract = new Contract.Default();private Client client = new Client.Default(null, null);private Retryer retryer = new Retryer.Default();private Logger logger = new NoOpLogger();private Encoder encoder = new Encoder.Default();private Decoder decoder = new Decoder.Default();private QueryMapEncoder queryMapEncoder = new QueryMapEncoder.Default();private ErrorDecoder errorDecoder = new ErrorDecoder.Default();private Options options = new Options();private InvocationHandlerFactory invocationHandlerFactory =new InvocationHandlerFactory.Default();private boolean decode404;private boolean closeAfterDecode = true;private ExceptionPropagationPolicy propagationPolicy = NONE;}
}  

Feign的大部分功能都是通过Builder实现的,我们只需要关注Builder即可。Builder中包含客户端发送和接收请求重要的组件,包括编码器encoder、解码器decoder以及最终执行的Client。feign可以针对每个客户端做不同的配置,所以,这里就是保存了每个客户端需要的组件,如果程序中没有显式的指定组件,那么就使用默认的。Builder中的组件最终也会保存到我们生成的代理类中,在执行请求或者解析响应结果是会用到各自的组件。

接下来我们进入Feign.Builder builder = feign(context)分析具体过程:

protected Feign.Builder feign(FeignContext context) {// 从子容器中获取decoder、encoder等组件。FeignLoggerFactory loggerFactory = get(context, FeignLoggerFactory.class);Logger logger = loggerFactory.create(this.type);Feign.Builder builder = get(context, Feign.Builder.class)// required values.logger(logger).encoder(get(context, Encoder.class)).decoder(get(context, Decoder.class)).contract(get(context, Contract.class));   // 加载配置文件定义的decoder、encoder组件configureFeign(context, builder);return builder;
}

该方法具体过程可分为两步:一是从子容器中获取组件配置,二是从配置文件中获取组件配置。所以,配置文件的配置会覆盖代码中配置的,这样可以让我们通过更改配置文件来更改客户端使用的组件,变得更灵活。

  • 从容器中加载配置

这里多次调用了get()方法,如下所示:

protected <T> T get(FeignContext context, Class<T> type) {T instance = context.getInstance(this.contextId, type);if (instance == null) {throw new IllegalStateException("No bean found of type " + type + " for " + this.contextId);}return instance;
}

调用FeignContext父类NamedContextFactory中的方法:

public <T> T getInstance(String name, Class<T> type) {AnnotationConfigApplicationContext context = getContext(name);if (BeanFactoryUtils.beanNamesForTypeIncludingAncestors(context,type).length > 0) {return context.getBean(type);}return null;
}

虽然get()方法的入参是FeignContext,但并没有直接从FeignContext获取组件的实例,而是先从FeignContext获取当前客户端的子容器,然后从子容器中获取相应实例。

再看getContext(name)方法:

protected AnnotationConfigApplicationContext getContext(String name) {if (!this.contexts.containsKey(name)) {synchronized (this.contexts) {if (!this.contexts.containsKey(name)) {// 创建子容器this.contexts.put(name, createContext(name));}}}// 返回当前客户端的子容器return this.contexts.get(name);
}

子容器保存在map中,如果有的化直接返回,没有的话会使用createContext(name)创建一个。

创建子容器的过程

protected AnnotationConfigApplicationContext createContext(String name) {//创建一个上下文实例AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 注册当前客户端的配置类。之前提到的为每个客户端创建的**FeignClientSpecification**,里面包含了我们指定的配置类if (this.configurations.containsKey(name)) {for (Class<?> configuration : this.configurations.get(name).getConfiguration()) {context.register(configuration);}}// 注册默认的配置类,即名称是以default开头的(启动类EnabledFeignClients注解上的)。for (Map.Entry<String, C> entry : this.configurations.entrySet()) {if (entry.getKey().startsWith("default.")) {for (Class<?> configuration : entry.getValue().getConfiguration()) {context.register(configuration);}}}  context.setDisplayName(generateDisplayName(name));// 刷新当前的容器,会将我们配置的bean添加到子容器中。关于spring中refresh()方法的过程,太复杂,不细说。context.refresh();return context;
}

创建子容器后,会把默认的以及我们为每个FeignClient配置的类加载的到子容器中,然后刷新子容器。

Feign会为每个客户端创建一个子容器,这个容器中保存了各自的组件配置,包括编码器、解码器等,做到配置隔离。

获取到子容器后,就可以从中获取配置类中指定的组件。

Feign.Feign.Builder builder = get(context, Feign.Builder.class)// required values.logger(logger).encoder(get(context, Encoder.class)).decoder(get(context, Decoder.class)).contract(get(context, Contract.class)); builder = get(context, Feign.Builder.class)// required values.logger(logger).encoder(get(context, Encoder.class)).decoder(get(context, Decoder.class)).contract(get(context, Contract.class));

通过链式编程将各种组件设置到Builder中。

  • 从配置文件中加载配置
protected void configureFeign(FeignContext context, Feign.Builder builder) {FeignClientProperties properties = this.applicationContext.getBean(FeignClientProperties.class);// 使用配置文件if (properties != null) {// 这里要判断defaultConfig的值。// 下面分支里面执行的代码基本一样,只是顺序不一样,后面的会把前面相同的配置给覆盖。// 所以,如果defaultConfig为true的,那么优先使用配置文件。这也是默认配置// 如果defaultConfig为false,那么优先使用代码的配置。if (properties.isDefaultToProperties()) {configureUsingConfiguration(context, builder);configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder);configureUsingProperties(properties.getConfig().get(this.contextId),builder);}else {configureUsingProperties(properties.getConfig().get(properties.getDefaultConfig()),builder);configureUsingProperties(properties.getConfig().get(this.contextId),builder);configureUsingConfiguration(context, builder);}}else {//使用代码中配置的configureUsingConfiguration(context, builder);}
}

FeignClientProperties的内部类FeignClientConfiguration就是的配置文件类,配置项会解析到这个类中。

public class FeignClientProperties {// 是否使用默认的配置private boolean defaultToProperties = true;// 配置文件参数对应的前缀private String defaultConfig = "default";// 保存各个配置的集合,key是配置文件中读取的。private Map<String, FeignClientConfiguration> config = new HashMap<>();

在properties或yaml配置文件中使用,上面是默认default的配置,下面是userService的配置,default和userService可以根据具体的服务更改。示例:

# default
feign.client.config.default.decode404=true
feign.client.config.default.connect-timeout=1000
feign.client.config.default.decoder=com.example.demo.feign.config.DefaultDecoder
# userService       
feign.client.config.userService.connect-timeout=111
feign.client.config.userService.decode404=false
feign.client.config.userService.decoder=com.example.demo.feign.config.UserDecoder

配置项会读取到Map<String, FeignClientConfiguration> config = new HashMap<>()中,例如上面的配置,key就是default和userService。

如果没有在文件中配置,就会直接使用代码的配置。如果在配置文件中配置了,要视defaultConfig的值而定,影响到优先级问题,不过无论如果在配置文件中配置的针对某个服务单独配置的总是优先于default的。

2.3 获取代理类

我们现在只分析不考虑负载均衡的情况:

return targeter.target(this, builder, context, new HardCodedTarget<>(this.type, this.name, url));

首先是创建了HardCodedTarget对象,保存了type,name,url。

DefaultTargeter中:

class DefaultTargeter implements Targeter {@Overridepublic <T> T target(FeignClientFactoryBean factory, Feign.Builder feign,FeignContext context, Target.HardCodedTarget<T> target) {return feign.target(target);}
}

然后会调用Feign.Builder的target方法。我们前面分析过,Feign.Builder中保存了我们客户端需要的各种组件,现在代理类也是通过它来创建的。

public <T> T target(Target<T> target) {return build().newInstance(target);
}
public Feign build() {//创建MethodHandler的工厂()SynchronousMethodHandler.Factory synchronousMethodHandlerFactory =new SynchronousMethodHandler.Factory(client, retryer, requestInterceptors, logger,logLevel, decode404, closeAfterDecode, propagationPolicy);MethodHandler handlersByName =new ParseHandlersByName(contract, options, encoder, decoder, queryMapEncoder,errorDecoder, synchronousMethodHandlerFactory);return new ReflectiveFeign(handlersByName, invocationHandlerFactory, queryMapEncoder);
}

build()中首先是创建了一个工厂实例,这个工厂是用来创建MethodHandler的;然后创建MethodHandler,这是用来解析feign接口中的方法的。然后返回了一个

ReflectiveFeign。

newInstance(target)

public <T> T newInstance(Target<T> target) {// 解析接口的方法,每个方法都有一个MethodHandlerMap<String, MethodHandler> nameToHandler = targetToHandlersByName.apply(target);// 将前面的名称与MethodHandler的映射转换为method与MethodHandler的映射。Map<Method, MethodHandler> methodToHandler = new LinkedHashMap<Method, MethodHandler>();List<DefaultMethodHandler> defaultMethodHandlers = new LinkedList<DefaultMethodHandler>();for (Method method : target.type().getMethods()) {// 判断是否是Object中的方法。if (method.getDeclaringClass() == Object.class) {continue;} else if (Util.isDefault(method)) {// 判断是否是接口中default方法。接口中不仅可以有抽象方法,还可以有default方法,具体的逻辑可以在其中实现。DefaultMethodHandler handler = new DefaultMethodHandler(method);defaultMethodHandlers.add(handler);methodToHandler.put(method, handler);} else {// 将转换后的存入另一个map中methodToHandler.put(method, nameToHandler.get(Feign.configKey(target.type(), method)));}}// JDK中动态代理的辅助类,通过factoy创建的。InvocationHandler handler = factory.create(target, methodToHandler);// 动态代理类T proxy = (T) Proxy.newProxyInstance(target.type().getClassLoader(),new Class<?>[] {target.type()}, handler);for (DefaultMethodHandler defaultMethodHandler : defaultMethodHandlers) {defaultMethodHandler.bindTo(proxy);}return proxy;
}
  1. targetToHandlersByName.apply(target)。targetToHandlersByName是ReflectiveFeign的内部类,
public Map<String, MethodHandler> apply(Target key) {// 解析方法形成元数据 List<MethodMetadata> metadata = contract.parseAndValidatateMetadata(key.type());Map<String, MethodHandler> result = new LinkedHashMap<String, MethodHandler>();for (MethodMetadata md : metadata) {// create()构造出一个MethodHandlerresult.put(md.configKey(),factory.create(key, md, buildTemplate, options, decoder, errorDecoder));}return result;
}

之前提到过SynchronousMethodHandler是MehodHandler是实现类,而SynchronousMethodHandler.Factory是负责创建它的工厂。

final class SynchronousMethodHandler implements MethodHandler {private static final long MAX_RESPONSE_BUFFER_SIZE = 8192L;private final MethodMetadata metadata;private final Target<?> target;private final Client client;private final Retryer retryer;private final List<RequestInterceptor> requestInterceptors;private final Logger logger;private final Logger.Level logLevel;private final RequestTemplate.Factory buildTemplateFromArgs;private final Options options;private final Decoder decoder;private final ErrorDecoder errorDecoder;private final boolean decode404;private final boolean closeAfterDecode;private final ExceptionPropagationPolicy propagationPolicy;
}  

创建出来的SynchronousMethodHandler对象中就包含了客户端的各种组件、参数以及方法元数据。至此,我们可以分析一下,客户端的各种参数配置,不管是代码里面也好,还是通过配置文件配的也好,它最终都被封装到了这个对象中。这个对象的Invoke()也是最终执行远程调用的方法,到时候都会用到这些组件参数。

  1. 我们知道JDK的动态代理需要一个辅助类,这里的辅助类就是InvocationHandler handler = factory.create(target, methodToHandler)这里创建的。这也有个专门创建辅助类的工厂,create()创建的是FeignInvocationHandler对象,它也是ReflectiveFeign的内部类,不过这个类中有两个属性target和dispatch,target中有feign接口的type,name,url,dispatch则是接口中所有方法的映射。
private final Target target;
private final Map<Method, MethodHandler> dispatch;
  1. 创建代理类并返回

2.4 接口调用

我们知道JDK动态代理在调用目标类的方法时总是会调用InvocationHandler 辅助类的invoke()方法。在这里,创建的是FeignInvocationHandler的实现类对象,所以我们调用feign接口方法是调用的就是FeignInvocationHandler的invoke()方法。

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {// 入参method就是当前被调用方法对应的Method实例。return dispatch.get(method).invoke(args);
}
  1. dispatch.get(method)得到的是当前方法对应的MethodHandler
  2. invoke(args)执行的是MethodHandler的方法,这里是 MethodHandler的实现类SynchronousMethodHandler对象,所以我们看SynchronousMethodHandler的invoke()方法。
@Override
public Object invoke(Object[] argv) throws Throwable {RequestTemplate template = buildTemplateFromArgs.create(argv);Retryer retryer = this.retryer.clone();while (true) {try {// 真正去执行HTTP请求了return executeAndDecode(template);} catch (RetryableException e) {try {retryer.continueOrPropagate(e);} catch (RetryableException th) {Throwable cause = th.getCause();if (propagationPolicy == UNWRAP && cause != null) {throw cause;} else {throw th;}}if (logLevel != Logger.Level.NONE) {logger.logRetry(metadata.configKey(), logLevel);}continue;}}
}

executeAndDecode(template)是真正去执行HTTP请求了。


整个过程可以用一个时序图来表示:

Feign代理类创建过程

总体流程就是:启动时加载配置文件及每个客户端的组件,封装到Feign.Builder中,然后创建ReflectiveFeign实例,将method与MethodHandler进行映射存入FeignInvocationHandler中。调用FeignClient方法时只需要根据method取出对应的MethodHandler实例,然后执行invoke即可。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. 【Docker】Docker pull and login产生的timeout问题

    Docker pull and login产生的timeout问题 学习环境:安装在VM linux centos8上的docker 第一次产生timeout问题是直接从dockerhub上pull images时候产生的timeout,当时觉得是连海外服务器所以导致了超时。后来找了很多办法,把所有厂的加速器都用了遍,包括docker自己提供的加…...

    2024/4/24 9:27:06
  2. 【中国互联网江湖30年历史】再无风清扬,再有少年郎

    0马云退了。在萧山奥体中心,无数阿里人的祝福中,流着眼泪,结束了自己在阿里的最后一天。从此互联网江湖再无风清扬,反而多了一个叫做马云的乡村教师。他临别一挥手,似乎带走了中国互联网的一个时代。20年浮沉,都付笑谈中。30年的中国互联网发展史,或许到了一个需要回头看…...

    2024/4/24 9:27:02
  3. sklearn第五天

    文章目录算法总结-梯度提升树二分类原理算法流程梯度提升树二分类原理(二)pandas批量处理体侧成绩(一)空数据的处理pandas批量处理体侧成绩(二)adaboost原理介绍adaboost原理案例举例adaboost原理案例举例 算法总结-梯度提升树二分类原理算法流程从这划分均方误差最小。梯…...

    2024/4/24 9:27:06
  4. 【redis知识点整理】 --- RedisTemplate使用pipeline进行批量set需要注意的坑

    本文代码对应的github地址:https://github.com/nieandsun/redis-study文章目录1 简单介绍一下什么是pipeline --- 以jedis为例2 RedisTemplate使用pipeline批量set需要注意的坑1 简单介绍一下什么是pipeline — 以jedis为例 以批量根据key删除数据为例,如若单纯的使用del命令…...

    2024/4/24 9:26:57
  5. [Leedcode][JAVA][第101题][对称二叉树][队列][递归]

    【问题描述】[简单] 给定一个二叉树,检查它是否是镜像对称的。例如,二叉树 [1,2,2,3,4,4,3] 是对称的。1/ \2 2/ \ / \ 3 4 4 3【解答思路】1. 递归 时间复杂度:O(N^2) 空间复杂度:O(1) public boolean isSymmetric(TreeNode root) {if (root == null) return true;…...

    2024/5/6 20:40:41
  6. Macbook Pro 外接显卡实现Tensorflow GPU运行之TensorflowGPU配置

    Macbook Pro 外接显卡实现Tensorflow GPU运行MacOS 重装 外接显卡(内屏输出) 环境配置(重点) Tensorflow GPU 配置Tensorflow GPU配置 准备工作硬件准备:外接显卡,外界显示器/显卡欺骗器 环境/软件准备:相关驱动和环境编译工具一定要确保编译成功哦! 以笔者为例:资源 …...

    2024/4/24 9:26:56
  7. Java 选择排序法 傻瓜式图文详解!

    一、选择排序原理:第一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。以此类推,直到全部待排序的数据元素的个数为零。以依次选出数组中最小元素的为例:第一次…...

    2024/4/24 9:26:54
  8. shell脚本(实现效果 修改网卡ip地址、重启网卡和ssh免秘钥登录、cpu、内存、磁盘、ip地址)

    1、shell脚本(实现效果 修改网卡ip地址、重启网卡和ssh免秘钥登录、cpu、内存、磁盘、ip地址) [root@hhhh opt]# cat 888.sh #!/bin/bash #================================================================ function fn_0 () { cat << EOF 1) system q) quit EOF …...

    2024/4/24 9:26:53
  9. 数据结构与算法总览

    数据结构与算法总览...

    2024/4/24 9:26:53
  10. Nonholonomic Closed-loop Velocity Control of a Soft-tethered Magnetic Capsule Endoscope

    此文非常好!此文章是一篇标准的工程实现,从机器人joint space推导到磁力和磁力矩的关系,然后可以通过雅可比反解出joint增量来控制机械臂完成轨迹规划。在速度控制方面,利用胶囊的位置误差和速度误差,以及角度误差,可以估计出需要的磁力和磁力矩,还考虑累计尾绳的阻力,…...

    2024/5/5 3:03:21
  11. 训练准备和复杂度分析

    训练准备和复杂度分析...

    2024/5/5 6:38:23
  12. 最大子序列和,Kadane算法的前缀和解释

    在Kadane算法中,问题是求以下标i结尾的最大子序列和,换句话说,我们想找到cur−prefcur-prefcur−pref的最大值,其中curcurcur是[0,i][0,i][0,i]所有元素的和,pref是[0,j][0,j][0,j]所有元素的和,其中j<ij<ij<i,所以想要cur−prefcur-prefcur−pref最大,就是找…...

    2024/4/24 9:26:49
  13. 顺序表的基本操作C/C++代码实现

    插入: 一般情况下,在第i 个位置插入一个元素时,需从最后一个元素即第n个元素开始,依次向后移动一个位置,直至第i个元素(共n-i+1个元素)。删除: 一般情况下,删除第i个元素时需将第i+ 1 个至第n个元素(共n-i个元素) 依次向前移动一个位置 (i = n时无需移动)。线性表顺…...

    2024/4/24 9:26:48
  14. 百钱买百鸡问题

    引入 我国古代数学家张丘建在《算经》一书中曾提出过著名的“百钱买百鸡”问题,该问题叙述如下:鸡翁一,值钱五;鸡母一,值钱三;鸡雏三,值钱一;百钱买百鸡,则翁、母、雏各几何? 百钱买百鸡的问题算是一套非常经典的不定方程的问题,题目很简单:公鸡5文钱一只,母鸡3文…...

    2024/5/5 9:54:42
  15. 洛谷 - Roy&October之取石子 (博弈论)

    题目链接 题目:思路: 先找规律叭,先一个一个的枚举。 1.枚举后我们发现: 1 2 3 4 5都是可以一次拿完的。 2.而当到6的时候,我们先手不可能一次性把6拿完,那么必定是后手赢了。//那么我们这里就先可以记住一个分界点了,后面可以以此为基准来判断 : 谁先遇到6,先必输 3.而当…...

    2024/4/19 9:37:07
  16. 遗传-蚁群算法python实现

    import tkinter from functools import reduce import numpy as np import random import math""" 为了解决蚁群算法前期因缺乏信息素因素导致的收敛缓慢 利用了遗传算法前期快速收敛的特性 继续前期的遗传变异 旨在若干组的优秀解 为后面蚁群算法的初始化信息…...

    2024/4/25 3:57:17
  17. OPC UA开源库介绍

    本文主要简单介绍一下OPC UA相关的开源库,这样大家可以根据需要去选择使用。关于OPC UA的本质,这篇博客讲的挺好,可以看下。 以下排名不分先后。1. open62541 这个是本人经常使用的库,支持跨平台,支持异步,文档写的也很好。下面是该库的信息,官网地址:https://open6254…...

    2024/4/16 11:12:28
  18. 【Dlib人脸检测】3. 检测并绘制人脸区域

    【 1. 加载模型 】 上一次我们训练了自己的模型,并把模型保存在了detector.svm中了。 如果想要在加载自己训练的基于HOG-SVM的模型,那么我们可以用以下代码加载我们训练的模型: detector = dlib.simple_object_detector("detector.svm")上一关我们训练的人脸模型由…...

    2024/4/24 9:26:47
  19. AliOS-Things+ESP32 BLE篇 (1)BLE peripheral

    由于STM32的板子没有自带蓝牙和wifi模组,所以外设方面的demo,我选择放到乐鑫的ESP32模组上。一方面是由于ESP32这块板子有丰富的BT/WIFI的实现例程,还因为乐鑫的这款SOC扩展性很强,自身的SDK: ESP-IDF也比较成熟。 BLE Peripheral指的是蓝牙外设,比如蓝牙手环,蓝牙电视遥…...

    2024/4/24 9:26:46
  20. 根据先序遍历创建树,遍历

    根据先序遍历创建树 输入 543###6#7## #include <iostream> #include <algorithm> #include <cstring> #include<string> #include<vector> #include<cmath> #include<stack> #include<queue> using namespace std; struct No…...

    2024/4/24 9:26:50

最新文章

  1. MyCat安装

    MyCat安装 官网下载地址打不开说明采用站点的方式进行下载基础包 &#xff1a;程序包&#xff1a; 配置原型库数据源root.user.json 配置文件说明&#xff08;默认配置&#xff09; Mycat启动授权启动mycat启动mycat查看mycat日志连接Mycat 官网下载地址打不开说明 官网可能受…...

    2024/5/7 4:01:03
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/5/6 9:38:23
  3. 【APUE】网络socket编程温度采集智能存储与上报项目技术------多路复用

    作者简介&#xff1a; 一个平凡而乐于分享的小比特&#xff0c;中南民族大学通信工程专业研究生在读&#xff0c;研究方向无线联邦学习 擅长领域&#xff1a;驱动开发&#xff0c;嵌入式软件开发&#xff0c;BSP开发 作者主页&#xff1a;一个平凡而乐于分享的小比特的个人主页…...

    2024/5/6 2:28:08
  4. Docker Desktop+WSL2安装到自定义路径

    现在大多数软件实在太“流氓”了&#xff0c;在安装过程中&#xff0c;根本不让你选择安装路径&#xff0c;默认安装到$HOME下&#xff08;windows C盘&#xff09;&#xff0c;随着软件的使用增多&#xff0c;可能磁盘空间不够&#xff0c;这个时候就想着&#xff0c;看看某些…...

    2024/5/6 2:23:47
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/4 23:54:56
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/4 23:54:56
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/5/4 23:54:56
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/6 9:21:00
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/5/4 23:54:56
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/5/4 23:55:05
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/5/4 23:54:56
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/5/4 23:55:16
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/5/4 23:54:56
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/6 1:40:42
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/5/4 23:54:56
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/5/4 23:55:17
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/5/4 23:55:06
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/5/4 23:54:56
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/4 23:55:06
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/5/5 8:13:33
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/5/4 23:55:16
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/5/4 23:54:58
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/6 21:42:42
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/5/4 23:54:56
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; 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
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在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