spring-cloud-open-feign

spring-cloud-open-feign

项目整合

需要集成 loadbalancer 否则会报错

        <!--客户端负载均衡loadbalancer-->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-loadbalancer</artifactId>
        </dependency>
        <!-- openfeign 远程调用 -->
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-openfeign</artifactId>
        </dependency>

使用

@ComponentScan(basePackages = "com.crmzf.**")
@EnableFeignClients //开启fegin
@SpringBootApplication
public class SystemAdminApiApplication {
    public static void main(String[] args) {
        SpringApplication.run(SystemAdminApiApplication.class, args);
    }
}

@FeignClient(name = "example-service")
public interface ExampleClient {
    @GetMapping("/example")
    String example(@RequestParam("param1") String param1, @RequestParam("param2") String param2);
}

回调工厂

//指定回调工厂
@FeignClient(value = "model-user", fallbackFactory = UserTokenServiceFallbackFactory.class)
public interface UserTokenService {

    @PostMapping("/admin/login")
    Result login(@RequestParam("username") String username,@RequestParam("password") String password);
}


@Slf4j
@Component
public class UserTokenServiceFallbackFactory implements FallbackFactory<UserTokenService> {
    @Override
    public UserTokenService create(Throwable cause) {
        log.error("UserService调用失败:{}", cause.getMessage());
        String msg = "服务降级";
        return new UserTokenService() {
            private Result resultError() {
                return Result.failed(msg);
            }
        };
    }
}

多参数调用

错误

Caused by: java.lang.IllegalStateException: Method has too many Body parameters: public abstract com.crmzf.common.util.Result com.crmzf.admin.web.service.UserTokenService.login(java.lang.String,java.lang.String)

解决

@FeignClient(name = "example-service")
public interface ExampleClient {
    @GetMapping("/example")
    String example(@RequestParam("param1") String param1, @RequestParam("param2") String param2);
}

FeignClient(name = "example-service")
public interface ExampleClient {
    @GetMapping("/example/{param1}/{param2}")
    String example(@PathVariable("param1") String param1, @PathVariable("param2") String param2);
}

Fegin远程调用请求头丢失解决

@Configuration
public class FeignHeaderConfig implements RequestInterceptor {
    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = attributes.getRequest();
        requestTemplate.header(SecurityConstants.INNER, request.getHeader(SecurityConstants.INNER));
        requestTemplate.header(SecurityConstants.USER_KEY, request.getHeader(SecurityConstants.USER_KEY));
        requestTemplate.header(SecurityConstants.DETAILS_USER_ID, request.getHeader(SecurityConstants.DETAILS_USER_ID));
        requestTemplate.header(SecurityConstants.DETAILS_USERNAME, request.getHeader(SecurityConstants.DETAILS_USERNAME));
    }
}

上传文件

应用层调用

@FeignClient(value = "storage", path = "/common", contextId = "Upload",fallbackFactory = UploadServiceFeignFallbackFactory.class)
public interface UploadService {

    @PostMapping(value = "/upload",produces = "application/json;charset=UTF-8", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    Result avatar(@RequestPart("file") MultipartFile file);
}

消费层

    @PostMapping("/upload")
    public Result avatar(@RequestParam("file") MultipartFile file) throws IOException {
        if (!file.isEmpty()) {
            String originalFilename = file.getOriginalFilename();
            StorageResult storageResult = sysFileService.uploadFile(file.getInputStream(), originalFilename);
            return Result.success(storageResult);
        } else
            return Result.failed("上传文件为空");
    }

get请求发过去以后变为post请求的问题

{
  "code": 500,
  "msg": "Request method 'POST' is not supported",
  "data": null
}
    @GetMapping("/check/username")
    Result checkUserName(String userName);

解决

    @GetMapping("/check/email")
    Result checkUserEmail(@RequestParam("email") String email);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值