SpringCloud-微服务-服务之间的调用

1.使用Feign

调用方:

import com.nick.movie.config.MultipartSupportConfig;
import com.nick.movie.utils.ResponseResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RequestPart;
import org.springframework.web.multipart.MultipartFile;

/**
 * @version V1.0
 * @ClassName:MovieService
 * @author: hbj
 * @CreateDate:2018/8/27 19:34
 */
@FeignClient(value = "file-server", path = "/attachment/file" ,configuration = MultipartSupportConfig.class)
public interface MicroCloudService {
    @RequestMapping(value = "/upload/single", produces = {MediaType.APPLICATION_JSON_UTF8_VALUE}, method = RequestMethod.POST, consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
    ResponseResult uploadFileSingle(@RequestPart("file") MultipartFile file, @RequestParam("userId") Integer userId, @RequestParam("type") Integer type);
}

 

import feign.RequestInterceptor;
import feign.RequestTemplate;
import feign.codec.Encoder;
import feign.form.spring.SpringFormEncoder;
import org.springframework.beans.factory.ObjectFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.http.HttpMessageConverters;
import org.springframework.cloud.client.loadbalancer.LoadBalanced;
import org.springframework.cloud.openfeign.support.SpringEncoder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @version V1.0
 * @ClassName:MultipartSupportConfig
 * @author: hbj
 * @CreateDate:2018/8/27 19:34
 * @Description: feign传输请求头里面的内容给其他的服务,传输文件的配置
 */
@Configuration
public class MultipartSupportConfig  implements RequestInterceptor {

    /**
     *
     * @Title: 传输文件的配置
     * @Description: 1, 传输文件的配置
     * @param:
     *            description
     * @return:
     * @auther: hbj
     * @date: 2018/8/29 17:10
     */
    @Autowired
    private ObjectFactory messageConverters;

    @Bean
    public Encoder feignFormEncoder() {
        return new SpringFormEncoder(new SpringEncoder(messageConverters));
    }

}

被调用方:

 

 @PostMapping("/upload/single")
    public ResponseResult uploadFileSingle(@RequestPart("file") MultipartFile multipartFile, @RequestParam("userId") Integer userId, @RequestParam("type") Integer type){
        FileInfoBO fileInfoBO = new FileInfoBO();
        fileInfoBO.setCreateBy(userId);
        fileInfoBO.setFile(multipartFile);
        ResponseResult responseResult = attachmentService.uploadFileSingle(fileInfoBO,type);
        return responseResult;
    }

2.使用RestTemplate

涉及到文件之间的传输的时候,需要新建一个临时文件(File),后期还要删除,处理起来比较麻烦,所以改用第三种

3.使用OKHttp

调用方:

 @Override
    public ResponseResult invokeService(MultipartFile multipartFile, Integer userId, Integer type) {
        String result = "";
        String fileName = multipartFile.getOriginalFilename();
        try {
            InputStream inputStream = multipartFile.getInputStream();
            result = HttpClient.post("http://127.0.0.1:8081/attachment/file/upload/single")
                    .param("file",inputStream,fileName)
                    .param("userId", String.valueOf(userId))
                    .param("type", String.valueOf(type))
                    .asString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(result);
        return null;
    }

 关于文件上传服务的代码,请点击GITHUB文件服务地址

代码尚有不足,请多指教!

 

你可能感兴趣的:(SpringCloud,SpringBoot)