Closed beku8 closed 9 years ago
It looks like your demo.FooController.relay()
method uses a RestTemplate
and it's trying to use that to contact a downstream service via Ribbon. If that's what you want to happen then you just have to wait for the Eureka caches to equalize before you use it (here's a similar issue in spring-cloud-netflix: https://github.com/spring-cloud/spring-cloud-config/issues/93). If that's not what you wanted to happen, then you need to switch off ribbon for the RestTemplate
that you are injecting (we might need to look into making that easier).
I'm actually autowiring OAuth2RestOperations
class, if thats what you mean.
@SpringBootApplication
//@EnableDiscoveryClient
@EnableOAuth2Resource
public class DemoClient2Application {
public static void main(String[] args) {
SpringApplication.run(DemoClient2Application.class, args);
}
}
and FooController:
@RestController
public class FooController {
@Autowired
private OAuth2RestOperations userInfoRestTemplate;
@RequestMapping("/relay")
public String relay() {
ResponseEntity<String> response =
userInfoRestTemplate.getForEntity("http://localhost:8081/hello", String.class);
return "Success! (" + response.getBody() + ")";
}
I waited for long enough after each resources servers cache to equalize but still throwing the exception. Is it an expected behavior? Also my actuator endpoints are protected by oauth2, does it have any effect?
You are using your userInfoRestTemplate
to contact a server on localhost, so that indicates to me (but not yet to Spring Cloud) that you don't want to use Ribbon. This isn't even a Token Relay, it's just using the same RestTemplate
as is used to authenticate? Why do you have Ribbon on the classpath if you don't want to use it?
I had eureka server, config server, 2 micoservices in my demo "architecture". Then I wanted to add oauth2 to it. I basically took the authserver
& sso
(but turning this into a resource server) samples. Probably I'm misusing the framework and the term "token relay". Basically I have a token from the auth server & try to use that token to call client 2
(from the broswser http://localhost:8081/relay?access_token=eyJhbGciO...
) which in turn makes a call to client 1
, supposedly "relaying" the original token with it.
My original code was like this:
String url = discoveryClient.getNextServerFromEureka("CLIENT_1", false).getHomePageUrl();
ResponseEntity<String> response =
userInfoRestTemplate.getForEntity(url + "hello", String.class);
So I have Ribbon on my classpath transitively via "spring-cloud-starter-eureka". I have not studied the ribbon related documentation section yet, so forgive me if I'm troubling you with something obvious & I hope my mumbling somehow makes sense.
OK, you're not using Ribbon, but it is being pulled in transitively. I think I might fix the eureka starter so it doesn't do that, but in the mean time can you try excluding eureka-ribbon and spring-cloud-starter-ribbon?
Alternatively you could use Ribbon:
ResponseEntity<String> response =
userInfoRestTemplate.getForEntity("http://CLIENT_1/hello", String.class);
Ok got it, thanks Dave
The current working title of this issue is 'Ribbon should not be included in "spring-cloud-starter-eureka" '. I think we have decided that is not the case (it should be included), but if anyone else has opinions, please shout now.
The exception I was getting actually turns out because it had an underscore in the name(client_1). I opened an issue https://github.com/spring-cloud/spring-cloud-netflix/issues/263.
For 1.0.1 we have decided to disable the ribbon enhancements for OAuth2. Will revisit later (see #51).
What is the easiest way to disable default ribbon enhancement for restTemplate ? I tried exclude jars: ribbon, ribbon-eureka, ribbon-core,ribbon-loadbalancer but I didn't succeed. I'm not using it explicit, I got it by transient dependencies from eureka client, using spring cloud 1.0.1. Here is the exception:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'ribbonRestClient' defined in org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration: Bean instantiation via factory method failed; nested exception is org.springframework.beans.BeanInstantiationException: Failed to instantiate [com.netflix.niws.client.http.RestClient]: Factory method 'ribbonRestClient' threw exception; nested exception is java.lang.NoSuchFieldError: ReceiveBuffferSize] with root cause
java.lang.NoSuchFieldError: ReceiveBuffferSize
at com.netflix.niws.client.http.RestClient.apacheHttpClientSpecificInitialization(RestClient.java:283)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$OverrideRestClient.apacheHttpClientSpecificInitialization(RibbonClientConfiguration.java:135)
at com.netflix.niws.client.http.RestClient.initWithNiwsConfig(RestClient.java:163)
at com.netflix.loadbalancer.LoadBalancerContext.<init>(LoadBalancerContext.java:74)
at com.netflix.client.AbstractLoadBalancerAwareClient.<init>(AbstractLoadBalancerAwareClient.java:50)
at com.netflix.niws.client.http.RestClient.<init>(RestClient.java:134)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$OverrideRestClient.<init>(RibbonClientConfiguration.java:129)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$OverrideRestClient.<init>(RibbonClientConfiguration.java:126)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration.ribbonRestClient(RibbonClientConfiguration.java:93)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$$EnhancerBySpringCGLIB$$6a2e8369.CGLIB$ribbonRestClient$0(<generated>)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$$EnhancerBySpringCGLIB$$6a2e8369$$FastClassBySpringCGLIB$$5b6a533c.invoke(<generated>)
at org.springframework.cglib.proxy.MethodProxy.invokeSuper(MethodProxy.java:228)
at org.springframework.context.annotation.ConfigurationClassEnhancer$BeanMethodInterceptor.intercept(ConfigurationClassEnhancer.java:309)
at org.springframework.cloud.netflix.ribbon.RibbonClientConfiguration$$EnhancerBySpringCGLIB$$6a2e8369.ribbonRestClient(<generated>)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:162)
at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.instantiateUsingFactoryMethod(AbstractAutowireCapableBeanFactory.java:1119)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBeanInstance(AbstractAutowireCapableBeanFactory.java:1014)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:504)
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:476)
at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:303)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:299)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:194)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:755)
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:757)
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:480)
at org.springframework.cloud.netflix.ribbon.SpringClientFactory.createContext(SpringClientFactory.java:148)
at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getContext(SpringClientFactory.java:113)
at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getInstance(SpringClientFactory.java:181)
at org.springframework.cloud.netflix.ribbon.SpringClientFactory.getLoadBalancer(SpringClientFactory.java:90)
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.getLoadBalancer(RibbonLoadBalancerClient.java:108)
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.getServer(RibbonLoadBalancerClient.java:97)
at org.springframework.cloud.netflix.ribbon.RibbonLoadBalancerClient.choose(RibbonLoadBalancerClient.java:58)
at org.springframework.cloud.netflix.ribbon.RibbonClientHttpRequestFactory.createRequest(RibbonClientHttpRequestFactory.java:62)
at org.springframework.http.client.support.HttpAccessor.createRequest(HttpAccessor.java:76)
at org.springframework.web.client.RestTemplate.doExecute(RestTemplate.java:565)
at org.springframework.web.client.RestTemplate.execute(RestTemplate.java:530)
at org.springframework.web.client.RestTemplate.getForObject(RestTemplate.java:237)
at com.smartstream.fcms.ui.gateway.service.BalanceTypeService.getBalanceTypes(BalanceTypeService.java:33)
at com.smartstream.rest.cash.balanceTypes.BalanceTypeController.getBalanceTypes(BalanceTypeController.java:30)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at com.smartstream.fcms.ui.gateway.filter.CORSFilter.doFilter(CORSFilter.java:28)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
Your question is not about security, and this issue is closed. Could you rephrase it and put something in spring-cloud-netflix maybe?
Sure, thanks for fast reply
I have a basic resource server with
@EnableOAuth2Resource
annotation and following configuration:just a demo app, nothing fancy. I previously configured it to be a eureka client and It was throwing
NullPointerException
when calling another oauth2 protected resource server withOAuth2RestOperations
. But when I removed the all the configs & most importantlyspring-cloud-starter-eureka
from the classpath, its working fine. Here's the exception.