Feign 是一种声明式、模板化的 HTTP 客户端(仅在 consumer 中使用)


1.server端(定义pojo与接口API)
注意:
1.get方式不能传递对象必须将参数进行拆分处理,因为feign默认使用的httpURLConnection进行consumer与propertie之间请求的处理
2.get方式必须使用@RequestParam注解
3.post方式传递对象时必须使用@RequestBody注解
4.请求的url可以随便写,只要不重复就好,因为这里的url应用于consumer与provider之间的内部通信
@RequestMapping("/item")
public interface ItemService {
//无参
@GetMapping("/list")
List<Item> findItemList();
//单个参数
@GetMapping("/find")
Item findItemByItemId(@RequestParam("itemId")Integer itemId);
//传递对象 get方式
@GetMapping("/add")
String addItem(@RequestParam("itemId") Integer itemId,@RequestParam("itemName") String itemName);
//传递对象 post方式
@PostMapping("/add2")
String addItem2(@RequestBody Item item);
}
2.provider端(用来实现Server端定义的接口,需依赖server端)
注意:在使用post方式传递对象时需要加上@RequestBody注解
@RestController
public class ItemController implements ItemService {
//无参
@Override
public List<Item> findItemList() {
List<Item> list = new ArrayList<>();
list.add(new Item(1, "苹果手机"));
list.add(new Item(2, "华为手机"));
list.add(new Item(3, "三星手机"));
return list;
}
//单个参数
@Override
public Item findItemByItemId(Integer itemId) {
return new Item(itemId, "小米");
}
//get方式传递对象
@Override
public String addItem(Integer itemId, String itemName) {
return "添加商品Ok";
}
//post方式传递对象
@Override
public String addItem2(@RequestBody Item item) {
return "添加商品Ok";
}
}
application.properties
spring.application.name=feign-provider
server.port=9001
eureka.client.service-url.defaultZone=http://root:root@eureka1:8761/eureka/,http://root:root@eureka2:8761/eureka/
启动器
@SpringBootApplication
@EnableEurekaClient
public class FeignProviderApplication {
public static void main(String[] args) {
SpringApplication.run(FeignProviderApplication.class, args);
}
}
3.consumer(使用feign技术,需依赖server端)
feign坐标
Dalston.SR5版本
<!-- 添加 Feign 坐标 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
Greenwich.SR2版本
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
service
@FeignClient(name = "feign-provider")//name 服务端应用名称
//继承服务端接口
public interface ItemConsumerService extends ItemService {
}
Controller(这里的请求url用于和浏览器进行通信,请求方式根据前端请求来定)
@RestController
public class ItemController {
@Autowired
private ItemConsumerService itemConsumerService;
//无参
@GetMapping("/list")
public List<Item> getItemList(){
return itemConsumerService.findItemList();
}
//单个参数
@GetMapping("/find")
public Item findItem(Integer itemId){
return itemConsumerService.findItemByItemId(itemId);
}
//get方式 传递对象
@GetMapping("/add")
public String addItem(Item item){
return itemConsumerService.addItem(item.getItemId(), item.getItemName());
}
//post方式传递对象
@GetMapping("/add2")
public String addItem2(Item item){
return itemConsumerService.addItem2(item);
}
}
启动器(必须加上@EnableDiscoveryClient与@EnableFeignClients注解)
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients
public class FeignConsumerApplication {
public static void main(String[] args) {
SpringApplication.run(FeignConsumerApplication.class, args);
}
}
application.properties
spring.application.name=feign-consumer
server.port=6001
eureka.client.service-url.defaultZone=http://root:root@eureka1:8761/eureka/,http://root:root@eureka2:8761/eureka/