spring-cloud / spring-cloud-config

External configuration (server and client) for Spring Cloud
Apache License 2.0
1.95k stars 1.29k forks source link

Enhance client side resolution of plain-text files #789

Open csterwa opened 6 years ago

csterwa commented 6 years ago

Config server supports serving plain-text configuration files (for configuration tailored to specific libraries or environments), including placeholder resolution from config server properties. (See http://cloud.spring.io/spring-cloud-static/Dalston.SR1/#_serving_plain_text)

It seems that the only way to consume these resources (in OSS) is via RestTemplate or some similar REST client means. This can be complicated when there are additional hoops to jump through in order to resolve access to these files such as secured authentication/authorization around config server. This may require a client to muck about with authentication/authorization beans to get at the access token needed to consume those resources.

To make this easier such client situations, it would be useful to provide some means by which the clients can consume those resources, but without having to deal with the authentication/authorization specifics.

One possible (off-the-cuff) idea might be to provide some sort of ConfigServerResource or other type that would handle the OAuth concerns under the covers. Here is potential pseudo just to further elaborate the point but not yet fleshed out:

FileInputStream fis = configServer.getConfig("myapp","myprofile");

Along with auto resolution such as:

@Value("nginx.conf") // not sure this is possible with `.` in name
FileInputStream nginxConfFileStream

Regardless of the solution, ideally, the client-side piece would be part of Spring Cloud OSS generically, with hooks provided for SCS to provide OAuth details to be included in the request.

spencergibb commented 6 years ago

It wouldn't be a FileInputStream ever as it would come from a URL. I think the question we need to solve before any client api, is how would SCS provide the OAuth details?

dsyer commented 6 years ago

Seems like a generic client app concern, rather than anything to do with config server. Maybe we should think about it as a commons feature, or spring cloud security, or even Spring Boot.

ryanjbaxter commented 6 years ago

When I talked to @csterwa about this initially it was a config client feature not a server feature. My interpretation was that he just wanted a client side API that would return an InputStream rather than the developer having to figure out how to do this themselves. It seemed like more of an enhancement rather than a new feature.

dsyer commented 6 years ago

Sure, but my point was that it isn't even really a config client feature. Just a resource type / resolver (which is a core Spring Framework feature, but the security angle makes it higher level concern).

jyinpci commented 6 years ago

Regardless how it will be implemented, I think the ability to have a Spring Boot application to pull in, EASILY, plain text resources from a Spring Cloud configuration server would make Spring Boot more powerful. I have a Spring Boot app that uses different configuration files, camel routes, groovy scripts and velocity templates when being deployed for different customers. Currently, I deploy these custom files along with (but not part of) the Spring Boot fat jar. If it can easily pull in such files from the configuration server, then its deployment and maintenance would be significantly simplified.

cforce commented 6 years ago

Additionaly as cfg server suppoorts "labels" (which represent git rev )if would make sense that i can check "before" download loading the compelte file if the remote revison is newer then the one i arleady have retrieved.

csterwa commented 6 years ago

This has been implemented and pulled through Spring Cloud Services Connectors.

cforce commented 6 years ago

Would you please link the documentation for this pull?

spencergibb commented 6 years ago

@cforce. This was not implemented in the open source project.

cforce commented 6 years ago

https://github.com/pivotal-cf/spring-cloud-services-connector/blob/master/spring-cloud-services-spring-connector/src/main/java/io/pivotal/spring/cloud/service/config/PlainTextConfigClient.java

cforce commented 6 years ago

https://github.com/pivotal-cf/spring-cloud-services-connector/blob/master/spring-cloud-services-spring-connector/src/main/java/io/pivotal/spring/cloud/service/config/PlainTextOAuth2ConfigClient.java

cforce commented 6 years ago

Still can not find the code for feature that allows me to retrieve git revision for checking if my local file is outdated before updating from cfg server

spencergibb commented 6 years ago

@cforce it's not here.

leogtzr commented 6 years ago

Hello! has this been implemented?

spencergibb commented 6 years ago

This was not implemented in the open source project.

See links above

leogtzr commented 6 years ago

Got it ... thanks!

vgvineet4 commented 5 years ago

What's the final resolution with this enhancement. This use case is pretty generic in my view

dsyer commented 5 years ago

It’s already generically provided by the Spring Resource abstraction.

vgvineet4 commented 5 years ago

Ok....So mean to say whenever there is any configuration change in the backend of spring configuration server then config client need to pull the resources changed So in this context a plain text configuration or any xml configuration.

dsyer commented 5 years ago

"Pulling a resource" is normally something that happens in the bean lifecycle. That might happen after a refresh event, for instance. Whether that makes sense in the context of your application is up to you to decide and implement. If you want help with an actual sample app, it might be better to go to Stack Overflow (and link back here if you like).

vgvineet4 commented 5 years ago

In our use case we want to bind the resource from spring cloud config server hosted configurations to bean or instance variable of bean say ,

@Bean public class MyBean {

??how in spring bind plain text or xml config to this instance. private String name; }

In our use case there can be anything like security files, xml

SpiReCZ commented 5 years ago

I created these 2 issues for text / binary resources resolution.

https://github.com/pivotal-cf/spring-cloud-services-connector/issues/129

https://github.com/spring-cloud/spring-cloud-config/issues/1459

I proposed to either implement the feature or give it away to spring project. Surely everyone can copy the code, create a library from it, implement it by it's own.

But the cleanest way is to add it to the spring project directly. It is a small compact feature so it should not be a problem.

spencergibb commented 5 years ago

@csterwa maybe we could port the non-oauth version here. See comments in #1459

SpiReCZ commented 4 years ago

It has been a month. Can someone eligible please respond?

spencergibb commented 4 years ago

@SpiReCZ this enhancement has not been scheduled for addition at this time. When it has, it will be added to a Project and Milestone.

mrodal commented 2 months ago

Any plans on adding this feature?

ryanjbaxter commented 2 months ago

Not at the moment, but if you are interested in submitting a PR for it that would be welcome!