I use Eureka to register a service and use Feign to discover services, but if I don't add URL parameters, the system will report 404 exceptions.
And my code id below that does not work :
@FeignClient(name = "CRAWLER-SERVICE")
And Below code works :
@FeignClient(name = "crawler-service", url = "http://192.168.199.229:8091/crawler")
Stack trace :
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]
The eureka configuration is:
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
And the client configuration is:
eureka:
instance:
lease-expiration-duration-in-seconds: 2
lease-renewal-interval-in-seconds: 1
client:
serviceUrl:
defaultZone: http://127.0.0.1:8761/eureka/
The server code:
@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);
}
}
THE CLIENT CODE:
@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);
}
And I use in Controller:
@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 which contain CrawlerConditonApi's project
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
@RequestMapping(value = "/api/crawler/conditions", method = RequestMethod.GET) String queryAllConditions(@RequestParam("belongDatasource") String belongDatasource, @RequestParam("conditionStatus") String conditionStatus);- Youngs