精华内容
下载资源
问答
  • 1个jar启动的spring boot服务,调用失败,参数传递不过去 关键报错日志 Required Long parameter 'userId' is not present,日志截图如下: 接口是通的,但是参数值传递失败,对方只接收到null值,导致报错提示...

    现象

    • 有一个spring boot 服务,对外提供查询的接口

    • 另外3个服务分别去调用这个接口

    • 2个tomcat的服务,调用成功

    • 1个jar启动的spring boot服务,调用失败,参数传递不过去

    • 关键报错日志 Required Long parameter 'userId' is not present,日志截图如下:
      在这里插入图片描述

    • 接口是通的,但是参数值传递失败,对方只接收到null值,导致报错提示

    • FeignClient里面的接口

    @RequestMapping(value = "/api/auth/loader/user/loadSystemMenu", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
    List<AuthMenuVO> loadSystemMenu(@RequestParam(name = "userId") Long userId, @RequestParam(name = "sysCode") String sysCode);
    
    • 实现类
    @RequestMapping(value = "loadSystemMenu")
    public List<AuthMenuVO> loadSystemMenu(@RequestParam(name = "userId") Long userId, @RequestParam(name = "sysCode") String sysCode) {
        List<AuthMenuVO> menuVOList = authMenuService.getUserMenuBySysCode(userId, sysCode);
        return menuVOList;
    }
    

    剖析

    • 该接口功能没问题,因为另外2个tomcat服务调用都成功了,参数传递也没问题。失败的是内置tomcat使用jar启动的spring boot工程,应该是和spring注解或相关默认配置有关
    • 该接口注明是POST方式,但是调用方使用的是默认的get方式
    • 实现类上有@RequestParam注解,这个是get方式需要用到的

    解决

    • 第一次尝试,将Long改为long,由包装类型改为基本类型,无用
    • 第二次尝试,将实现类的@RequestParam注解去除,不报错了,但是值传不过去
    • 第三次尝试,将接口里的调用方式post改为get,成功

    总结

    • 参数传递失败时,需要将post请求,改为get请求
    • 具体原因还在探究中,怀疑是spring boot里的哪些默认配置,限制了POST方式使用@RequestParam,后续有时间再深入源码继续测试
    展开全文
  • 然后编写需要调用接口地址.这样就可以通过服务名+接口地址定位到对应的方法 @FeignClient("service-vod") @Component public interface VodClient { @DeleteMapping(value = "/eduvod/video/{videoId}") public ...

    首先编写客户端,关键在于@FeignClient(“被调用端的服务名”).然后编写需要调用的接口地址.这样就可以通过服务名+接口地址定位到对应的方法

    @FeignClient("service-vod")
    @Component
    public interface VodClient {
        @DeleteMapping(value = "/eduvod/video/{videoId}")
        public R removeVideo(@PathVariable("videoId") String videoId);
    
        @DeleteMapping(value = "/eduvod/video/delete-batch")
        public R removeVideoList(@RequestParam("videoIdList") List<String> videoIdList);
    }
    

    第一步:调用端(消费者)接口请求发出.通过Feign,指向被调用端(生产者)对应的方法.
    例:VodClient及连接生产者和消费者的类.先将VodClient注入进ServiceImpl,然后调用VODClient中的方法,VodClient中的@FeignClient就会通过Feign连接到对应的生产者中的方法.

    	@Autowired
        private VodClient vodClient;
        @Override
        public boolean removeByCourseId(String courseId) {
            //根据课程id查询出对应的视频id
            QueryWrapper<EduVideo> wrapper=new QueryWrapper<>();
            wrapper.eq("course_id",courseId);
            wrapper.select("video_source_id");
            List<EduVideo> list=baseMapper.selectList(wrapper);
            //得到所有列表的云端视频id
            List<String> idList=new ArrayList<>();
            for (EduVideo edu:list) {
                if (!StringUtils.isEmpty(edu.getVideoSourceId())){
                    idList.add(edu.getVideoSourceId());
                }
            }
            //调用vod服务删除远程视频
            if (idList.size()>0){
                vodClient.removeVideoList(idList);
            }
            QueryWrapper<EduVideo> queryWrapper = new QueryWrapper<>();
            queryWrapper.eq("course_id", courseId);
            Integer count = baseMapper.delete(queryWrapper);
            return null != count && count > 0;
        }
    

    第二步:通过Feign后,会执行熔断器Hystrix.熔断器的作用就是,在消费者调用生产者之前,Hystrix会先尝试连接生产者,如果这时发现生产者不在线(服务挂掉了),就会进行熔断,终止调用.
    第三步:如果生产者在线,那么流程就会走到负载均衡(Ribbon).负载均衡的意义在于,当生产者被做成一个集群时(有多台服务器运行同一个生产者),这时候Ribbon就会根据各服务器的运行情况和开发人员设置的负载规则,将请求分发到对应的服务器.
    第四步:前几步都通过之后,请求才会进入被调用的生产者,通过ip端口号接口地址访问到对应的方法进行调用.这个流程被称为httpClient.

    Feign

    Feign是Netflix开发的声明式、模板化的HTTP客户端, Feign可以帮助我们更快捷、优雅地调用HTTP API。
    Feign支持多种注解,例如Feign自带的注解或者JAX-RS注解等。
    Spring Cloud对Feign进行了增强,使Feign支持了Spring MVC注解,并整合了Ribbon和Eureka,从而让Feign的使用更加方便。
    Spring Cloud Feign是基于Netflix feign实现,整合了Spring Cloud Ribbon和Spring Cloud Hystrix,除了提供这两者的强大功能外,还提供了一种声明式的Web服务客户端定义的方式。
    Spring Cloud Feign帮助我们定义和实现依赖服务接口的定义。在Spring Cloud feign的实现下,只需要创建一个接口并用注解方式配置它,即可完成服务提供方的接口绑定,简化了在使用Spring Cloud Ribbon时自行封装服务调用客户端的开发量。

    Hystrix

    Hystrix 是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。
    比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败
    

    在这里插入图片描述

    展开全文
  • 微服务中我们一般为划分为独立模块,在进行接口调用时,有时访问失败,...微服务框架接口调用失败记录(错误代码404)是因为没有项目的名称 spring: application: name: member 指定名称后成功访问,不报错 ...

    在微服务中我们一般为划分为独立模块,在进行接口调用时,有时访问失败,很大一部分原因出现在SpringBoot配置文件写的有问题。

    微服务框架接口调用失败记录(错误代码404)是因为没有项目的名称 

    spring:
      application:
        name: member

    指定名称后成功访问,不报错

    展开全文
  • 数组 (在请求传递过程中,对请求做修改) - StripPrefix=1 #在请求转发之前去掉 gateway的一层路径 nacos: discovery: server-addr: localhost:8848 #将gateway 注册到nacos 5、运行微服务与nacos、即可实现调用 ...

    1、创建新的module

    2、填入pom

    <dependencies>
            <!--gateway  此模块已包含 starte-web-->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-gateway</artifactId>
            </dependency>
            <!--nacos客户端-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
                <version>2.2.0.RELEASE</version>
            </dependency>
        </dependencies>

    3、新建主启动类

    4、新建application.yml、配置基础的信息

    server:
      port: 7000
    
    spring:
      application:
        name: api-gateway
      cloud:
        gateway:
          discovery:
            locator:
              enabled: true #让gateway从nacos中获取服务信息
          routes:  #路由数组
            - id: order_route  #订单路由
    #          uri: http://localhost:7001   #转发的地址
              uri:  lb://service-order-provider-7001 #lb 指的是负载均衡 后面是nacos的服务名
              order: 1 #路由优先级  数字越小越大
              predicates:  #断言数组(条件判断,返回值boolean ,转发请求满足条件的)
                - Path=/api-order/**
              filters: #过滤器 数组 (在请求传递过程中,对请求做修改)
                - StripPrefix=1 #在请求转发之前去掉 gateway的一层路径
        nacos:
          discovery:
            server-addr: localhost:8848 #将gateway 注册到nacos
    
    

    5、运行微服务与nacos、即可实现调用

     

    6、新建一个基础的 自定义全局过滤器

    package com.zhuanghw.filters;
    
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.lang3.StringUtils;
    import org.springframework.cloud.gateway.filter.GatewayFilterChain;
    import org.springframework.cloud.gateway.filter.GlobalFilter;
    import org.springframework.core.Ordered;
    import org.springframework.http.HttpStatus;
    import org.springframework.stereotype.Component;
    import org.springframework.web.server.ServerWebExchange;
    import reactor.core.publisher.Mono;
    
    /**
     * @author zhuanghw
     * @date 2020/4/15 15:06
     * <p>
     * 全局鉴权 过滤器
     */
    @Slf4j
    @Component
    public class AuthGlobalFilter implements GlobalFilter, Ordered {
    
        //过滤器逻辑
        @Override
        public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
    
            //统一鉴权逻辑
            String token = exchange.getRequest().getQueryParams().getFirst("token");
            if (!StringUtils.equals("admin", token)) {
                log.error("认证失败");
                exchange.getResponse().setStatusCode(HttpStatus.UNAUTHORIZED);//401
                return exchange.getResponse().setComplete();
            }
            //放行
            return chain.filter(exchange);
        }
    
        //优先级   数值越小越高
        @Override
        public int getOrder() {
            return 0;
        }
    }
    

    此时调用api gateway时 必须携带token 才能成功访问

     

     

    展开全文
  • 微服务@FeignClient注解调用本地其他微服务接口前言1、知识准备2、具体实施3、参考文章 前言 公司项目是SpringBoot+SpringCloud项目, 本人负责的是A项目,在B项目中添加了接口和代码, 但是运行出现了空指针异常,...
  • 微服务调用失败的一种解决方案

    千次阅读 2020-06-04 00:05:50
    一.简介 今天微服务和远程调用已经使用的很广泛了,可以解决我们很...我这里介绍一种简单的解决办法,采用消息队列解构接口调用,定时器重新发送,mysql持久化。配合人工处理可以较好的解决这个问题。 二.流程 ...
  • 通过@FeignClient注解调用微服务接口,若接口路径参数不传入,会导致接口调用失败 举个例子,如下接口 如图1-1: 图1-1 接口详情 查看该接口的源码,如图1-2: 图1-2接口源码 接口路径当中有{...
  • feign调用方法: @RequestMapping(value = /resources/ocircuit/textInfo, method = {RequestMethod.GET}, produces = text/plain;charset=utf-8) String getOcircuitTextRouteInfo(@PathVariable(name = resID) ...
  • 微服务服务调用微服务架构中,要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式,一种是RPC方式,另一种是事件驱动(Event-driven)方式,也就是发...
  • 微服务调用机制

    2019-12-13 16:31:38
    按业务进行划分为独立的...都是通过Rest接口调用服务的http接口,参数和结果默认都是通过Jackson序列化和反序列化。 Feign用的是Ribbon。 Ribbon是一个客户端的负载均衡器,它提供对大量的HTTP和TCP客户端的访问控制...
  • 假定系统管理微服务的实例名称为system, 在系统管理中查询码表 :/...在自己的微服务调用系统管理的查询码表接口写法如下: DataDictionaryService @AuthorizedFeignClient(name ="system",fallback = Data...
  • 一.背景微服务架构下,我们的系统根据...需要注意的是我们这边讲的是微服务之间调用的安全认证,不是统一的在API官网认证,需求不一样,API网关处的统一认证是和业务挂钩的,我们这边是为了防止接口被别人随便调用
  • Spring Cloud中如何保证各个微服务之间调用的安全性?

    千次阅读 多人点赞 2021-08-19 15:39:58
    导读:在微服务的架构下,系统会根据业务拆分为多个服务,各自负责单一的职责,在这样的架构下,我们需要确保各api的安全性,也就是说服务不是开放的,而是需要授权才可访问的,避免接口被不合法的请求所访问。...
  • 文章目录微服务服务调用一,事件驱动(Event-Driven)方式事件通知(Event Notification)方式事件溯源(Event Sourcing)方式二,RPC方式:三,总结Spring Cloud Feign概述与工作原理解读一,服务间调用的几种方式二,...
  • 调用方式 ((EmployeeService) AopContext.currentProxy()).update(emp); 使用 切面调用方法时,报错 Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available. ...
  • EurekaClient启动以后,不是立即向Eureka Server注册... 如果还没有注册,则会抛出:使用 RestTemplate 报java.lang.IllegalStateException:No instances available for localhost //微服务的真实名字为eurek...
  • 二、创建微服务调用接口文件 @FeignClient(name = "fenjin-cloud-basicdata", configuration = FeignConfiguration.class, fallbackFactory = DeviceFallbackFactory.class) public interface DeviceSe
  • 原因:开了多个pod,且版本不统一。 我出现的情况是有个定时任务每天凌晨启动。@Scheduled(cron = "0 0 0 * * ?") 然后正式环境没有问题,测试环境却偶尔统计不进去。 修改执行时间@Scheduled(cron = "0 2315* * ?...
  • 记录一次springboot微服务使用Feign远程调用失败 2020-04-16 11:14:53.632 [http-nio-7664-exec-6] ERROR c.fe.common.exception.ExceptionCatch - catch exception: Error while extracting response for type ...
  • 从一个spring boot的项目去调用一个公共的基于dubbo的微服务接口产生了死锁。具体流程是:要实现一个用户注册的功能,现在在spring boot项目中创建一个用户,然后去请求微服务接口获取网易IM的accid和token,然后将...
  • 微服务rpc远程调用中,如果接口调用失败或者是超时,客户端都会采用重试请求,但是在客户端重试的过程中都会导致服务器服务处理出现【重复消费】;一般情况下,接口产生重复消费的原因有以下2种: 1、表单重复...
  • 微服务feign调用添加token问题

    千次阅读 2020-04-29 18:59:20
    具体的怎么调用就不说了 如下配置,就可以在请求头中添加需要的请求头信息。 package localdate; import feign.RequestInterceptor; import feign.RequestTemplate; import lombok.extern.slf4j.Slf4j; import org....
  • 微服务模块之间接口调用方式(FeginClient) FeginClient描述 在微服务架构的项目开发中,模块之间调用方法,除了之前的RestTemplate方式,FeginClient也是一种模块间方法调用的方式。在 Spring Cloud Feign 的实现...
  •  在实际的微服务架构中 , 通常是根据业务来拆分成一个个的服务 , 服务与服务之间可以相互调用(RPC) , 在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用 . 为了保证其高可用 , 单个服务通常会集群部署(如我们...
  • 报错信息: Error starting ApplicationContext. To display the conditions report re-run your application with 'debug...调用端启动类未添加@EnableFeignClients注解。唉。或者看看服务提供者有没有注册成功。
  • Spring-Could微服务Feign调用超时问题 在使用feign项目直接接口互相调用的时候,经常会出现连接超时。 com.netflix.hystrix.exception.HystrixRuntimeException: XXXClient#xxxx方法 failed and no fallback ...
  • 微服务feign调用两边对象不一致

    千次阅读 2019-04-04 11:27:58
    一开始以为feign调用,两边接收的对象必须一致 再发现两边对象的字段一致即可. 在之后遇到一个问题 A服务 a,b,两个字段+ getC()方法 B服务 a,b字段 出现异常序列化失败-----联想到前端解析json对象的方法,直接在...
  • 现象反馈,公司微服务间相互调用时通过feignClient来实现,feignClient自带负载均衡(轮询),  但是本地调试时候,大家都用同一个注册中心Eureka Server 有几率分发至其他机器,而不是本地自己调试机器   解决...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 31,510
精华内容 12,604
关键字:

微服务接口调用失败