2017-04-20 778 views
1

我在服务间通信负载平衡方面存在问题。Feign客户端执行失败:java.lang.reflect.InvocationTargetException

我正在使用netflixOSS的spring(1.4.2),spring cloud。

我有两项服务shoppingcart-service和user-service。

这里是ShoppingCartController从shopppingcart服务应用:

@RestController 
@RequestMapping("shoppingCarts") 
public class ShoppingCartController extends AbstractRESTController<ShoppingCart, String>{ 

private ShoppingCartService shoppingCartSrevice; 

@Autowired 
public ShoppingCartController(ShoppingCartService service) { 
    super(service); 
    this.shoppingCartSrevice = service; 
} 

@RequestMapping(value = "{userId}/createShoppingCart", method = RequestMethod.POST) 
ShoppingCart createShoppingCart(
     @RequestBody List<CartItem> items, 
     @PathVariable(name = "userId") String userId 
     ){ 

    Boolean userOK = shoppingCartSrevice.checkUser(userId); 

    if(userOK != null) 
     if(userOK) 
      return shoppingCartSrevice.createShoppingCart(items, userId); 

    return null; 
} 

@FeignClient("user-service")//the server.port property name, for the "server" service 
public interface UserServiceClient { 
    @RequestMapping(value = "users/checkUser", method = RequestMethod.POST)// the endpoint which will be balanced over 
    Boolean checkUser(
      @RequestParam(name = "userId") String userId);// the method specification must be the same as for users/hello 
} 

}

“checkUser”

methosd是ShoppingCartService类:

@Service 
public class ShoppingCartService extends AbstractCRUDService<ShoppingCart, String>{ 

private ShoppingCartRepository shoppingCartRepository; 
private RestTemplate restTemplate; 

@Autowired 
private UserServiceClient userServiceClient;// feign client 

@Autowired 
public ShoppingCartService(ShoppingCartRepository repo, RestTemplate restTemplate) { 
    super(repo); 
    this.shoppingCartRepository = repo; 
    this.restTemplate = restTemplate; 

} 

/** 
* Method checks if the given user is registered and active 
* We use Ribbon and Feign to get data from user-service, load-balancing 
* @param userId 
* @return 
*/ 
@HystrixCommand(fallbackMethod="fallbackCheckUser") 
public Boolean checkUser(String userId) { 

    /*USING LOAD-BALANCING*/ 
    Boolean resp = userServiceClient.checkUser(userId);//HERE I GET THE EXCEPTION 
    return resp; 
} 

public Boolean fallbackCheckUser(String userId){ 
    return true; 
} 

当我尝试执行checkUser(userId)@HystricsCommand方法时,得到:java.lang.reflect.InvocationTargetException。

请帮助。

更新1:

购物车服务的pom.xml:

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 

    <groupId>rs.uns.acs.ftn</groupId> 
    <artifactId>ShoppingCartService</artifactId> 
    <version>0.0.1-SNAPSHOT</version> 
    <packaging>jar</packaging> 

    <name>ShoppingCartService</name> 
    <description>Shopping Cart Service</description> 

    <parent> 
     <groupId>org.springframework.boot</groupId> 
     <artifactId>spring-boot-starter-parent</artifactId> 
     <version>1.4.2.RELEASE</version> 
     <relativePath/> <!-- lookup parent from repository --> 
    </parent> 

    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 
     <java.version>1.8</java.version> 
    </properties> 

    <dependencies> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-feign</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-hystrix</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-ribbon</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-actuator</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.cloud</groupId> 
      <artifactId>spring-cloud-starter-eureka</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-data-mongodb</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-web</artifactId> 
     </dependency> 
     <dependency> 
      <groupId>org.jglue.fluent-json</groupId> 
      <artifactId>fluent-json</artifactId> 
      <version>2.0.3</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-test</artifactId> 
      <scope>test</scope> 
     </dependency> 
    </dependencies> 

    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework.cloud</groupId> 
       <artifactId>spring-cloud-dependencies</artifactId> 
       <version>Camden.SR2</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <build> 
     <plugins> 
      <plugin> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-maven-plugin</artifactId> 
      </plugin> 
     </plugins> 
    </build> 


</project> 
+0

请添加更多的例外。那条单线是无用的。 – spencergibb

+0

在异常对象上的堆栈跟踪是空的,我也没有在控制台上得到任何输出。我还与Eureka和Zuul一起运行了3项服务。我将把pom.xml放到shoppingcart-service中,请参阅更新。 –

+0

我不知道如何提供帮助,除非你能提供样品。 Camden.SR6是卡姆登发行版中的最新版本。 – spencergibb

回答

0

Spring CloudFeignRibbon抛开这些 “REST” 端点似乎并没有遵循推荐的做法。

POST检查用户是否存在看起来不正确,POST通常用于创建资源,如用户或产品。

POST to /..../{userId}/createShoppingCart看起来不正确。在REST中推荐名词:API设计,/ users,/ products,/ users/{id}和HTTP动词(POST,PUT,PATCH,DELETE,GET,....)表示对这些“名词”的操作:POST/users意味着创建一个用户,PUT/products/{id}意味着更新id为{id}的产品。通常不建议将动词作为URL的一部分。

而@spencergibb提到,没有配置文件(application.yml或properties),源代码和有意义的堆栈跟踪,将会很难解决这个问题。

一个可能的问题可能是您的pom文件缺少<properties>中的<start-class>元素。

+0

HTTP API规范不同于用例与用例。但是这与我现在的问题有关。 –