脱离eureka使用ribbon发生的错误Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed;
在做微服务的时候,我们经常会用到eureka和robbit,来实现微服务之间的相互调用。但是对于有些老旧项目来说,可能在修改成eureka注册来实现服务发下可能会比较困难,或者说有些项目根本就没办法来做eureka,这个时候就可以脱离eureka来使用ribbon。
笔者也是处在学习的阶段,自己搭建了一个简单的微服务项目,然后遇到了一些问题。
问题如下:
2020-12-21 13:01:19.562 ERROR 19684 --- [nio-8893-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.IllegalStateException: No instances available for microservice-porducer-user] with root cause
java.lang.IllegalStateException: No instances available for microservice-porducer-user
然后百度发现其他人的解释是没有使用正确的springboot注解,但是我检查了一遍发现别人说的@Autowired,@RestController等的注解都正确使用了,但是也找到了一些原因,就是没有写负载均衡器。
我们都知道ribbon能够实现客户端的负载均衡,没有写这个就没办法实现ribbon的功能,所以就在启动类上加上了这个代码
@Bean
@LoadBalanced
public RestTemplate restTemplate() {
return new RestTemplate();
}
主要是**@LoadBalanced**这个注解。
然后重启代码,调用,发现还是报错,这下就犯了难了,查阅了各种资料,仔细地检查了代码,最后在配置文件上发下了问题,我的配置文件是这样的
server:
port: 8893
spring:
application:
name: microservice-consumer-movie-without-eureka
microservice-porducer-user:
ribbon:
list-of-servers: localhost:8890
猛地一看好像并没有什么问题,但是仔细看会发现,list-of-servers这句话好像有点不对,然后就将中划线的方式改成了驼峰式listOfServers,再重启项目,调用,就没问题了,至此问题解决。
这个配合文件中关于写中划线式还是驼峰式,好像是跟springBoot,springCloud的版本有关,所以在确定自己的代码没有问题的情况下,修改一下配置文件的写法,可能就会解决掉问题,在此可以给大家一个解决问题的思路。