精华内容
下载资源
问答
  • 数组 (在请求传递过程中,对请求做修改) - 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 才能成功访问

     

     

    展开全文
  • 另外3个服务分别去调用这个接口 2个tomcat的服务,调用成功 1个jar启动的spring boot服务,调用失败,参数传递不过去 关键报错日志 Required Long parameter 'userId' is not present,日志截图如下: 接口...

    现象

    • 有一个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注解可以调用外部微服务接口 总共分为5步: 第一步:加载Jar包 第二步:新建一个Feign接口类( ClearBatchFeign.java),并且注明接口实现类 第三步:创建一个Feign接口实现类...

     

    通过@FeignClient注解可以调用外部微服务接口

    总共分为5步:

     

    第一步:加载Jar包

    第二步:新建一个Feign接口类( ClearBatchFeign.java),并且注明接口异常类,定义接口返回异常后的处理

    第三步:创建一个Feign接口接口异常类(ClearBatchFeignFallback.java),实现Feign接口,

    需要加上注解@Component自动注入

    第四步,定义Bean类来接受数据(接收的数据要和调用的接口一致)

    第五步:调用接口,实现微服务调用

     

     

    第一步:加载Jar包

    <!--spring-cloud-starter-feign-->
    <dependency>
       <groupId>org.springframework.cloud</groupId>
       <artifactId>spring-cloud-starter-feign</artifactId>
    </dependency>

     

    第二步:新建一个Feign接口类( ClearBatchFeign.java),

    并且注明接口异常类fallback = ClearBatchFeignFallback.class(第二步创建)

    import io.hcbm.common.constant.HcbmService;

    import io.hcbm.fulfill.api.dto.ContractDTO;

    import io.hcbm.fulfill.api.dto.ContractLineDTO;

    import io.hcbm.fulfill.infra.feign.fallback.ClearBatchFeignFallback;

    import org.springframework.cloud.netflix.feign.FeignClient;

    import org.springframework.http.MediaType;

    import org.springframework.http.ResponseEntity;

    import org.springframework.web.bind.annotation.GetMapping;

    import org.springframework.web.bind.annotation.PathVariable;

     

    import java.util.List;

     

    @FeignClient(value = HcbmService.Contract.NAME, fallback = ClearBatchFeignFallback.class)

    public interface ClearBatchFeign {

        @GetMapping(value = "/v1/{organizationId}/contracts/{contractId}", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

        ResponseEntity<ContractDTO> getContractByContractId(@PathVariable("contractId") Long contractId,

                                                      @PathVariable("organizationId") Long tenantId);

     

        @GetMapping(value = "/v1/{organizationId}/contracts/{contractId}/lines", produces = MediaType.APPLICATION_JSON_UTF8_VALUE)

         ResponseEntity<List<ContractLineDTO>> getContractLineByContractId(@PathVariable("contractId") Long contractId,

                                                                       @PathVariable("organizationId") Long tenantId);

    }

     

     

    HcbmService.JAVA文件定义的是微服务的基本信息:服务名,端口号和Code

     

     

    第三步:创建一个Feign接口异常实现类(ClearBatchFeignFallback.java),实现Feign接口( ClearBatchFeign),

    需要加上注解@Component自动注入

     

    import io.hcbm.fulfill.api.dto.ContractDTO;

    import io.hcbm.fulfill.api.dto.ContractLineDTO;

    import io.hcbm.fulfill.infra.feign.ClearBatchFeign;

    import org.springframework.http.HttpStatus;

    import org.springframework.http.ResponseEntity;

    import org.springframework.stereotype.Component;

     

    import java.util.List;

     

    @Component

    public class ClearBatchFeignFallback implements ClearBatchFeign {

     

        @Override

        public ResponseEntity<ContractDTO> getContractByContractId(Long contractId, Long tenantId) {

            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

        }

     

        @Override

        public ResponseEntity<List<ContractLineDTO>> getContractLineByContractId(Long contractId, Long tenantId) {

            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);

        }

    }

     

    第四步,定义Bean类来接受数据(接收的数据要和调用的接口一致)

     

    import com.alibaba.fastjson.annotation.JSONField;

    import com.fasterxml.jackson.annotation.JsonFormat;

    import lombok.*;

    import org.hzero.editpmsn.EditObject;

    import org.hzero.editpmsn.constant.EditObjectCode;

    import org.springframework.format.annotation.DateTimeFormat;

     

    import java.math.BigDecimal;

    import java.time.LocalDate;

    import java.util.Date;

     

    @Getter

    @Setter

    @Builder

    @AllArgsConstructor

    @NoArgsConstructor

    @ToString

    @EditObject(referenceObject = EditObjectCode.CONTRACT)

    public class ContractDTO {

        private Long id;

        private String contractNumber;

        private String contractName;

        private Long companyId;

        private String companyName;

        private Long categoryId;

        private String categoryName;

        private String inOutTypeCode;

        private String propertyCode;

        private String departmentName;

        private Long departmentId;

        private String belongingDepartmentName;

        private Long belongingDepartmentId;

        @DateTimeFormat(pattern = "yyyy-MM-dd")

        @JsonFormat(pattern = "yyyy-MM-dd")

        @JSONField(format = "yyyy-MM-dd")

        private LocalDate signatureDate;

        @DateTimeFormat(pattern = "yyyy-MM-dd")

        @JsonFormat(pattern = "yyyy-MM-dd")

        @JSONField(format = "yyyy-MM-dd")

        private LocalDate startDate;

        @DateTimeFormat(pattern = "yyyy-MM-dd")

        @JsonFormat(pattern = "yyyy-MM-dd")

        @JSONField(format = "yyyy-MM-dd")

        private LocalDate endDate;

        private BigDecimal amount;

        private String paymentModeCode;

        private String signatureTypeCode;

        private String currency;

        private String principalName;

        private Long principalId;

        private String statusCode;

        private String executeStatusCode;

        private String lastStatusCode;

        private String description;

        private String creationMethodCode;

        private Long sourceContractId;

        private String sourceContractNumber;

        private Long sourceTemplateId;

        private String sourceTemplateNumber;

        private Long contentId;

        private Long lineFieldId;

        private String creator;

        @DateTimeFormat(pattern = "yyyy-MM-dd")

        @JsonFormat(pattern = "yyyy-MM-dd")

        @JSONField(format = "yyyy-MM-dd")

        private Date creationDate;

        private Long version;

        private String editMode;

        private Long tenantId;

        private Long objectVersionNumber;

     

        private Long createdBy;

        // 权限校验用

        private Boolean canEdit;

        /**

         * 动态字段编码

         */

        private String ruleNumber;

     

    }

    第五步定义接口,引用方法得到数据

     

     

    展开全文
  • Springcloud项目跨微服务接口调用

    千次阅读 2020-12-24 00:06:42
    三、创建Client包,并添加需要调用的其他模块的微服务接口 @FeignClient注释选择被调用微服务。参数填微服务名称,可以在被选中的微服务yaml文件中配置微服务名称 接口内部写的方法,是被调用微服务的...

    一、导入依赖

    在需要调用者微服务模块导入openfeign依赖
    在这里插入图片描述

    二、启动类添加EnableFeignClients注释

    在这里插入图片描述

    三、创建Client包,并添加需要调用的其他模块的微服务的接口

    @FeignClient注释选择被调用的微服务。参数填微服务名称,可以在被选中的微服务yaml文件中配置微服务名称

    接口内部写的方法,是被调用的微服务的controller层的方法。(注:请求类型,参数类型,必须一致)

    在这里插入图片描述

    结语:需要注意的就是启动类记得写注释,以及client包下接口需要选中被调用模块微服务名称。测试的话再service层调用此方法即可。

    展开全文
  • 微服务调用接口

    万次阅读 2016-12-04 12:09:07
    微服务调用接口     微服务调用:   微服务也是服务,我们一般认为微服务都是不同的实例提供的。这些实例通常和调用者运行在不同的进程中(根据部署模式不同,多个微服务实例到是有可能在一个进程中...
  • 通过@FeignClient注解可以调用外部微服务接口 总共分为5步: 第一步:加载Jar包 第二步:新建一个Feign接口类(ClearBatchFeign.java),并且注明接口实现类 第三步:创建一个Feign接口实现类...
  • 微服务@FeignClient注解调用本地其他微服务接口前言1、知识准备2、具体实施3、参考文章 前言 公司项目是SpringBoot+SpringCloud项目, 本人负责的是A项目,在B项目中添加了接口和代码, 但是运行出现了空指针异常,...
  • @RequestMapping注解用于对被调用微服务进行地址映射。注意 @PathVariable注 解一定要指定参数名称,否则出错。 @PathVariable:接口参数 被Feign调用的方法如下: @RequestMapping(value="/...
  • Jhipster 微服务微服务相互调用

    千次阅读 2018-08-13 11:58:56
    现有两个微服务A和B,A负责管理用户信息,B负责角色管理。 (1)A服务发送请求,绑定角色,B服务收到请求后,调用A服务查询用户是否存在,判断用户是否重复绑定,条件通过则绑定用户,最后反馈信息给A服务 (2)A...
  • 微服务相互调用超时

    2020-07-08 16:52:02
    微服务相互调用超时: 如图: 原因:未设置超时时间,feign基于rabbon开发,所以两个超时设置均可: 访问成功,如图: ok,问题解决
  • feign调用方法: @RequestMapping(value = /resources/ocircuit/textInfo, method = {RequestMethod.GET}, produces = text/plain;charset=utf-8) String getOcircuitTextRouteInfo(@PathVariable(name = resID) ...
  • 微服务并行调用多个外部接口

    千次阅读 2019-10-17 10:55:37
    例如, 在一个线程中并发请求多个其他外部接口, 一个折中的方案 既用到了当前线程, 又用到了线程池, 给当前线程加上了翅膀/辅助。 、 // coreSize 16 任务队列最长64, 当超出64, 创建新的线程,非核心线程最长...
  • 使用@FeignClient进行微服务调用

    千次阅读 2020-01-15 16:24:11
    通过@FeignClient注解可以调用外部微服务接口 总共分为5步: 第一步:加载Jar包 第二步:新建一个Feign接口类( ClearBatchFeign.java),并且注明接口实现类 第三步:创建一个Feign接口实现类...
  • 微服务中我们一般为划分为独立模块,在进行接口调用时,有时访问失败,很大一部分原因出现在SpringBoot配置文件写的有问题。 微服务框架接口调用失败记录(错误代码404)是因为没有项目的名称 spring: ...
  • spring cloud微服务之间调用Feign

    千次阅读 2019-01-31 13:25:59
    微服务之间调用Feign 1.在调用方添加feign依赖: &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud&lt;/groupId&gt; &lt;artifactId&gt;sp...
  • 微服务之间调用超时配置

    千次阅读 2020-03-05 11:39:49
    微服务A 调用 B, 即:A是客户端,B是服务端。 feign: client: config: default: connectTimeout: 5000 readTimeout: 5000 这个是客户端配置,因此要配在A里面。 其中“default” 是全局配置,对所有的 @...
  • 使用FeignClient实现微服务接口调用

    千次阅读 2019-08-20 14:23:19
    首先,根据要调用的服务及接口: import com.sample.pass.distrition.model.ResultBody; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.GetMapping; ...
  • 在之前章节我们讲解了用Feign在微服务之间进行相互调用,那么在整个微服务体系运行时,我们怎么宏观地监测和跟踪这些微服务调用过程呢?接下来我们就引入:微服务链路追踪技术 链路追踪技术汇总 现在比较流行的...
  • SpringBoot微服务调用解决方案

    万次阅读 2019-04-19 16:05:21
    SpringBoot微服务调用解决方案方式一:中间服务方式二:互相调用方式三:两者组合使用问题 方式一:中间服务 优势: 将服务间的耦合度降到最低 ; 降低服务复杂度,各服务不需要变动; 缺点: 增加了服务数量,...
  • 微服务服务调用微服务架构中,要调用很多服务才能完成一项功能。服务之间如何互相调用就变成微服务架构中的一个关键问题。服务调用有两种方式,一种是RPC方式,另一种是事件驱动(Event-driven)方式,也就是发...
  • 微服务互相调用-Feign

    千次阅读 2018-06-13 10:38:25
    背景实际开发中我们经常会面临在同一个eureka注册中心下的各个微服务之间互相调用彼此的接口来获取预期的数据。通过Spring Cloud Feign,我们只需要创建一个接口并用注解的方式来配置它,即可完成对服务提供方的接口...
  • 微服务】Springcloud微服务之间调用

    万次阅读 2018-10-15 16:43:35
    【方法1】Springcloud之间的调用 1、符合该架构规范的@FeignClient访问方式,feign在Springcloud中的使用。 (1)添加feign依赖 &lt;dependency&gt; &lt;groupId&gt;org.springframework.cloud...
  • SpringCloud微服务,服务查询,接口查询,可以简单查看微服务接口提供者和消费者查询列表,可以简单知晓接口使用情况
  • 一.背景微服务架构下,我们的系统根据...需要注意的是我们这边讲的是微服务之间调用的安全认证,不是统一的在API官网认证,需求不一样,API网关处的统一认证是和业务挂钩的,我们这边是为了防止接口被别人随便调用
  • 微服务之间接口调用(FeignClient)

    千次阅读 2018-10-26 17:46:13
    fallback :断路器,当时接口执行异常时,调用接口实现方法 @Service public class XxxxxFeignServiceImpl implements XxxxFeignService{ @Override public List<JobInfoVo> getXxxx(Integer xxx) { log....
  • Feign实现微服务调用返回stream

    千次阅读 2019-06-05 16:52:25
    今天来讲述一下fegin的调用返回stream,得到stream我们可以下载,写入到页面展示图片等; 我们就开始讲述一下: 服务提供者流接口 @RequestMapping(value = "feginProcessDiagram", method = RequestMethod.GET, ...
  • 微服务远程调用Feign

    2020-09-19 10:41:11
    网关远程调用认证中心获取token接口,正常情况会负载调用请求分发下去 操作问题: 拔掉192.168.79.191 的网线 使用192网关调用获取token接口时需等待40多秒 才能正常访问 FeignCilent可以设置可以设置调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,407
精华内容 33,362
关键字:

微服务接口调用