iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >如何修改FeginCilent定义的服务名到指定服务
  • 511
分享到

如何修改FeginCilent定义的服务名到指定服务

2024-04-02 19:04:59 511人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

修改FeginCilent定义的服务名到指定服务 通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。 package org.springfr

修改FeginCilent定义的服务名到指定服务

通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。


package org.springframework.cloud.openfeign;
import java.io.IOException;
import java.net.MalfORMedURLException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.util.Arrays;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.AnnotatedBeanDefinition;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.BeanDefinition;
import org.springframework.beans.factory.config.BeanDefinitionHolder;
import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionReaderUtils;
import org.springframework.beans.factory.support.BeanDefinitionReGIStry;
import org.springframework.context.EnvironmentAware;
import org.springframework.context.ResourceLoaderAware;
import org.springframework.context.annotation.ClassPathScanninGCandidateComponentProvider;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.annotation.AnnotationAttributes;
import org.springframework.core.env.Environment;
import org.springframework.core.io.ResourceLoader;
import org.springframework.core.type.AnnotationMetadata;
import org.springframework.core.type.ClaSSMetadata;
import org.springframework.core.type.classreading.MetadataReader;
import org.springframework.core.type.classreading.MetadataReaderFactory;
import org.springframework.core.type.filter.AbstractClassTestingTypeFilter;
import org.springframework.core.type.filter.AnnotationTypeFilter;
import org.springframework.core.type.filter.TypeFilter;
import org.springframework.util.Assert;
import org.springframework.util.ClassUtils;
import org.springframework.util.StringUtils;

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar,
        ResourceLoaderAware, EnvironmentAware {
    private static Logger logger = LoggerFactory.getLogger(FeignClientsRegistrar.class);
    // patterned after Spring Integration IntegrationComponentScanRegistrar
    // and RibbonClientsConfigurationRegistgrar
    private ResourceLoader resourceLoader;
    private Environment environment;
    private String applicationName;
    public FeignClientsRegistrar() {
    }
    @Override
    public void setResourceLoader(ResourceLoader resourceLoader) {
        this.resourceLoader = resourceLoader;
    }
    @Override
    public void registerBeanDefinitions(AnnotationMetadata metadata,
                                        BeanDefinitionRegistry registry) {
        applicationName = environment.getProperty("cover.applicationName");
        if(applicationName == null){
            throw new NullPointerException("cover.baseline.applicationName 未配置 请配置后再启动");
        }
        logger.info("cover.baseline.applicationName 已配置 value = {}",applicationName);
        registerDefaultConfiguration(metadata, registry);
        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();
            }
            registerClientConfiguration(registry, name,
                    defaultAttrs.get("defaultConfiguration"));
        }
    }
    public void registerFeignClients(AnnotationMetadata metadata,
                                     BeanDefinitionRegistry registry) {
        ClassPathScanningCandidateComponentProvider scanner = getScanner();
        scanner.setResourceLoader(this.resourceLoader);
        Set<String> basePackages;
        Map<String, Object> attrs = metadata
                .getAnnotationAttributes(EnableFeignClients.class.getName());
        AnnotationTypeFilter annotationTypeFilter = new AnnotationTypeFilter(
                FeignClient.class);
        final Class<?>[] clients = attrs == null ? null
                : (Class<?>[]) attrs.get("clients");
        if (clients == null || clients.length == 0) {
            scanner.addIncludeFilter(annotationTypeFilter);
            basePackages = getBasePackages(metadata);
        } else {
            final Set<String> clientClasses = new HashSet<>();
            basePackages = new HashSet<>();
            for (Class<?> clazz : clients) {
                basePackages.add(ClassUtils.getPackageName(clazz));
                clientClasses.add(clazz.getCanonicalName());
            }
            AbstractClassTestingTypeFilter filter = new AbstractClassTestingTypeFilter() {
                @Override
                protected boolean match(ClassMetadata metadata) {
                    String cleaned = metadata.getClassName().replaceAll("\\$", ".");
                    return clientClasses.contains(cleaned);
                }
            };
            scanner.addIncludeFilter(
                    new AllTypeFilter(Arrays.asList(filter, annotationTypeFilter)));
        }
        for (String basePackage : basePackages) {
            Set<BeanDefinition> candidateComponents = scanner
                    .findCandidateComponents(basePackage);
            for (BeanDefinition candidateComponent : candidateComponents) {
                if (candidateComponent instanceof AnnotatedBeanDefinition) {
                    // verify annotated class is an interface
                    AnnotatedBeanDefinition beanDefinition = (AnnotatedBeanDefinition) candidateComponent;
                    AnnotationMetadata annotationMetadata = beanDefinition.getMetadata();
                    Assert.isTrue(annotationMetadata.isInterface(),
                            "@FeignClient can only be specified on an interface");
                    Map<String, Object> attributes = annotationMetadata
                            .getAnnotationAttributes(
                                    FeignClient.class.getCanonicalName());
                    String name = getClientName(attributes);
                    registerClientConfiguration(registry, name,
                            attributes.get("configuration"));
                    registerFeignClient(registry, annotationMetadata, attributes);
                }
            }
        }
    }
    private void registerFeignClient(BeanDefinitionRegistry registry,
                                     AnnotationMetadata annotationMetadata, Map<String, Object> attributes) {
        String className = annotationMetadata.getClassName();
        BeanDefinitionBuilder 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);
        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 = name + "FeignClient";
        AbstractBeanDefinition beanDefinition = definition.getBeanDefinition();
        boolean primary = (Boolean) attributes.get("primary"); // has a default, won't be null
        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);
    }
    private void validate(Map<String, Object> attributes) {
        AnnotationAttributes annotation = AnnotationAttributes.fromMap(attributes);
        // This blows up if an aliased property is overspecified
        // FIXME annotation.getAliasedString("name", FeignClient.class, null);
        Assert.isTrue(
                !annotation.getClass("fallback").isInterface(),
                "Fallback class must implement the interface annotated by @FeignClient"
        );
        Assert.isTrue(
                !annotation.getClass("fallbackFactory").isInterface(),
                "Fallback factory must produce instances of fallback classes that implement the interface annotated by @FeignClient"
        );
    }
     String getName(Map<String, Object> attributes) {
        
        String name = applicationName;
        String host = null;
        try {
            String url;
            if (!name.startsWith("Http://") && !name.startsWith("https://")) {
                url = "http://" + name;
            } else {
                url = name;
            }
            host = new URI(url).getHost();
        } catch (URISyntaxException e) {
        }
        Assert.state(host != null, "Service id not legal hostname (" + name + ")");
        return name;
    }
    private String resolve(String value) {
        if (StringUtils.hasText(value)) {
            return this.environment.resolvePlaceholders(value);
        }
        return value;
    }
    private String getUrl(Map<String, Object> attributes) {
        String url = resolve((String) attributes.get("url"));
        if (StringUtils.hasText(url) && !(url.startsWith("#{") && url.contains("}"))) {
            if (!url.contains("://")) {
                url = "http://" + url;
            }
            try {
                new URL(url);
            } catch (MalformedURLException e) {
                throw new IllegalArgumentException(url + " is malformed", e);
            }
        }
        return url;
    }
    private String getPath(Map<String, Object> attributes) {
        String path = resolve((String) attributes.get("path"));
        if (StringUtils.hasText(path)) {
            path = path.trim();
            if (!path.startsWith("/")) {
                path = "/" + path;
            }
            if (path.endsWith("/")) {
                path = path.substring(0, path.length() - 1);
            }
        }
        return path;
    }
    protected ClassPathScanningCandidateComponentProvider getScanner() {
        return new ClassPathScanningCandidateComponentProvider(false, this.environment) {
            @Override
            protected boolean isCandidateComponent(AnnotatedBeanDefinition beanDefinition) {
                boolean isCandidate = false;
                if (beanDefinition.getMetadata().isIndependent()) {
                    if (!beanDefinition.getMetadata().isAnnotation()) {
                        isCandidate = true;
                    }
                }
                return isCandidate;
            }
        };
    }
    protected Set<String> getBasePackages(AnnotationMetadata importingClassMetadata) {
        Map<String, Object> attributes = importingClassMetadata
                .getAnnotationAttributes(EnableFeignClients.class.getCanonicalName());
        Set<String> basePackages = new HashSet<>();
        for (String pkg : (String[]) attributes.get("value")) {
            if (StringUtils.hasText(pkg)) {
                basePackages.add(pkg);
            }
        }
        for (String pkg : (String[]) attributes.get("basePackages")) {
            if (StringUtils.hasText(pkg)) {
                basePackages.add(pkg);
            }
        }
        for (Class<?> clazz : (Class[]) attributes.get("basePackageClasses")) {
            basePackages.add(ClassUtils.getPackageName(clazz));
        }
        if (basePackages.isEmpty()) {
            basePackages.add(
                    ClassUtils.getPackageName(importingClassMetadata.getClassName()));
        }
        return basePackages;
    }
    private String getQualifier(Map<String, Object> client) {
        if (client == null) {
            return null;
        }
        String qualifier = (String) client.get("qualifier");
        if (StringUtils.hasText(qualifier)) {
            return qualifier;
        }
        return null;
    }
    private String getClientName(Map<String, Object> client) {
        if (client == null) {
            return null;
        }
        return applicationName;
      
    }
    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());
    }
    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
    
    private static class AllTypeFilter implements TypeFilter {
        private final List<TypeFilter> delegates;
        
        public AllTypeFilter(List<TypeFilter> delegates) {
            Assert.notNull(delegates, "This argument is required, it must not be null");
            this.delegates = delegates;
        }
        @Override
        public boolean match(MetadataReader metadataReader,
                             MetadataReaderFactory metadataReaderFactory) throws IOException {
            for (TypeFilter filter : this.delegates) {
                if (!filter.match(metadataReader, metadataReaderFactory)) {
                    return false;
                }
            }
            return true;
        }
    }
}

