当前位置: 首页 > 知识库问答 >
问题:

假注册-Spring云图-无带状覆盖的改变目标

刘才俊
2023-03-14

我希望能够有两个不同的spring概要文件,并根据概要文件改变为我们的假建设者的硬编码地址。

目前有以下几个:

返回builder.target(cls,“http://our-server:8009/”+serviceName);

有时我们不想在开发环境中运行所有的服务。此外,有些服务有时只能通过zuul网关提供。

所以我们在不同的情况和条件下运行相同的代码

@FeignClient(name = "ab-document-store",  configuration = MultiPartSupportConfiguration.class, fallback = DocumentStoreFallback.class)

我们使用以下命令调用feignRegistrar类:

return registerFeignClient(DocumentStoreClient.class, true);



@RequiredArgsConstructor
//@Component
@Slf4j
public class FeignRegistrar {

    @Autowired
    private Decoder decoder;

    @Autowired
    private Encoder encoder;

    @Autowired
    private Client client;

    @Autowired
    private Contract feignContract;

    @Autowired
    private ObjectFactory<HttpMessageConverters> messageConverters;

    @Autowired
    private List<RequestInterceptor> interceptors;

    public <T> T register(Class<T> cls, String serviceName, boolean isDocumentStore) {

        if(isDocumentStore){
            encoder = new MultipartFormEncoder(new SpringEncoder(messageConverters));
        }

        //Client trustSSLSockets = new Client.Default(getSSLSocketFactory(), new NoopHostnameVerifier());

        Feign.Builder builder = Feign.builder()
            .client(client)
            .encoder(encoder)
            .decoder(decoder)
            .contract(feignContract)
            .logger(new Slf4Logger())
            .logLevel(Logger.Level.HEADERS);

        builder.requestInterceptor(new RequestInterceptor() {

            @Override
            public void apply(RequestTemplate template) {
                template.header("X-Service-Name", serviceName);
            }
        });

        for(RequestInterceptor interceptor : interceptors) { 

            builder.requestInterceptor(interceptor);
        }

        log.debug("Registering {} - as feign proxy ", serviceName);

        return builder.target(cls, "http://" + serviceName);
    }

    public static class Slf4Logger extends Logger {

        @Override
        protected void log(String configKey, String format, Object... args) {
            log.info("{} - {}", configKey, args);
        }
    }
}

我们还使用了属性文件,如application-env.property,其条目如下:

ab-document-store.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
ab-document-store.ribbon.listOfServers: localhost:8025

不幸的是,listofservers对我们来说还不够。我们希望能够分配一个目录/路径以及。类似于:

ab-document-store.ribbon.listofservers:localhost:8025/ab-document-store

我考虑过使用假拦截器在所有请求中潜入一个报头,比如x-service-name。然后我们可以将所有服务指向一个地址(例如localhost:9001),并将这些请求转发/代理到localhost:9001/x-service-name。

但是,我更喜欢一个简单得多的解决方案,例如:

ab-document-store.ribbon.listOfServers: localhost:8025/ab-document-store

共有1个答案

卢文博
2023-03-14

我找到了一个解决方案,使用了一个检测头的代理。因此,我在Java端有一个feign拦截器,它将标头x-service-name附加到每个feign-request。

我还有一个NodeJS代理,它分析请求,查找x-service-name,并将请求重写为:x-service-name/OriginalRequestPath

这让我可以在zuul网关后面拥有所有的微服务,但也可以使用尤里卡覆盖工具访问它们。

 Feign.Builder builder = Feign.builder()
            .client(client)
            .encoder(usedEncoder)
            .decoder(decoder)
            .contract(feignContract)
            .logger(new Slf4Logger())
            .logLevel(Logger.Level.HEADERS);

        builder.requestInterceptor(new RequestInterceptor() {

            @Override
            public void apply(RequestTemplate template) {
                template.header("X-Service-Name", serviceName);
            }
        });

在本例中,我的zuul网关(或另一个代理)位于localhost:9001上。我正在收听localhost:1200

let enableProxyForJava = process.env.ENABLE_PROXY_FOR_JAVA;
if (enableProxyForJava != undefined &&  enableProxyForJava.toLowerCase() === 'true') {
    var httpProxyJava = require('http-proxy');
    var proxyJava = httpProxyJava.createProxy();

    gutil.log(  gutil.colors.green('Enabling Proxy for Java. Set your Eureka overrides to localhost:1200.') );

    require('http').createServer(function(req, res) {
        console.log("req.headers['x-service-name'] = " + req.headers['x-service-name']);
        console.log("Before req.url:"+ req.url);

        if( req.headers['x-service-name'] != undefined){
            let change =  req.headers['x-service-name'] +req.url;
            console.log("After req.url:"+ change);
            req.url = change;
        }

        proxyJava.web(req, res, {
            target: 'http://localhost:9001/'
        });

    }).listen(1200);
}
mbak-microservice1.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-microservice1.ribbon.listOfServers: localhost:1200

mbak-microservice2.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-microservice2.ribbon.listOfServers: localhost:1200

mbak-document-store.ribbon.NIWSServerListClassName:com.netflix.loadbalancer.ConfigurationBasedServerList
mbak-document-store.ribbon.listOfServers: localhost:1200
 类似资料:
  • 我试图通过遵循这个问题中的建议来覆盖Laravel 5中的注册函数。然而,在我的例子中,我并没有试图从注册页面重定向用户。相反,我只想注册新用户,但保持当前(管理员)用户登录。默认函数验证并登录新用户,然后重定向到“主页”。下面是我尝试添加到AuthController的内容。php: 我认为我很聪明,只是创建了新帐户,然后将当前用户重定向到管理页面。但是,没有创建任何用户,也没有发生重定向。任何

  • 我有一个图像,我想覆盖在地图上的特定位置,看起来像当前静态地图图像服务没有提供任何参数传递。

  • 问题内容: 我正在使用内置的django登录和注销。在我的Project / urls.py中,我添加了用于登录和注销的URL。 我的帐户应用程序文件夹中有模板文件夹。我有这样的目录结构 我已经阅读了django文档,其中说对于login()默认模板是registration / login.html,这在我的项目中工作正常,而logout()默认模板是registration / logged_

  • 我使用新的GCM API来注册。方法的留档明确指出: 为GCM注册应用程序并返回注册ID。安装应用程序后,必须调用此函数一次,然后将返回的注册ID发送到服务器。 重复调用此方法将返回原始注册ID。 然而,在阅读本文时(http://developer.android.com/google/gcm/adv.html#reg-州),它指出有两种情况需要特殊处理: 另外还有两种情况需要特别注意: 应用程

  • 我的意图是在spring boot应用程序中有两个概要文件—开发和生产概要文件。开发概要文件只是为了覆盖生产概要文件的一些变量(比如内存中的数据库,而不是云中的数据库)。由于我预计将来会对生产概要进行一些更改,所以在开发概要中复制变量似乎不是一个解决方案。 因此,在Spring参考中,我读到应该只从引用的配置文件中添加属性。 有时,将特定于概要文件的属性添加到活动概要文件中而不是替换它们是很有用的

  • 在Jenkins服务器中,定义了两个全局环境变量。在管理Jenkins中- 名称:MAVEN_HOME Value:/var/HOME/tools/hudson。任务。Maven_Maven安装/maven3.5.2 名称:PATH EXTRA$PATH:/usr/local/bin:$MAVEN\u HOME/bin 我看到PATH EXTRA会将MAVEN PATH添加到PATH环境变量中。这