Openfein实现远程调用的方法(实操)
文章目录
- 环境准备
- 一、URL中接收参数
- 二、接收一个参数
- 三、接收多个参数
- 四、传递对象
- 五、传递JSON格式数据
环境准备
下面的配置,服务调用方加入即可。
- 依赖导入:
<!-- openfeign依赖--><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-starter-openfeign</artifactId></dependency>
- 开启Feign功能:
@EnableFeignClients //开启feign功能
@SpringBootApplication
public class OrderServiceApplication {public static void main(String[] args) {SpringApplication.run(OrderServiceApplication.class, args);}
}
- 创建Openfeign接口
//假定:被调用服务的名称为product-service,服务的接口路径统一为`product`开头
//path是可加 可不加的,value必须有,用于指定被调用服务
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {//path可以有可无,使用path,远程调用时,默认会加上path前缀路径
}
做足准备后,接下来我们就可以使用Openfeign来进行远程调用了。
一、URL中接收参数
- 假定这是服务提供方的接口:
@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/{productId}")public ProductInfo getProductInfoById(@PathVariable("productId") Integer productId){return productService.selectProductById(productId);}
}
- 定义Openfeign接口
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {//@PathVariable不可省略!把变量申明为url的一部分@RequestMapping("/{productId}")ProductInfo getProductInfo(@PathVariable("productId ") Integer productId);
}
我们发现实际上Openfeign接口的定义和服务提供方Controller接口的定义是非常相似的,这有助于我们去书写Openfeign接口。
- 通过Openfeign进行远程调用
order是服务调用方的一个接口,意思是查询orderId为1的订单信息。
二、接收一个参数
假定这是服务提供方接口(回显服务):
@RestController
@RequestMapping("/product")
public class ProductController {@RequestMapping("/p1")public String p1(Integer id){return "product-service 接收到参数, id:"+id;}
}
定义Openfeign接口:
//同样地,和服务提供方接口写法类似
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {@RequestMapping("/p1")String p1(@RequestParam("id")Integer id);//@RequestParam不可省略
}
然后我们写一个测试接口,用Openfeign去调用ProductController的p1方法:
@RestController
@RequestMapping("/feign")
public class FeignController {@Autowiredprivate ProductApi productApi;@RequestMapping("/o1")public String o1(Integer id){return productApi.p1(id);}
}
运行结果:
三、接收多个参数
假定这是服务提供方接口(回显服务):
@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/p2")public String p2(Integer id, String name){return "product-service 接收到参数, id:"+id+",name:"+name;}
}
定义Openfeign接口:
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {//同样地,@RequestParam都不能够省略@RequestMapping("/p2")String p2(@RequestParam("id")Integer id,@RequestParam("name") String name);
}
然后通过下面的测试接口调用Openfeign接口进行远程调用:
@RestController
@RequestMapping("/feign")
public class FeignController {@Autowiredprivate ProductApi productApi;@RequestMapping("/o2")public String o2(Integer id,String name){return productApi.p2(id,name);}
}
运行结果:
四、传递对象
假定这是服务提供方接口(回显服务):
@RestController
@RequestMapping("/product")
public class ProductController {@Autowiredprivate ProductService productService;@RequestMapping("/p3")public String p3(ProductInfo productInfo){return "product-service 接收到参数: productInfo"+productInfo.toString();}}
远程调用接口:
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {@RequestMapping("/p3")public String p3(@SpringQueryMap ProductInfo productInfo);}
@SpringQueryMap
会把Java对象的字段映射成HTTP 请求的查询参数,同样地,是不可省略的注解
通过Openfeign进行远程调用:
@RestController
@RequestMapping("/feign")
public class FeignController {@Autowiredprivate ProductApi productApi;@RequestMapping("/o3")public String o3(){ProductInfo productInfo=new ProductInfo();productInfo.setId(45);productInfo.setProductName("T恤");return productApi.p3(productInfo);}
}
运行结果:
五、传递JSON格式数据
假定这是我们的服务提供方(回显服务):
@RestController
@RequestMapping("/product")
public class ProductController {@RequestMapping("/p4")public String p4(@RequestBody ProductInfo productInfo){return "product-service 接收到参数: productInfo"+productInfo.toString();}}
定义Openfeign接口:
@FeignClient(value="product-service",path="/product")//FeignClient用于绑定需要调用的服务
public interface ProductApi {@RequestMapping("/p4")public String p4(@RequestBody ProductInfo productInfo);
}
@RequestBody
不可省略,表示接收json格式数据,并且转换成Java对象
通过下面的测试接口,实现远程调用:
@RestController
@RequestMapping("/feign")
public class FeignController {@Autowiredprivate ProductApi productApi;@RequestMapping("/o4")public String o4(){ProductInfo productInfo=new ProductInfo();productInfo.setId(45);productInfo.setProductName("T恤");return productApi.p4(productInfo);}
}
运行结果: