一、Feign 是什么Feign 是 Spring Cloud 提供的一个声明式 HTTP 客户端用来简化微服务之间的远程调用。你只需要写一个接口加几个注解就能像调用本地方法一样调用远程服务它内部已经集成了 Ribbon自带负载均衡能力核心优势代码极度简洁不用手动拼接 URL、不用自己写 HTTP 请求自带负载均衡和 Ribbon 无缝集成支持轮询、随机等策略支持 Spring MVC 注解RequestMapping、RequestParam、PathVariable等都能用Feign 与 Ribbon / 负载均衡的关系Feign 内部默认集成了 Ribbon自带负载均衡能力你不需要手动给 RestTemplate 加LoadBalancedFeign 已经帮你做好了默认负载均衡策略是轮询也可以自定义策略二使用feign创建文件 四个工程创建接口feign_consumer在启动类 添加 EnableFeignClients 注解 扫描 Feign的注解 FeignClient(feign-provider)Autowiredprivate UserFeign userFeign; 只需要这一个就行在启动在访问 consumer的 路径就会跳转 common1和common2 的内容了三feign的原理1、EnableFeignClients开启feign注解的支持FeignClientsRegistrar.registerFeignClients()扫描被FeignClient标识的接口并生成代理类交给spring容器管理2、为接口方法创建requestTemplate当consumer调用feign的代理类时代理类会调用SynchronousMethodHandler.invoke()创建requestTemplate四、feign的传参方式1、传参RequestParam(sb)url?sb2502、restful传参PathVariable(sb)url/{sb}---url/2503、pojo传参RequestBodypojo---jsonfeign_consumerpackage com.yunkukukukuku.controller; import org.springframework.web.bind.annotation.*; RestController RequestMapping(/consumer) public class ConsumerController { Autowired private UserFeign userFeign; // Feign 客户端 //获取用户信息 {} 传参 RequestMapping(/getUserById/{id}) public User getUserById(PathVariable Integer id) { // 调用 Feign 客户端的方法获取用户信息 return userFeign.getUserById(id); } //restful 传参 RequestMapping(/getUserById2) public User getUserById2( User user) { return userFeign.getUserById2(user); } //? 传参 RequestMapping(/getUserById3) public User getUserById3(RequestParam(id) Integer id) { // 调用 Feign 客户端的方法获取用户信息 return userFeign.getUserById3(id); } //pojo 传参 RequestMapping(/getUserById4) public ListUser getUserById4() { ListUser userList new ArrayList(); ----- return userFeign.getUserById4(userList); } }feign_interfacepackage com.yunkukukukuku; import java.util.List; FeignClient(feign-provider) RequestMapping(/provider) public interface UserFeign { //获取用户信息 {} 传参 RequestMapping(/getUserById/{id}) public User getUserById(PathVariable(id) Integer id);//PathVariable 获取路径中的参数 //restful RequestMapping(/getUserById2) User getUserById2( RequestBody User user);//RequestBody 获取请求体中的参数 //? 传参 RequestMapping(/getUserById3) User getUserById3(RequestParam(id) Integer id);//RequestParam 获取路径中的参数 //pojo 传参 RequestMapping(/getUserById4) ListUser getUserById4(ListUser userList); }feign_provider_1 controllerpackage com.yunkukukukuku.controller; import java.util.List; RestController RequestMapping(/provider) public class ProviderController { Autowired private UserService userService; RequestMapping(/getUserById/{id}) public User getUserById(PathVariable Integer id) { return userService.getUserById(id); } //restful RequestMapping(/getUserById2) public User getUserById2(RequestBody User user) { return userService.getUserById2(user); } //? 传参 RequestMapping(/getUserById3) User getUserById3(RequestParam(id) Integer id) { return userService.getUserById3(id); } //pojo 传参 RequestMapping(/getUserById4) public ListUser getUserById4(ListUser userList) { return userService.getUserById4(userList); } }五补充坑 1对象参数传参报错你之前的 IllegalStateException问题Feign 默认会把对象参数当成RequestBody处理而你的 Provider 端是用 URL 查询参数接收解决Feign 接口的对象参数上必须加SpringQueryMap让它自动把对象展开成?id12namexxx格式的 URL 参数坑 2PathVariable不加参数名报错问题Feign 接口中PathVariable(id)必须指定参数名否则无法绑定路径变量解决必须写PathVariable(id)不能省略id坑 3RequestParam必须指定参数名问题Feign 接口中RequestParam(id)必须指定参数名否则会报错解决必须写RequestParam(id)不能省略id场景注解适用请求方式备注路径变量PathVariableGET路径中必须有{变量名}URL 查询参数单个RequestParamGET/POST必须指定参数名URL 查询参数对象SpringQueryMapGET/POST必须加此注解请求体 JSONRequestBodyPOST/PUT只能用 POST/PUT不能用 GET