Feign 원 격 호출 사용 시 직렬 화 대상 실패 해결
최근 SpringCloud 의 마이크로 서 비 스 를 구축 하 는 과정 에서 문제 가 발생 했 습 니 다.Feign 원 격 호출 타 임 스 를 사용 하 는 중 오류 가 발생 했 습 니 다.반환 대상 은 구조 방법 이 없고 다른 매개 변 수 를 포함 한 구조 방법 이 있 습 니 다.
로 컬 에서 자체 적 으로 구축 한 마이크로 서비스 디 렉 터 리 는 다음 과 같 습 니 다.이제 막 시 작 했 습 니 다.그 다음 에 점점 최적화 되 고 교체 되 며 관심 이 있 는 것 은 fork 에서 주 소 를 내 릴 수 있 습 니 다.
https://github.com/zhanghailang123/MyCloud
지도 의견 을 주다.
Eureka
:등록 센터 서버,Eureka 등록 센터EurekaClientA
:그 중의 Eureka 서버 는 이름 이 약간 자 유 롭 고 데이터 제공 센터 에 해당 합 니 다.ORM 프레임 워 크 를 사용 하여 데이터 베 이 스 를 연결 하지 않 고 해당 데 이 터 를 죽 였 습 니 다.현 재 는 사용 하 는 것 을 연습 하고 있 을 뿐 입 니 다.나중에 SpringJPA 를 사용 하 는 것 을 고려 하고 있 습 니 다.Mb 가 너무 많이 사용 하기 때 문 입 니 다FeignZ
:feign 모듈 원 격 호출 부하 균형,그리고 Hystrix 퓨즈 체 제 를 통합 시 켰 습 니 다.물론 현재 가장 간단 한 데모 만 하고 촉감HystrixDashboard
:Hystrix 계기판,현재 서버 상황 을 주목 할 수 있 습 니 다RibbonZ
:주로 부하 균형 에 사 용 됩 니 다.시작 할 때 Eureka Client A 를 시작 하여 여러 번 서로 다른 포트 번 호 를 지정 하여 부하 균형 을 테스트 할 수 있 습 니 다.보통 Feign 으로 원 격 으로 호출 되 고 ribbon 이 내장 되 어 있 습 니 다.이 demo 에서 도 테스트 용 입 니 다.TurBineZ
:군집 의 용 단 상황 을 감시 하 는 데 사용 된다.ZuulZ
:게 이 트 웨 이이제 본론 으로 들 어가 자.
장면:Feign 원 격 호출 죽은 데이터 서비스 EurekaClient A 를 사용 할 때 다음 과 같이 오 류 를 보고 합 니 다.
feign 모듈 은 다음 과 같 습 니 다:
문 제 를 재현 하기 위해 서 논 리 를 잠시 설명 합 니 다.
오류 메시지:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `org.example.pojo.Student` (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator)
잘못된 대상:org.example.pojo.student 는 다음 과 같 습 니 다.아주 간단 한 bean 대상 입 니 다.
그런데 왜 이 문 제 를 보 고 했 을 까?
의문 을 가지 고 잘못된 곳 으로 들어가다.
이곳 canInstantiate()방법 검증 이 통과 되 지 않 았 음 을 볼 수 있 습 니 다.여기 서 정지점 을 만들어 결말 을 살펴보다
이 검사 의 내용 은:
어쨌든 모두 무 참 구조 함 수 를 검사 하 는 것 이다.호출 된 student 대상 에 무 참 구조 함 수 를 더 하면 성공 적 으로 호출 할 수 있 습 니 다.
구조 함수 가 성공 적 으로 호출 될 수 있 습 니 다.**
문 제 는 큰 문제 가 아니다.서 비 스 를 구축 하 는 과정 에서 직접 하고 확실하게 참여 해 야 각종 기이 하고 기괴 한 작은 문 제 를 느 낄 수 있다.이렇게 직접 손 을 써 야 가장 큰 수확 을 얻 을 수 있다.
Feign 원 격 호출 주의 점
feign 을 사용 하 는 과정 에서 문제 가 생 겼 기 때문에 여기 서 다음 과 같은 정 리 를 하 겠 습 니 다.
1.원 격 호출 을 위 한 api 인터페이스 정의
방법 매개 변수 목록 에 있 는 매개 변 수 는 모두@RequestParam("value")주석**을 달 아야 합 니 다.그렇지 않 으 면 호출 시 405 이상 이 발생 합 니 다.이 점 은 controller 와 다 릅 니 다.controller 의 방법 은 매개 변수 이름과 프론트 에 들 어 오 는 매개 변수 키 만 대응 하면 자동 으로 매개 변 수 를 연결 할 수 있 습 니 다.
복잡 한 타 입 은@RequestBody 주 해 를 달 아야 합 니 다.
2.service 마이크로 서비스 중의 Controller 의 매개 변수 바 인 딩
매개 변수 목록 에 복잡 한 형식 이 있 으 면 Post 요청 을 사용 하 십시오.Get 요청 을 사용 하면 Bad Request 오 류 를 보고 하고@RequestBody 주 해 를 해 야 합 니 다.일반적인 기본 형식 은@RequestParam 주 해 를 하지 않 아 도 자동 으로 매개 변 수 를 연결 할 수 있 습 니 다.
다른 문제 가 있 으 면 보충 을 환영 합 니 다.코드 를 놓 으 세 요.
api:
@FeignClient("MS-ADMIN-SERVICE")
public interface FixFeignService {
@GetMapping("/fix")
public List<FixInfo> findAll();
@PostMapping("/fix/add")
public int insert(@RequestBody FixInfo fixInfo);
@PostMapping("/fix/limitByParam")
public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo, @RequestParam("page") Integer page, @RequestParam("limit") Integer limit);
@PostMapping("/fix/delByIds")
public boolean delByIds(@RequestParam("ids[]") Long[] ids);
@GetMapping("/fix/findById")
public FixInfo findById(@RequestParam("id") Long id);
@PostMapping("/fix/update")
boolean update(@RequestBody FixInfo fixInfo);
}
서비스
@RestController
@RequestMapping("/fix")
@Slf4j
public class FixInfoController {
@Autowired
private FixInfoService fixInfoService;
@GetMapping("")
public List<FixInfo> findAll(){
List<FixInfo> all = fixInfoService.findAll();
return all;
}
@PostMapping("/add")
public int insert(@RequestBody FixInfo fixInfo){
return fixInfoService.insert(fixInfo);
}
@PostMapping("/limitByParam")
public LayUIPageBean limitByParam(@RequestBody FixInfo fixInfo,Integer page,Integer limit){
LayUIPageBean layUIPageBean = new LayUIPageBean();
PageHelper.startPage(page,limit);
List<FixInfo> all = fixInfoService.findByParam(fixInfo);
PageInfo<FixInfo> pageInfo = new PageInfo<>(all);
return layUIPageBean.setCount((int)pageInfo.getTotal()).setData(pageInfo.getList());
}
@PostMapping("/delByIds")
public boolean delByIds(@RequestParam("ids[]") Long[] ids){
//log.info("id"+ids[0]);
boolean flag= fixInfoService.delByIds(ids);
return flag;
}
@GetMapping("/findById")
public FixInfo findById(Long id){
return fixInfoService.findById(id);
}
@PostMapping("/update")
public boolean update(@RequestBody FixInfo fixInfo){
return fixInfoService.update(fixInfo);
}
}
이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
python이 함수 이름을 통해 함수를 호출하는 몇 가지 장면설명 앞서 시스템 명령을 어떻게 실행하는지 라고 썼다. 시스템 명령을 실행하는 것 외에 우리는 때때로 동적으로python 코드를 실행해야 한다. 경험이 있는 친구들은 내장 함수 eval을 사용하여 이 수요를 실현할 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.