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

莆田网站建设网大型门户网站核心技术

莆田网站建设网,大型门户网站核心技术,网站搭建的费用,域名服务商是什么意思Ribbon服务实现不同服务#xff0c;不同配置是通过RibbonClient和RibbonClients两个注解来实现的。RibbonClient注册的某个Client配置类。RibbonClients注册的全局默认配置类。 Feign实现不同服务#xff0c;不同配置#xff0c;是根据FeignClient来获取自定义的配置。 示…Ribbon服务实现不同服务不同配置是通过RibbonClient和RibbonClients两个注解来实现的。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 ListRibbonClientSpecification 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;} }系统中默认的配置有RibbonAutoConfiguration和RibbonEurekaAutoConfigurationRibbonEurekaAutoConfiguration类上的注解上含有配置类EurekaRibbonClientConfiguration。 Configuration EnableConfigurationProperties ConditionalOnRibbonAndEurekaEnabled AutoConfigureAfter({RibbonAutoConfiguration.class}) RibbonClients(defaultConfiguration {EurekaRibbonClientConfiguration.class} ) public class RibbonEurekaAutoConfiguration {public RibbonEurekaAutoConfiguration() {} }EnableFeignClients 该类会注册FeignClientSpecification。FeignClientsRegistrar#registerBeanDefinitions会加载默认配置和对应的FeignClient服务名的配置。 public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {this.registerDefaultConfiguration(metadata, registry);this.registerFeignClients(metadata, registry);}private void registerDefaultConfiguration(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {MapString, 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 ListFeignClientSpecification 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, ClassT 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.sczhlp.com/news/187870/

相关文章:

  • 徐州专业网站制作公司营销型网站案例易网拓
  • 网站搜索怎么做php网站产品标签文章标签怎么做的
  • 大城网站制作旅游网站系统源码
  • 网页制作期末作业网站微网站 html
  • 有没有找项目的网站asp网站开发pdf
  • 德州市建设小学网站设计师网址导航sdc
  • 鹤壁网站制作过年做啥网站致富
  • 有做医学手术视频的网站深圳招聘网站
  • seo 网站两个ip广州天成网络技术有限公司
  • 网站建设的技能有哪些做国际贸易用什么网站
  • 用户登录网站开发台州的网站建设
  • 注册网站域名要多少钱网站 策划
  • 做网站收益阳春市建设局网站
  • 自己做家装设计网站厦门网站到首页排名
  • 怎么在浏览器上面建网站网站建设需求文档模版
  • 网站开发关于安全问题青岛做网站要多少钱
  • 制作ppt的网站媒介代理公司排名
  • 海口免费建站网站开发文本编辑器
  • wordpress建站教程pdf中山服装网站建设
  • 排除通过IP访问MySQL时出现的连接错误问题
  • SciTech-Mathmatics-Proba. Stats.: 统计量: 增长速度、同比 与 环比 的概念、用途、示例、计算公式、注意事项
  • Java二维数组
  • 在Ubuntu系统上设置syslog日志轮替与大小限制
  • 从 “有人值守” 到 “少人运维”:智能巡检机器人重塑配电室管理模式 - 实践
  • 公司网站如何宣传推广设计师常用的设计软件有哪些
  • 景德镇网站建设哪家最好wordpress 蛋彩画主题
  • 顺义网站开发东莞建网站
  • 网站建设实习周记中国建设银行员工网站
  • php建设网站所用开发软件android安卓版下载
  • 个人门户网站模板手机怎么建自己的网站