一个Demo
, 提供了开箱即用的服务注册中心, 以及三种不同的客户端连接方式.
客户端配置文件: application-client.yml 单注册中心配置文件: application-server.yml 多注册中心配置文件: application-server-ha-1.yml、application-server-ha-2.yml
@LoadBalanced
修饰RestTemplate
, 源码地址:LoadBalancerAnnotationController
- 使用
LoadBalancerClient
获取服务地址, 再调用RestTemplate
, 源码地址:LoadBalancerClientController
- 使用
Feign
框架做RPC
, 源码地址:FeignController
要使用Feign
提供的一个开源组件feign-form
.
在服务消费方配置SpringFormEncoder
即可.
@Configuration
@EnableFeignClients(basePackages = "moe.ahao")
@ConditionalOnProperty(name = "eureka.client.enabled", havingValue = "true")
public class FeignConfig {
@Autowired
private ObjectFactory<HttpMessageConverters> messageConverters;
@Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
}
@FeignClient(value = serverName)
public interface SimpleFeignClient {
@PostMapping(value = "/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
AjaxDTO formData(@RequestParam String param, @RequestParam String json, @RequestPart("file") MultipartFile file);
}
@RestController
public class FeignController {
@Autowired
private SimpleFeignClient feignClient;
@PostMapping(value = "/form-data3", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
public AjaxDTO formData(@RequestParam String param, @RequestParam String json, @RequestPart("file") MultipartFile file) {
return feignClient.formData(param, json, file);
}
}
有几个注意点
- 使用
form data
不能@RequestBody
和@RequestPart
一起用, 如果要上传文件, 只能老老实实的把所有参数写在Controller
上, 或者使用本解决方案. feign-form
的版本号一定要选对, 具体参考官方文档.@RequestPart(value = "file", required = false)
不生效#126
, 如果想要实现可选的文件上传, 需要重载方法@FeignClient(value = serverName) public interface SimpleFeignClient { @PostMapping(value = "/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) // 注意, 这里 body 的 required = false 并不生效 AjaxDTO formData(@RequestParam String param, @RequestParam String json, @RequestPart(value = "file", required = false) MultipartFile file); @PostMapping(value = "/form-data", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) AjaxDTO formData(@RequestParam String param, @RequestParam String json); }