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);