Fegin
案例
//服务提供者:===================================
//controller:
@RestController
@RequestMapping("/provider")
public class ProviderController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById/{id}")
public User getUserById(@PathVariable Integer id){
return userService.getUserById(id);
}
}
}
//service & serviceImpl:
@Service
public class UserServiceImpl implements UserService {
@Override
public User getUserById(Integer id) {
return new User(id,"张三",18);
}
}
//服务消费者:===================================
//Controller:
@RestController
@RequestMapping(value = "/consumer")
public class ConsumerController {
@Autowired
private UserFeign userFeign;
@RequestMapping(value = "/getUserById/{id}")
public User getUserById(@PathVariable Integer id) {
return userFeign.getUserById(id);
}
}
//FeignClient:===================================
@FeignClient(value = "feign-provider")
@RequestMapping("/provider")
public interface UserFeign {
@RequestMapping("/getUserById/{id}") //拼接url,restful风格形式拼接传参
User getUserById(@PathVariable("id") Integer id);
}
注意的点:
1、服务提供者是正常的三层架构,服务消费者通过FeignClient调用服务提供者的服务
2、在FeignClient中,@FeignClient(value = "feign-provider")
要填写服务提供者在Eureka中服务的名称
3、当在浏览器输入http://localhost:端口号/consumer/getUserById/1
时,
- 发送请求到消费者,ConsumerController调用FeignClient
- Feign根据@FeignClient注解中的value值(“feign-provider”)确定要请求的服务提供者。
- Feign构建HTTP请求,请求的URL为"
http://feign-provider/provider/getUserById/1
",其中feign-provider是服务提供者的应用名称。 - 请求发送到服务提供者的ProviderController中的getUserById方法。
消费者通过Eureka注册自己,Feign利用Eureka进行服务发现,消费者通过Feign调用服务提供者,并返回结果。这种方式简化了服务之间的调用,并提供了动态的服务发现和负载均衡机制。
Feign参数传递的三种方式
restful传参 @PathVariable()
将参数id以restful风格拼接到路径中
@RequestMapping("/getUserById/{id}") //拼接url,restful风格形式拼接传参
User getUserById(@PathVariable("id") Integer id);
?传参 @RequestParam
【拼接?形式的url】
@RequestMapping("/deleteUserById") //拼接url, ?形式传参
User deleteUserById(@RequestParam("id") Integer id);
pojo参数传参 @RequestBody
将user对象以json字符串的形式传参
@RequestMapping("/addUser") //将user对象以json字符串的形式传参
User addUser(@RequestBody User user);
如果传输的参数是对象、Map时,需要用
@RequestBody
并且method = RequestMethod.POST