假装客户端执行失败:java.lang.reflect.InvocationTargetException
我在服务间通信负载平衡方面有问题 我正在使用spring(1.4.2),netflixOSS的spring云 我有两个服务shoppingcart服务和用户服务 以下是ShoppingCart服务应用程序中的ShoppingCartController:假装客户端执行失败:java.lang.reflect.InvocationTargetException,java,spring,spring-cloud,netflix-feign,netflix-ribbon,Java,Spring,Spring Cloud,Netflix Feign,Netflix Ribbon,我在服务间通信负载平衡方面有问题 我正在使用spring(1.4.2),netflixOSS的spring云 我有两个服务shoppingcart服务和用户服务 以下是ShoppingCart服务应用程序中的ShoppingCartController: @RestController @RequestMapping("shoppingCarts") public class ShoppingCartController extends AbstractRESTController<Sho
@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
}
@RestController
@请求映射(“购物车”)
公共类ShoppingCartController扩展AbstractRESTController{
私人购物车服务购物车服务;
@自动连线
公共购物车控制器(购物车服务){
超级(服务);
this.shoppingCartSrevice=服务;
}
@RequestMapping(value=“{userId}/createShoppingCart”,method=RequestMethod.POST)
ShoppingCart创建ShoppingCart(
@请求主体列表项,
@PathVariable(name=“userId”)字符串userId
){
布尔userOK=shoppingCartSrevice.checkUser(userId);
if(userOK!=null)
如果(userOK)
return shoppingCartSrevice.createShoppingCart(项目,用户ID);
返回null;
}
@佯装客户端(“用户服务”)//“服务器”服务的server.port属性名称
公共接口UserServiceClient{
@RequestMapping(value=“users/checkUser”,method=RequestMethod.POST)//将平衡的端点
布尔校验用户(
@RequestParam(name=“userId”)String userId);//方法规范必须与users/hello相同
}
}
“检查用户”
方法来自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;
}
@服务
公共类ShoppingCartService扩展了AbstractCRUDService{
私人购物车存储库购物车存储库;
私有RestTemplate RestTemplate;
@自动连线
私有UserServiceClient UserServiceClient;//假客户端
@自动连线
公共ShoppingCartService(ShoppingCartRepository repo,RestTemplate RestTemplate){
超级(回购);
this.shoppingCartRepository=repo;
this.restTemplate=restTemplate;
}
/**
*方法检查给定用户是否已注册并处于活动状态
*我们使用Ribbon和Faign从用户服务、负载平衡中获取数据
*@param userId
*@返回
*/
@HystrixCommand(fallbackMethod=“fallbackCheckUser”)
公共布尔checkUser(字符串userId){
/*使用负载平衡*/
Boolean resp=userServiceClient.checkUser(userId);//这里我得到了异常
返回响应;
}
公共布尔fallbackCheckUser(字符串用户ID){
返回true;
}
当我尝试执行checkUser(userId)@HystricsCommand方法时,我得到了:java.lang.reflect.InvocationTargetException
请帮忙
更新1:
shoppingcart服务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>
4.0.0
rs.uns.acs.ftn
购物车服务
0.0.1-快照
罐子
购物车服务
购物车服务
org.springframework.boot
spring启动程序父级
1.4.2.1发布
UTF-8
UTF-8
1.8
org.springframework.cloud
春云起动器
org.springframework.cloud
春云
org.springframework.cloud
春云起动带
org.springframework.boot
弹簧靴起动器执行器
org.springframework.cloud
春云起动器尤里卡
org.springframework.boot
spring启动程序数据mongodb
org.springframework.boot
SpringBootStarterWeb
org.jglue.fluent-json
流畅的json
2.0.3
org.springframework.boot
弹簧起动试验
测试
org.springframework.cloud
spring云依赖关系
Camden.SR2
聚甲醛
进口
org.springframework.boot
springbootmaven插件
Spring Cloud
,Feign
,Ribbon
除了这些“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的一部分
正如@spencergib所提到的,如果没有配置文件(application.yml或properties)、源代码和有意义的stacktrace,就很难解决这个问题
一个可能的问题可能是您的pom
文件缺少
中的
元素。请添加更多的异常。这一行是无用的。异常对象上的堆栈跟踪是空的,而且我在控制台上也没有得到任何输出。我还与Eureka和Zuul一起运行了另外3个服务。我将把pom.xml放在r shoppingcart服务,请参阅更新。我不知道如何帮助,除非您能提供示例。Camden.SR6是Camden发布train.com.netflix.hystrix.exception.hystrix RuntimeException:UserServiceClient#checkUser(字符串)中的最新版本执行时失败。这有什么想法吗?这是我唯一能得到的。我想我知道我做了什么。我有两个使用相同的伪客户端规范的服务:@FeignClient(“用户服务”)。@spencergib你能告诉我为什么吗?HTTP API规范在不同的用例中是不同的。但这是