Feign 원 격 호출 사용 시 직렬 화 대상 실패 해결

Feign 원 격 호출 직렬 화 대상 실패
최근 SpringCloud 의 마이크로 서 비 스 를 구축 하 는 과정 에서 문제 가 발생 했 습 니 다.Feign 원 격 호출 타 임 스 를 사용 하 는 중 오류 가 발생 했 습 니 다.반환 대상 은 구조 방법 이 없고 다른 매개 변 수 를 포함 한 구조 방법 이 있 습 니 다.
로 컬 에서 자체 적 으로 구축 한 마이크로 서비스 디 렉 터 리 는 다음 과 같 습 니 다.이제 막 시 작 했 습 니 다.그 다음 에 점점 최적화 되 고 교체 되 며 관심 이 있 는 것 은 fork 에서 주 소 를 내 릴 수 있 습 니 다.
https://github.com/zhanghailang123/MyCloud
지도 의견 을 주다.
  • Eureka:등록 센터 서버,Eureka 등록 센터
  • 를 사용 합 니 다.
  • EurekaClientA:그 중의 Eureka 서버 는 이름 이 약간 자 유 롭 고 데이터 제공 센터 에 해당 합 니 다.ORM 프레임 워 크 를 사용 하여 데이터 베 이 스 를 연결 하지 않 고 해당 데 이 터 를 죽 였 습 니 다.현 재 는 사용 하 는 것 을 연습 하고 있 을 뿐 입 니 다.나중에 SpringJPA 를 사용 하 는 것 을 고려 하고 있 습 니 다.Mb 가 너무 많이 사용 하기 때 문 입 니 다
  • FeignZ:feign 모듈 원 격 호출 부하 균형,그리고 Hystrix 퓨즈 체 제 를 통합 시 켰 습 니 다.물론 현재 가장 간단 한 데모 만 하고 촉감
  • 을 연습 하고 있 습 니 다.
  • HystrixDashboard :Hystrix 계기판,현재 서버 상황 을 주목 할 수 있 습 니 다
  • [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1iElFSJl-1610638015331)(使用Feign远程调用时,序列化对象失败.assets/clipboard.png)]
  • 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 대상 입 니 다.
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SKoeb8Wz-1610638015338)(使用Feign远程调用时,序列化对象失败.assets/image-20210114230523431.png)]
    그런데 왜 이 문 제 를 보 고 했 을 까?
    의문 을 가지 고 잘못된 곳 으로 들어가다.

    이곳 canInstantiate()방법 검증 이 통과 되 지 않 았 음 을 볼 수 있 습 니 다.여기 서 정지점 을 만들어 결말 을 살펴보다

    이 검사 의 내용 은:

    어쨌든 모두 무 참 구조 함 수 를 검사 하 는 것 이다.호출 된 student 대상 에 무 참 구조 함 수 를 더 하면 성공 적 으로 호출 할 수 있 습 니 다.
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iFpjTYoT-1610638015342)(使用Feign远程调用时,序列化对象失败.assets/image-20210114231909848.png)]
    구조 함수 가 성공 적 으로 호출 될 수 있 습 니 다.**
    문 제 는 큰 문제 가 아니다.서 비 스 를 구축 하 는 과정 에서 직접 하고 확실하게 참여 해 야 각종 기이 하고 기괴 한 작은 문 제 를 느 낄 수 있다.이렇게 직접 손 을 써 야 가장 큰 수확 을 얻 을 수 있다.
    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);
        }
    }
    
    이상 은 개인 적 인 경험 이 므 로 여러분 에 게 참고 가 되 기 를 바 랍 니 다.여러분 들 도 저 희 를 많이 응원 해 주시 기 바 랍 니 다.

    좋은 웹페이지 즐겨찾기