Весеннее Облако Feign отчет 404
Я использую Eureka
зарегистрировать сервис и использовать Feign
для обнаружения служб, но если я не добавлю параметры URL, система выдаст 404 исключения. И мой код с кодом ниже, который не работает:
@FeignClient(name = "CRAWLER-SERVICE")
И ниже код работает:
@FeignClient(name = "crawler-service", url = "http://192.168.199.229:8091/crawler")
Трассировки стека:
feign.FeignException: status 404 reading CrawlerServiceApi#queryAllConditions(String,String)
at feign.FeignException.errorStatus(FeignException.java:62) ~[feign-core-9.5.0.jar:na]
at feign.codec.ErrorDecoder$Default.decode(ErrorDecoder.java:91) ~[feign-core-9.5.0.jar:na]
at feign.SynchronousMethodHandler.executeAndDecode(SynchronousMethodHandler.java:138) ~[feign-core-9.5.0.jar:na]
at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:76) ~[feign-core-9.5.0.jar:na]
at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:103) ~[feign-core-9.5.0.jar:na]
at com.sun.proxy.$Proxy120.queryAllConditions(Unknown Source) ~[na:na]
at com.gezizhi.boss.controller.CrawlerConditionController.queryAllSource(CrawlerConditionController.java:29) ~[classes/:na]
at com.gezizhi.boss.controller.CrawlerConditionController$$FastClassBySpringCGLIB$$bd843b81.invoke(<generated>) ~[classes/:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:738) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) [spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:85) ~[spring-aop-4.3.13.RELEASE.jar:4.3.13.RELEASE]
Конфигурация eureka:
server:
port: 8761
eureka:
instance:
hostname: localhost
client:
register-with-eureka: false
fetch-registry: false
serviceUrl:
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/
server:
enable-self-preservation: false
wait-time-in-ms-when-sync-empty: 0
И конфигурация клиента:
eureka:
instance:
lease-expiration-duration-in-seconds: 2
lease-renewal-interval-in-seconds: 1
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
Код сервера:
@RestController
@RequestMapping("/api/crawler")
public class CrawlerConditonApi {
private final CrawlerConditonService crawlerConditonService;
@Autowired
public CrawlerConditonApi(CrawlerConditonService crawlerConditonService) {
this.crawlerConditonService = crawlerConditonService;
}
@GetMapping("/conditions")
public String queryAllConditions(String belongDatasource, String conditionStatus) {
return crawlerConditonService.queryAllCondition(belongDatasource, conditionStatus);
}
@PostMapping("/conditions")
public String insertConditon(String params, String belongDatasource) {
return crawlerConditonService.insertConditon(params, belongDatasource);
}
@PutMapping("/conditions/{id}/status/{status}")
public String updateCondition(@PathVariable("id") String id, @PathVariable("status") String status) {
return crawlerConditonService.updateCondition(id, status);
}
}
КОД КЛИЕНТА:
@FeignClient(name = "CRAWLER-SERVICE")
public interface CrawlerServiceApi {
@RequestMapping(value = "/api/papersources/", method = RequestMethod.GET)
String queryAllSource();
@RequestMapping(value = "/api/papersources/{id}/status/{status}", method = RequestMethod.PUT)
String updateSource(@PathVariable("id") String id, @PathVariable("status") String status);
@RequestMapping(value = "/api/crawler/conditions", method = RequestMethod.GET)
String queryAllConditions(@RequestParam("belongDatasource") String belongDatasource,
@RequestParam("conditionStatus") String conditionStatus);
@RequestMapping(value = "/api/crawler/conditions", method = RequestMethod.POST)
String insertConditon(@RequestParam("params") String params,
@RequestParam("belongDatasource") String belongDatasource);
@RequestMapping(value = "/api/crawler/conditions/{id}/status/{status}", method = RequestMethod.PUT)
String updateCondition(@PathVariable("id") String id, @PathVariable("status") String status);
}
И я использую в контроллере:
@RestController
public class CrawlerConditionController {
private final CrawlerServiceApi crawlerServiceApi;
@Autowired
public CrawlerConditionController(CrawlerServiceApi crawlerServiceApi) {
this.crawlerServiceApi = crawlerServiceApi;
}
@GetMapping("/conditions/query")
public AbstractResult queryAllSource(@RequestParam("belongDatasource") String belongDatasource,
@RequestParam("conditionStatus") String conditionStatus) {
return ApiInvokeRspUtil.returnDataRowsInvokeRsp("CRL00000",
crawlerServiceApi.queryAllConditions(belongDatasource, conditionStatus));
}
@PostMapping("/conditions/add")
public AbstractResult addConditon(@RequestParam("paramJson") String paramJson,
@RequestParam("belongDataSource") String belongDataSource) {
return ApiInvokeRspUtil.returnDataRowsInvokeRsp("CRL00000",
crawlerServiceApi.insertConditon(paramJson, belongDataSource));
}
@PostMapping("/conditions/{id}/status/{status}")
public AbstractResult updateConditon(@PathVariable("id") String id,
@PathVariable("status") String status) {
return ApiInvokeRspUtil.returnDataRowsInvokeRsp("CRL00000",
crawlerServiceApi.updateCondition(id, status));
}
}
application.yml, который содержит проект CrawlerConditonApi
server:
context-path: /crawler
port: 8091
eureka:
instance:
lease-expiration-duration-in-seconds: 2
lease-renewal-interval-in-seconds: 1
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
spring:
datasource:
driver-class-name: org.mariadb.jdbc.Driver
url: jdbc:mysql://localhost:3306/gezizhi?useUnicode=true&characterEncoding=utf-8
username: root
password: password
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
filters: stat,wall,log4j
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
redis:
database: 0
host: 127.0.0.1
port: 6379
password: password
pool:
max-idle: 10
max-wait: 10000
max-active: 1024
min-idle: 1
timeout: 3000
application:
name: crawler-service
mybatis:
type-aliases-package: com.gezizhi.crawler.dao.domain
mapper-locations: classpath:mybatis/*.xml
1 ответ
Это старый вопрос, я все еще публикую свой ответ, так что он может помочь кому-то еще, поскольку у меня была такая же проблема, и я, наконец, смог ее решить.
Это произошло из-за
server.context
который установлен на
crawler
. Поскольку это эффективно добавляет новый сегмент URL-адреса, вам нужно изменить свой фиктивный клиент на приведенный ниже (обратите внимание на контекст, добавленный после имени службы)
@FeignClient(name = "CRAWLER-SERVICE/crawler")
Или нужно изменить
RequestMapping
на что-то вроде приведенного ниже (опять же, контекст добавляется перед URL-адресом службы):
@RequestMapping("crawler/<rest of the url>")