使用@FeignClient进行微服务间调用

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

总共分为5步:

 

第一步:加载Jar包

第二步:新建一个Feign接口类( ClearBatchFeign.java),并且注明接口实现类

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

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

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

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

 

第一步:加载Jar包 该步可能会由于spring boot版本问题出现@EnableFeignClients找不到的错误,具体请看:Spring Boot下使用Feign提示找不到注解@EnableFeignClients的原因及解决方法


    
        
            org.springframework.cloud
            spring-cloud-openfeign
            2.0.0.RC1
            pom
            import
        
    


    
        org.springframework.cloud
        spring-cloud-starter-openfeign
    

 

第二步:新建一个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 getContractByContractId(@PathVariable("contractId") Long contractId,

                                                  @PathVariable("organizationId") Long tenantId);

 

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

     ResponseEntity> getContractLineByContractId(@PathVariable("contractId") Long contractId,

                                                                   @PathVariable("organizationId") Long tenantId);

}

 

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

使用@FeignClient进行微服务间调用_第1张图片

 

第三步:创建一个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 getContractByContractId(Long contractId, Long tenantId) {
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }

    @Override
    public ResponseEntity> getContractLineByContractId(Long contractId, Long tenantId) {
        return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
    }

}

 

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

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;

 

}

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

使用@FeignClient进行微服务间调用_第2张图片

 使用@FeignClient进行微服务间调用_第3张图片

你可能感兴趣的:(Java)