gateway通过feign远程调用微服务配置方法

gateway通过feign远程调用微服务配置方法

​ spring配置,使得gateway和feign协议一致

package com.mx.test.common.config;

import feign.codec.Decoder;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.openfeign.support.ResponseEntityDecoder;
import org.springframework.cloud.openfeign.support.SpringDecoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.MediaType;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;

import java.util.ArrayList;
import java.util.List;

@Configuration
public class FeignConfig {
    @Bean
    public Decoder feignDecoder() {
        return new ResponseEntityDecoder(new SpringDecoder(feignHttpMessageConverter()));
    }

    public ObjectFactory<HttpMessageConverters> feignHttpMessageConverter() {
        final HttpMessageConverters httpMessageConverters = new HttpMessageConverters(new PhpMappingJackson2HttpMessageConverter());
        return new ObjectFactory<HttpMessageConverters>() {
            @Override
            public HttpMessageConverters getObject() throws BeansException {
                return httpMessageConverters;
            }
        };
    }
    public class PhpMappingJackson2HttpMessageConverter extends MappingJackson2HttpMessageConverter {
        PhpMappingJackson2HttpMessageConverter(){
            List<MediaType> mediaTypes = new ArrayList<>();
            mediaTypes.add(MediaType.valueOf(MediaType.TEXT_HTML_VALUE + ";charset=UTF-8")); //关键
            setSupportedMediaTypes(mediaTypes);
        }
    }
}

 * feign自定义拦截器
 * 实现微服务之间参数传递
 * 服务端可以通过HttpServletRequest获取到前面传递的参数
 */
@Component
public class FeignInterceptor implements RequestInterceptor {

    @Override
    public void apply(RequestTemplate requestTemplate) {
        ServletRequestAttributes servletRequestAttributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
        HttpServletRequest request = servletRequestAttributes.getRequest();

        requestTemplate.header("userId",request.getHeader("userId"));
    }
}

### 使用Feign实现远程调用中的文件上传 在微服务架构中,使用Feign作为HTTP客户端来简化服务间的交互非常普遍。当涉及到文件上传操作时,可以通过配置`MultipartFile`参数并调整相应的API端点来完成这一功能。 对于服务器端而言,假设存在一个接收文件上传请求的服务接口如下所示: ```java @RestController @RequestMapping("/file") public class FileUploadController { @PostMapping(value="/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file){ try { // 处理文件保存逻辑... return new ResponseEntity<>("Successfully uploaded - " + file.getOriginalFilename(), HttpStatus.OK); } catch (Exception e) { return new ResponseEntity<>(e.getMessage(), HttpStatus.EXPECTATION_FAILED); } } } ``` 为了通过Feign发起文件上传请求,可以按照下面的方式定义对应的客户端接口: ```java package com.example.feignclient; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.http.MediaType; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.multipart.MultipartFile; @FeignClient(name="file-service", url="${service.url.file}") public interface FileServiceClient { @PostMapping(value="/file/upload", consumes=MediaType.MULTIPART_FORM_DATA_VALUE) String uploadFile(@RequestParam("file") MultipartFile file); } ``` 需要注意的是,在实际项目应用过程中可能还需要额外处理一些细节问题,比如设置超时时间、增加重试机制以及考虑安全性等因素[^2]。 此外,如果要支持更大的文件传输,则建议对Spring Cloud Gateway或者其他网关组件做进一步优化,确保大文件能够顺利传递给目标服务实例[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值