springcloud ribbon rule 自定义

上图为springcloud 自定义rule提供的例子

RibbonClientDefaultConfigurationTestsConfig这个类是自定义入口,
可以自定义的内容可以参考 DefaultRibbonConfig

重点在于@RibbonClients注解上。

/*
 * Copyright 2013-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.cloud.netflix.ribbon;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;

/**
 * Convenience annotation that allows user to combine multiple <code>@RibbonClient</code>
 * annotations on a single class (including in Java 7).
 *
 * @author Dave Syer
 */
@Configuration
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.TYPE })
@Documented
@Import(RibbonClientConfigurationRegistrar.class)
public @interface RibbonClients {

   RibbonClient[] value() default {};

   Class<?>[] defaultConfiguration() default {};

}

改注解可以设置value(可以定义某些服务需要灰度) 和 defaultConfiguration(你自己定义的灰度规则)

/*
 * Copyright 2013-2014 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package org.springframework.cloud.netflix.ribbon;

import java.util.Map;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.util.StringUtils;

/**
 * @author Dave Syer
 */
public class RibbonClientConfigurationRegistrar implements ImportBeanDefinitionRegistrar {

   @Override
   public void registerBeanDefinitions(AnnotationMetadata metadata,
         BeanDefinitionRegistry registry) {
      Map<String, Object> attrs = metadata.getAnnotationAttributes(
            RibbonClients.class.getName(), true);
      if (attrs != null && attrs.containsKey("value")) {
         AnnotationAttributes[] clients = (AnnotationAttributes[]) attrs.get("value");
         for (AnnotationAttributes client : clients) {
            registerClientConfiguration(registry, getClientName(client),
                  client.get("configuration"));
         }
      }
      if (attrs != null && attrs.containsKey("defaultConfiguration")) {
         String name;
         if (metadata.hasEnclosingClass()) {
            name = "default." + metadata.getEnclosingClassName();
         } else {
            name = "default." + metadata.getClassName();
         }
         registerClientConfiguration(registry, name,
               attrs.get("defaultConfiguration"));
      }
      Map<String, Object> client = metadata.getAnnotationAttributes(
            RibbonClient.class.getName(), true);
      String name = getClientName(client);
      if (name != null) {
         registerClientConfiguration(registry, name, client.get("configuration"));
      }
   }

   private String getClientName(Map<String, Object> client) {
      if (client == null) {
         return null;
      }
      String value = (String) client.get("value");
      if (!StringUtils.hasText(value)) {
         value = (String) client.get("name");
      }
      if (StringUtils.hasText(value)) {
         return value;
      }
      throw new IllegalStateException(
            "Either 'name' or 'value' must be provided in @RibbonClient");
   }

   private void registerClientConfiguration(BeanDefinitionRegistry registry,
         Object name, Object configuration) {
      BeanDefinitionBuilder builder = BeanDefinitionBuilder
            .genericBeanDefinition(RibbonClientSpecification.class);
      builder.addConstructorArgValue(name);
      builder.addConstructorArgValue(configuration);
      registry.registerBeanDefinition(name + ".RibbonClientSpecification",
            builder.getBeanDefinition());
   }

}

 如果有问题,可以随时交流。

猜你喜欢

转载自blog.csdn.net/just3019/article/details/81779947
今日推荐