FeginCilent动态服务名调用

工作碰到这个问题,解决后记录一下,废话不多说,直接上代码


@Data
@Configuration
@Import(FeignClientsConfiguration.class)
public class Test {
    private TestService testClient;
    
    //Feign 原生构造器
    Feign.Builder builder;
        
    //创建构造器
    public Test(Decoder decoder, Encoder encoder, Client client, Contract contract) {
        this.builder = Feign.builder()
                            .client(client)
                            .encoder(encoder)
                               .decoder(decoder)
                            .contract(contract);
    } 
    
	public void buildFeign(String url) {
        this.testClient = builder.target(TestService.class, url);
    }
}

	@RequestMapping(value = "test",method = RequestMethod.GET)
    @ResponseBody
    public void test(){
    	String url = "http://cyn-admin";
    	service.buildFeign(url);
    	System.out.println(service.getTestClient().dictList());
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: 如何修改FeginCilent定义的服务名到指定服务

本文链接: https://www.lsjlt.com/news/130589.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何修改FeginCilent定义的服务名到指定服务
    修改FeginCilent定义的服务名到指定服务 通过覆盖类来修改对应的服务名,这里将所有的FeginClient对应的服务名都修改好。 package org.springfr...
    99+
    2024-04-02
  • 修改speedtest-cli,可以指定服务器
    speedtest-cli仅可以测试最近的几台服务器,这不符合需求,只好fork,自行修改,加入server-url,自己指定需要测试的服务器地址 北京移动$ speedtest-cli --serv...
    99+
    2023-09-14
    服务器 php 运维
  • 域名如何绑定到云服务器
    要将域名绑定到云服务器,您需要执行以下步骤:1. 在您购买的域名注册商处,登录您的账户并找到域名管理页面。2. 找到域名解析或DNS...
    99+
    2023-09-26
    云服务器
  • 如何把域名绑定到服务器上
    将域名绑定到服务器上需要进行以下步骤:1. 在域名注册商处设置DNS服务器地址为你的服务器IP地址。2. 在服务器上安装Web服务器...
    99+
    2023-06-07
    域名绑定 域名
  • java如何上传文件到指定服务器
    在 Java 中可以使用 Apache HttpClient 或者 HttpURLConnection 来实现文件上传到指定服务器,...
    99+
    2024-04-09
    java 服务器
  • jquery如何修改指定属性的值
    这篇文章主要讲解了“jquery如何修改指定属性的值”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“jquery如何修改指定属性的值”吧! ...
    99+
    2024-04-02
  • 如何修改云服务器绑定手机号
    修改云服务器绑定手机号需要您先获得一个云服务器的账号,然后登录该账号并选择一个可用的云服务器。 步骤如下: 从本地计算机启动云服务器:在您的本地计算机上找到云服务器的控制台。 登录云服务器:在控制台中,输入您的登录信息,例如:admin...
    99+
    2023-10-26
    手机号 绑定 服务器
  • 域名如何绑定服务器
    域名绑定服务器的操作步骤:登录服务器的代理商官网。进入个人中心。找到服务器管理。选择需要绑定的服务器。点击“绑定域名”。添加需要绑定的域名,填写相关信息即可。...
    99+
    2024-04-02
  • 域名dns服务器如何修改
    要修改域名的DNS服务器,您可以按照以下步骤进行操作:1. 登录您注册域名的域名注册商的账户,找到管理域名的控制面板或域名管理界面。...
    99+
    2023-08-20
    dns服务器 服务器
  • 云服务器的定义
    云服务器(Cloud Storage)是一种将数据和应用程序存储在云端的软件服务。云服务器主要由三部分组成:网络连接、存储、计算资源。其中最重要的部分是连接到云服务器的网络连接。在网络连接中,云服务器通常会连接到互联网或其他公共云存储服务提...
    99+
    2023-10-26
    定义 服务器
  • 云服务器如何绑定域名
    云服务器可以通过以下几种方法绑定域名: 使用云服务器的DNS解析:通过DNS服务解析域名是云服务器常用的绑定域名方式。可以使用云服务器提供的DNS解析服务进行绑定域名,如Apache、MySQL等,也可以在域名系统管理界面中设置域名解析...
    99+
    2023-10-26
    绑定 服务器 域名
  • 如何给服务器绑定域名
    在服务器中绑定域名的方法首先,远程登录服务器,进入服务器操作界面;在服务器界面中,点击开始菜单进入IIS管理器;进入到IIS管理器页面后,右键选择属性进入站点属性面板;在站点属性面板>高级>高级网站标识;添加编辑网站标识>将TCP端口设置成...
    99+
    2024-04-02
  • 如何指定访问云服务器
    要指定访问云服务器,您需要知道以下几个要素:1. 云服务器的公网IP地址或域名:公网IP地址是云服务器在互联网上的唯一标识,可以直接...
    99+
    2023-08-14
    云服务器
  • 自定义dns服务器如何设置
    要设置自定义DNS服务器,您需要完成以下步骤:1. 选择一个合适的DNS服务器软件:有许多开源的DNS服务器软件可供选择,如Bind...
    99+
    2023-08-12
    dns服务器 服务器
  • 如何将域名绑定到阿里云服务器账号?
    本文将详细介绍如何将域名绑定到阿里云服务器账号,包括所需的步骤和注意事项。 阿里云服务器是一个优秀的云计算平台,为企业和个人提供了强大的计算能力和存储服务。如果您想要将自己的域名绑定到阿里云服务器账号上,那么这篇文章就是您所需要的。我们将一...
    99+
    2024-01-26
    阿里 绑定 如何将
  • oracle如何修改之前的定时任务
    要修改之前的定时任务,可以按照以下步骤进行操作:1. 登录到Oracle数据库中的SYS用户。2. 使用以下语句查找已创建的定时任务...
    99+
    2023-08-31
    oracle
  • 域名和云服务器如何绑定
    要将域名和云服务器绑定,通常需要按照以下步骤进行操作:1. 在域名注册商处添加DNS解析记录:登录域名注册商提供的管理界面,找到DN...
    99+
    2023-09-13
    云服务器
  • 服务器空间域名如何绑定
    服务器空间域名绑定的方法:1、远程连接服务器,进入服务器操作界面;2、打开iis管理器;3、在管理器左侧菜单栏中点击网站选项;4、选...
    99+
    2023-02-13
    空间域名 服务器 域名
  • 如何绑定云服务器与域名
    要将云服务器与域名绑定,需要按照以下步骤进行操作:1. 登录域名注册商的网站,找到域名管理界面。2. 在域名管理界面中,找到DNS管...
    99+
    2023-08-14
    云服务器
  • mysql服务怎么找不到指定文件
    启动mysql服务时出现找不到指定文件的解决方法首先,使用组合键“win+R”运行“regedit”,进入注册表;进入注册表后,在注册表中,依次查找以下文件中的MySQL文件;HKEY_LOCAL_MACHINE-->SYSTEM-->Cu...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作