当前位置: 首页 > news >正文

响应式网站建设特色排名网

响应式网站建设特色,排名网,vs2017可以做网站吗,鲜花网站建设店Ribbon服务实现不同服务,不同配置是通过RibbonClient和RibbonClients两个注解来实现的。RibbonClient注册的某个Client配置类。RibbonClients注册的全局默认配置类。 Feign实现不同服务,不同配置,是根据FeignClient来获取自定义的配置。 示…

Ribbon服务实现不同服务,不同配置是通过@RibbonClientRibbonClients两个注解来实现的。@RibbonClient注册的某个Client配置类。@RibbonClients注册的全局默认配置类。

Feign实现不同服务,不同配置,是根据FeignClient来获取自定义的配置。
在这里插入图片描述

示例

定义Ribbon配置类

public class AppRibbonConfig {@Beanpublic IPing iping() {return new DummyPing();}
}

启动类上添加注解

@RibbonClient(name = "app-provider", configuration = AppRibbonConfig.class)

源码解析

@RibbonClient@RibbonClients

这两个注解的功能都是引入RibbonClientConfigurationRegistrar,该类主要是生成RibbonClientSpecification的BeanDefinition。

RibbonAutoConfiguration

该类会获取到所有的RibbonClientSpecification,设置到SpringClientFactory的map集合中。

public class RibbonAutoConfiguration {@Autowired(required = false)private List<RibbonClientSpecification> configurations = new ArrayList();@Autowiredprivate RibbonEagerLoadProperties ribbonEagerLoadProperties;public RibbonAutoConfiguration() {}@Beanpublic HasFeatures ribbonFeature() {return HasFeatures.namedFeature("Ribbon", Ribbon.class);}@Beanpublic SpringClientFactory springClientFactory() {SpringClientFactory factory = new SpringClientFactory();factory.setConfigurations(this.configurations);return factory;}
}

系统中默认的配置有RibbonAutoConfigurationRibbonEurekaAutoConfigurationRibbonEurekaAutoConfiguration类上的注解上含有配置类,EurekaRibbonClientConfiguration

@Configuration
@EnableConfigurationProperties
@ConditionalOnRibbonAndEurekaEnabled
@AutoConfigureAfter({RibbonAutoConfiguration.class})
@RibbonClients(defaultConfiguration = {EurekaRibbonClientConfiguration.class}
)
public class RibbonEurekaAutoConfiguration {public RibbonEurekaAutoConfiguration() {}
}

@EnableFeignClients

该类会注册FeignClientSpecificationFeignClientsRegistrar#registerBeanDefinitions,会加载默认配置和对应的FeignClient服务名的配置。

    public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);}private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {Map<String, Object> defaultAttrs = metadata.getAnnotationAttributes(EnableFeignClients.class.getName(), true);if (defaultAttrs != null && defaultAttrs.containsKey("defaultConfiguration")) {String name;if (metadata.hasEnclosingClass()) {name = "default." + metadata.getEnclosingClassName();} else {name = "default." + metadata.getClassName();}this.registerClientConfiguration(registry, name, defaultAttrs.get("defaultConfiguration"));}}private void registerClientConfiguration(BeanDefinitionRegistry registry, Object name, Object configuration) {BeanDefinitionBuilder builder = BeanDefinitionBuilder.genericBeanDefinition(FeignClientSpecification.class);builder.addConstructorArgValue(name);builder.addConstructorArgValue(configuration);registry.registerBeanDefinition(name + "." + FeignClientSpecification.class.getSimpleName(), builder.getBeanDefinition());}

FeignAutoConfiguration

FeignAutoConfiguration会获取到FeignClientSpecification

@Configuration
@ConditionalOnClass({Feign.class})
@EnableConfigurationProperties({FeignClientProperties.class, FeignHttpClientProperties.class})
public class FeignAutoConfiguration {@Autowired(required = false)private List<FeignClientSpecification> configurations = new ArrayList();public FeignAutoConfiguration() {}@Beanpublic HasFeatures feignFeature() {return HasFeatures.namedFeature("Feign", Feign.class);}@Beanpublic FeignContext feignContext() {FeignContext context = new FeignContext();context.setConfigurations(this.configurations);return context;}

FeignClientFactoryBean

系统启动的时候,会加载FeignClientFactoryBean,会执行FeignClientFactoryBean#getObject,获取到context对象,从而获取相应的组件。

    protected Builder feign(FeignContext context) {FeignLoggerFactory loggerFactory = (FeignLoggerFactory)this.get(context, FeignLoggerFactory.class);Logger logger = loggerFactory.create(this.type);Builder builder = ((Builder)this.get(context, Builder.class)).logger(logger).encoder((Encoder)this.get(context, Encoder.class)).decoder((Decoder)this.get(context, Decoder.class)).contract((Contract)this.get(context, Contract.class));this.configureFeign(context, builder);return builder;}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);} else {return instance;}}

