feign.FeignException: status 401 reading XXXXXX

今天在調試微服務程序通過Feign調用外部服務時出現一個異常:


feign.FeignException: status 401 reading xxxxxx
 at feign.FeignException.errorStatus(FeignException.java:60)
 at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:89)
 at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:143)
 at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:77)
 at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:107)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
 at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
 at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
 at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
 at java.util.concurrent.FutureTask.run(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at java.lang.Thread.run(Unknown Source)

經過搜索相關信息後,發現一篇文章中講到這個問題:
Spring Cloud項目中通過Feign進行內部服務調用發生401\407錯誤無返回信息的問題,文章中給出瞭解決問題的方法:
添加如下依賴:

<dependency>
    <groupId>com.netflix.feign</groupId>
    <artifactId>feign-okhttp</artifactId>
    <version>8.18.0</version>
</dependency>

<dependency>
    <groupId>com.netflix.feign</groupId>
    <artifactId>feign-httpclient</artifactId>
    <version>8.18.0</version>
</dependency>

在application.properties配置文件中增加

feign.okhttp.enabled=true

或者

feign.httpclient.enabled=true

按照上述的方法,增加配置後,這個問題解決了。
但在運行之後又產生了另外一個異常:

feign.FeignException: status 401 reading xxxxxx; content:
{"message":"未認證,請在前端系統進行認證"}
 at feign.FeignException.errorStatus(FeignException.java:60)
 at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:89)
 at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:143)
 at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:77)
 at feign.hystrix.HystrixInvocationHandler$1.run(HystrixInvocationHandler.java:107)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:302)
 at com.netflix.hystrix.HystrixCommand$2.call(HystrixCommand.java:298)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:46)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:51)
 at rx.internal.operators.OnSubscribeDefer.call(OnSubscribeDefer.java:35)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:41)
 at rx.internal.operators.OnSubscribeDoOnEach.call(OnSubscribeDoOnEach.java:30)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:48)
 at rx.internal.operators.OnSubscribeLift.call(OnSubscribeLift.java:30)
 at rx.Observable.unsafeSubscribe(Observable.java:10327)
 at rx.internal.operators.OperatorSubscribeOn$SubscribeOnSubscriber.call(OperatorSubscribeOn.java:100)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:56)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction$1.call(HystrixContexSchedulerAction.java:47)
 at com.netflix.hystrix.strategy.concurrency.HystrixContexSchedulerAction.call(HystrixContexSchedulerAction.java:69)
 at rx.internal.schedulers.ScheduledAction.run(ScheduledAction.java:55)
 at java.util.concurrent.Executors$RunnableAdapter.call(Unknown Source)
 at java.util.concurrent.FutureTask.run(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
 at java.lang.Thread.run(Unknown Source)

我並不知道對端的微服務添加了安全認證的相關配置,導致我沒有調用成功,這個得問對端服務安全配置才能解決問題。這裏先記錄一下遇到的問題。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章