1、前言
之前学习过spring cloud、Feign那一套,Feign过段时间不用就忘记了如何使用,在此简单记录一下如何使用。
2、Feigen步骤
角色 : 服务提供者 | 服务消费者
服务提供者和服务消费者都需要导入feign的依赖、同时开启 @EnableFeignClients Feign注解
导入依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-feign</artifactId>
</dependency>
启动类开启注解
@SpringBootApplication
@EnableDiscoveryClient
@EnableFeignClients //开启Feign支持
public class ConsumerApplication {
}
Feign入门示例
服务**提供者**,和往常一样写自己的controller接口
@RestController
public class ProducerController {
@GetMapping("/get/{id}")
public String get(@PathVariable String id) {
return "hi,"+id;
}
@GetMapping("/getuser/{id}")
public User getUser(@PathVariable String id) {
System.out.println("getUser.....");
User user = new User();
user.setId(id);
user.setName("wangwu" + id);
return user;
}
@PostMapping("/postuser")
public User postUser(@RequestBody User user) {
System.out.println("postUser.....");
return user;
}
@GetMapping("/getuser2")
public User getUser2(User user) {
System.out.println("getUser2.....");
return user;
}
@GetMapping("/listAll")
public List<User> listAll(){
List<User> users = new ArrayList<User>();
users.add(new User("1","kevin1"));
users.add(new User("2","kevin2"));
users.add(new User("3","kevin3"));
return users;
}
}
服务**消费者**
创建声明一个Feign接口
//定义Feign客户端,value参数为provider的serviceName。name参数实际是value的别名
//@FeignClient("mima-cloud-producer")与@FeignClient(name="mima-cloud-producer")本质相同
//@FeignClient(url="")参数已经作废,必须使用name属性
//如果设置url属性, 则name属性则只代表Feign客户端的别名,而不代表服务端的serviceName
@FeignClient(name="mima-cloud-producer")
public interface FeignTestClient {
// 可以使用GetMapping组合注解,以前是不能使用的
@GetMapping(value = "/get/{id}")
// @PathVariable必须指定value,否则异常:PathVariable annotation was empty on param 0.
public String get(@PathVariable("id") String id);
@RequestMapping(value = "/getuser/{id}")
public User getUser(@PathVariable("id") String id);
// 调用远程的post方法,如果参数为复杂对象,就算指定了method=RequestMethod.GET,依然会使用post方式请求
// 远程的方法是get的时候就会失败,错误消息: status 405 reading FeignTestClient#getUser2(User); content:{"timestamp":1511326531240,"status":405,"error":"Method Not Allowed","exception":"org.springframework.web.HttpRequestMethodNotSupportedException","message":"Request method 'POST' not supported","path":"/getuser2"}
@RequestMapping(value = "/getuser2", method = RequestMethod.GET)
public User getUser2(User user);
// 调用远程的post方法,可以使用@RequestBody
@RequestMapping(value = "/postuser")
public User postUser(@RequestBody User user);
// 调用远程的post方法,可以不使用@RequestBody
@RequestMapping(value = "/postuser")
public User postUser2(User user);
// 调用远程的post方法,如果参数为复杂对象,就算指定了method=RequestMethod.GET,依然会使用post方式请求
// 远程的方法也是post的,所以可以调用成功
@RequestMapping(value = "/postuser", method = RequestMethod.GET)
public User postUser3(User user);
@GetMapping(value = "/listAll")
List<User> listAll();
}
FeignTestController——调用Feign客户端
@RestController
public class FeignTestController {
@Autowired
private FeignTestClient feignTestClient;
@GetMapping("/feign/get/{id}")
public String get(@PathVariable String id) {
String result = feignTestClient.get(id);
return result;
}
@GetMapping("/feign/getuser/{id}")
public User getUser(@PathVariable String id) {
User result = feignTestClient.getUser(id);
return result;
}
@GetMapping("/feign/getuser2")
public User getUser2(User user) {
User result = feignTestClient.getUser2(new User());
return result;
}
@GetMapping("/feign/listAll")
public List<User> listAll() {
return feignTestClient.listAll();
}
@PostMapping("/feign/postuser")
public User postUser(@RequestBody User user) {
User result = feignTestClient.postUser(user);
return result;
}
@PostMapping("/feign/postuser2")
public User postUser2(@RequestBody User user) {
User result = feignTestClient.postUser2(user);
return result;
}
@PostMapping("/feign/postuser3")
public User postUser3(@RequestBody User user) {
User result = feignTestClient.postUser3(user);
return result;
}
}