第一次访问服务

Ribbon是懒加载的,NamedContextFactory#getContext,第一次访问是没有context对象的,所以会进行创建。

    protected AnnotationConfigApplicationContext getContext(String name) {if (!this.contexts.containsKey(name)) {synchronized(this.contexts) {if (!this.contexts.containsKey(name)) {this.contexts.put(name, this.createContext(name));}}}return (AnnotationConfigApplicationContext)this.contexts.get(name);}

NamedContextFactory#createContext,根据服务配置生成对应的AnnotationConfigApplicationContext

    protected AnnotationConfigApplicationContext createContext(String name) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();if (this.configurations.containsKey(name)) {Class[] var3 = ((NamedContextFactory.Specification)this.configurations.get(name)).getConfiguration();int var4 = var3.length;for(int var5 = 0; var5 < var4; ++var5) {Class<?> configuration = var3[var5];context.register(new Class[]{configuration});}}Iterator var9 = this.configurations.entrySet().iterator();while(true) {Entry entry;do {if (!var9.hasNext()) {context.register(new Class[]{PropertyPlaceholderAutoConfiguration.class, this.defaultConfigType});context.getEnvironment().getPropertySources().addFirst(new MapPropertySource(this.propertySourceName, Collections.singletonMap(this.propertyName, name)));if (this.parent != null) {context.setParent(this.parent);context.setClassLoader(this.parent.getClassLoader());}context.setDisplayName(this.generateDisplayName(name));context.refresh();return context;}entry = (Entry)var9.next();} while(!((String)entry.getKey()).startsWith("default."));Class[] var11 = ((NamedContextFactory.Specification)entry.getValue()).getConfiguration();int var12 = var11.length;for(int var7 = 0; var7 < var12; ++var7) {Class<?> configuration = var11[var7];context.register(new Class[]{configuration});}}}

Ribbon提前加载

ribbon:eager-load:clients: app-providerenabled: true

RibbonAutoConfiguration中会根据配置判断是否生成对象ribbonApplicationContextInitializer

@Bean
@ConditionalOnProperty({"ribbon.eager-load.enabled"})
public RibbonApplicationContextInitializer ribbonApplicationContextInitializer() {return new RibbonApplicationContextInitializer(this.springClientFactory(), this.ribbonEagerLoadProperties.getClients());
}

RibbonApplicationContextInitializer#initialize,该类主要是根据配置的clients数据对相应的服务进行加载

protected void initialize() {if (this.clientNames != null) {Iterator var1 = this.clientNames.iterator();while(var1.hasNext()) {String clientName = (String)var1.next();this.springClientFactory.getContext(clientName);}}
}
http://www.ritt.cn/news/10361.html

相关文章:

  • 招标网有哪些长春seo排名优化
  • 网站流量渠道北京搜索引擎优化seo专员
  • 福建seo网站搜索优化排名
  • 微商网站制作在线搜索引擎
  • alibaba网站建设google play官网下载
  • 管理课程培训视频教程全集上海seo网站策划
  • 如何为网站开发app关键词搜索工具
  • 电子元器件在哪个网站上做b站暴躁姐
  • 网站建设项目需求分析sem竞价专员是干什么的
  • 深圳网站建设的企业网站seo平台
  • 怎么做阿里巴巴英文网站4p 4c 4r营销理论区别
  • 做视频网站 带宽多少才合适滕州网站建设优化
  • 网站开发设计内容建个网站需要多少钱?
  • 罗田网站建设软文例文 经典软文范例
  • 安徽房地产网站建设太原网络推广公司
  • 制作自己的平台网站优化seo培训班
  • 广州海珠做网站的公司网站排名优化技巧
  • 力杨网站建设今日热搜头条
  • 温州建网站哪家好我为什么不建议年轻人做运营
  • 怎样打开网站制作网站推广seo设置
  • 网站建设所需服务器费用企点qq官网
  • 网站建设检查整改情况报告seo推广灰色词
  • 恩施网站建设模板抖音seo关键词优化怎么做
  • 门户网站如何推广软件开发公司简介
  • 网站建设意义深圳seo关键词优化
  • wordpress手机字体变大6沈阳seo排名优化软件
  • 本地佛山顺德网站建设东莞seo优化公司
  • 长沙手机网站建设公司哪家好免费收录软文网站
  • 网站采用哪种开发语言百度竞价推广登录入口
  • JAVA做的小型网站有哪些网页制作代码模板