如何实现 spring 假装 post 并删除
how to implement spring feign post and delete
我构建了一个spring云服务,包含eureka,user-service(spring-data-rest user api)和feign-client service。
在假客户端中:
@FeignClient("useraccount")
public interface UserFeign {
@RequestMapping(method=RequestMethod.POST,value="/users",consumes = "application/json")
void createUser(@RequestBody User user);
@RequestMapping(method=RequestMethod.DELETE,value="/users/{id}")
void delById (@PathVariable("id") String id);
我想通过调用 user-service api 来实现在 feign-client 中删除和存储用户。所以,我创建了一个休息控制器(js 将数据传输给它们):
@Autowired
private UserFeign userFeign;
//save controller
@RequestMapping(method = RequestMethod.POST, value = "/property/register")
public ResponseEntity<?> createUser(@RequestBody User user) {
userSaveFeign.createUser(user);
return ResponseEntity.ok();
}
// and delete controller
@RequestMapping(method = RequestMethod.DELETE, value = "/property/{id}")
public String hello(@PathVariable("id") String id){
userSaveFeign.delById(id);
}
return "hello";
}
但总是遇到错误:
2016-04-16 20:05:41.162 .DynamicServerListLoadBalancer DynamicServerListLoadBalancer for client useraccount initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=useraccount,current list of Servers=[192.168.1.101:useraccount:d3fb971b6fe30dc5e9cbfdf0e713cd12],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.1.101:useraccount:d3fb971b6fe30dc5e9cbfdf0e713cd12; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@19c54b19
2016-04-16 20:05:41.836[2m[nio-8002-exec-4][36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: createUser timed-out and no fallback available.] with root cause
java.util.concurrent.TimeoutException: null
at com.netflix.hystrix.AbstractCommand.call(AbstractCommand.java:600) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.AbstractCommand.call(AbstractCommand.java:580) ~[hystrix-core-1.5.1.jar:1.5.1]
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction.onError(OperatorOnErrorResumeNextViaFunction.java:99) ~[rxjava-1.0.14.jar:1.0.14]
at rx.internal.operators.OperatorDoOnEach.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14]
at rx.internal.operators.OperatorDoOnEach.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator.run(AbstractCommand.java:955) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.call(HystrixContextRunnable.java:37) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator.tick(AbstractCommand.java:972) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.util.HystrixTimer.run(HystrixTimer.java:99) ~[hystrix-core-1.5.1.jar:1.5.1]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_40]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_40]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_40]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]
可能上面的存储和删除方法有问题,谁能告诉我是对还是更好?
您的 Hystrix 命令似乎超时了。假设您没有专门的任何 Hystrix 命令(如您的 post 中未提及),Hystrix 是一种断路器技术,Feign Client 免费提供。您可以通过以下方式禁用此功能:
feign.hystrix.enabled=false
(您可以在 http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html#spring-cloud-feign-hystrix 找到更多关于 Feign-Hystrix 集成的信息)
这不会解决路由问题需要很长时间才能完成的问题。您将需要调试并找出挂起的内容。这可能是您的 Feign 客户端指向的实际端点正在连接但没有响应,尽管我通常希望在这种情况下看到特定的连接超时异常。
这不是真正的异常,你应该找到它超时的原因。启用日志记录,然后您可以看到失败的原因:
import org.springframework.context.annotation.Bean;
import feign.Logger;
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
还要查看服务器是否已解析。您的日志应包含如下内容:
DynamicServerListLoadBalancer for client auth-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=auth-service,current list of Servers=[192.168.2.243:7277],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.2.243:8180; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 06:00:00 BDT 1970; First connection made: Thu Jan 01 06:00:00 BDT 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@9481a7c
我构建了一个spring云服务,包含eureka,user-service(spring-data-rest user api)和feign-client service。
在假客户端中:
@FeignClient("useraccount")
public interface UserFeign {
@RequestMapping(method=RequestMethod.POST,value="/users",consumes = "application/json")
void createUser(@RequestBody User user);
@RequestMapping(method=RequestMethod.DELETE,value="/users/{id}")
void delById (@PathVariable("id") String id);
我想通过调用 user-service api 来实现在 feign-client 中删除和存储用户。所以,我创建了一个休息控制器(js 将数据传输给它们):
@Autowired
private UserFeign userFeign;
//save controller
@RequestMapping(method = RequestMethod.POST, value = "/property/register")
public ResponseEntity<?> createUser(@RequestBody User user) {
userSaveFeign.createUser(user);
return ResponseEntity.ok();
}
// and delete controller
@RequestMapping(method = RequestMethod.DELETE, value = "/property/{id}")
public String hello(@PathVariable("id") String id){
userSaveFeign.delById(id);
}
return "hello";
}
但总是遇到错误:
2016-04-16 20:05:41.162 .DynamicServerListLoadBalancer DynamicServerListLoadBalancer for client useraccount initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=useraccount,current list of Servers=[192.168.1.101:useraccount:d3fb971b6fe30dc5e9cbfdf0e713cd12],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.1.101:useraccount:d3fb971b6fe30dc5e9cbfdf0e713cd12; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 08:00:00 CST 1970; First connection made: Thu Jan 01 08:00:00 CST 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@19c54b19
2016-04-16 20:05:41.836[2m[nio-8002-exec-4][36mo.a.c.c.C.[.[.[/].[dispatcherServlet] [0;39m Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is com.netflix.hystrix.exception.HystrixRuntimeException: createUser timed-out and no fallback available.] with root cause
java.util.concurrent.TimeoutException: null
at com.netflix.hystrix.AbstractCommand.call(AbstractCommand.java:600) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.AbstractCommand.call(AbstractCommand.java:580) ~[hystrix-core-1.5.1.jar:1.5.1]
at rx.internal.operators.OperatorOnErrorResumeNextViaFunction.onError(OperatorOnErrorResumeNextViaFunction.java:99) ~[rxjava-1.0.14.jar:1.0.14]
at rx.internal.operators.OperatorDoOnEach.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14]
at rx.internal.operators.OperatorDoOnEach.onError(OperatorDoOnEach.java:70) ~[rxjava-1.0.14.jar:1.0.14]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator.run(AbstractCommand.java:955) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.call(HystrixContextRunnable.java:41) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.call(HystrixContextRunnable.java:37) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.strategy.concurrency.HystrixContextRunnable.run(HystrixContextRunnable.java:57) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.AbstractCommand$HystrixObservableTimeoutOperator.tick(AbstractCommand.java:972) ~[hystrix-core-1.5.1.jar:1.5.1]
at com.netflix.hystrix.util.HystrixTimer.run(HystrixTimer.java:99) ~[hystrix-core-1.5.1.jar:1.5.1]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_40]
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308) ~[na:1.8.0_40]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access1(ScheduledThreadPoolExecutor.java:180) ~[na:1.8.0_40]
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294) ~[na:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~[na:1.8.0_40]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[na:1.8.0_40]
at java.lang.Thread.run(Thread.java:745) [na:1.8.0_40]
可能上面的存储和删除方法有问题,谁能告诉我是对还是更好?
您的 Hystrix 命令似乎超时了。假设您没有专门的任何 Hystrix 命令(如您的 post 中未提及),Hystrix 是一种断路器技术,Feign Client 免费提供。您可以通过以下方式禁用此功能:
feign.hystrix.enabled=false
(您可以在 http://cloud.spring.io/spring-cloud-netflix/spring-cloud-netflix.html#spring-cloud-feign-hystrix 找到更多关于 Feign-Hystrix 集成的信息)
这不会解决路由问题需要很长时间才能完成的问题。您将需要调试并找出挂起的内容。这可能是您的 Feign 客户端指向的实际端点正在连接但没有响应,尽管我通常希望在这种情况下看到特定的连接超时异常。
这不是真正的异常,你应该找到它超时的原因。启用日志记录,然后您可以看到失败的原因:
import org.springframework.context.annotation.Bean;
import feign.Logger;
public class FeignConfiguration {
@Bean
Logger.Level feignLoggerLevel() {
return Logger.Level.FULL;
}
}
还要查看服务器是否已解析。您的日志应包含如下内容:
DynamicServerListLoadBalancer for client auth-service initialized: DynamicServerListLoadBalancer:{NFLoadBalancer:name=auth-service,current list of Servers=[192.168.2.243:7277],Load balancer stats=Zone stats: {defaultzone=[Zone:defaultzone; Instance count:1; Active connections count: 0; Circuit breaker tripped count: 0; Active connections per server: 0.0;]
},Server stats: [[Server:192.168.2.243:8180; Zone:defaultZone; Total Requests:0; Successive connection failure:0; Total blackout seconds:0; Last connection made:Thu Jan 01 06:00:00 BDT 1970; First connection made: Thu Jan 01 06:00:00 BDT 1970; Active Connections:0; total failure count in last (1000) msecs:0; average resp time:0.0; 90 percentile resp time:0.0; 95 percentile resp time:0.0; min resp time:0.0; max resp time:0.0; stddev resp time:0.0]
]}ServerList:org.springframework.cloud.netflix.ribbon.eureka.DomainExtractingServerList@9481a7c