1 引言

Feign可以帮助我们实现面向接口编程,就直接调用其他的服务,简化开发。
httpclient resttemplate

2 Feign的快速入门

client 客服端 消费者
导入依赖

  1. <dependency>
  2. <groupId>org.springframework.cloud</groupId>
  3. <artifactId>spring-cloud-starter-openfeign</artifactId>
  4. </dependency>

添加一个注解 cutomer

  1. @EnableFeignClients
  2. @FeignClient("SEARCH") // 指定服务名称
  3. public interface SearchClient {
  4. // value -> 目标服务的请求路径,method -> 映射请求方式
  5. @RequestMapping(value = "/search",method = RequestMethod.GET)
  6. String search();
  7. }

测试使用

  1. @Autowired
  2. private SearchClient searchClient;
  3. @GetMapping("/customer")
  4. public String customer(){
  5. String result = searchClient.search();
  6. return result;
  7. }

3 Feign的传递参数方式

注意事项

  • 如果你传递的参数,比较复杂时,默认会采用POST的请求方式。
  • 传递单个参数时,推荐使用@PathVariable。
  • 如果传递的单个参数比较多,这里也可以采用@RequestParam,不要省略value属性
  • 传递对象信息时,统一采用json的方式,添加@RequestBody
  • Client接口必须采用@RequestMapping

在Search模块下准备三个接口

  1. @GetMapping("/search/{id}")
  2. public Customer findById(@PathVariable Integer id){
  3. return new Customer(1,"张三",23);
  4. }
  5. @GetMapping("/getCustomer")
  6. public Customer getCustomer(@RequestParam Integer id,@RequestParam String name){
  7. return new Customer(id,name,23);
  8. }
  9. @PostMapping("/save")
  10. public Customer save(@RequestBody Customer customer){
  11. return customer;
  12. }

再封装feign接口

  1. @RequestMapping(value = "/search/{id}",method = RequestMethod.GET)
  2. Customer findById(@PathVariable(value = "id") Integer id);
  3. @RequestMapping(value = "/getCustomer",method = RequestMethod.GET)
  4. Customer getCustomer(@RequestParam(value = "id") Integer id, @RequestParam(value = "name") String name);
  5. @RequestMapping(value = "/save",method = RequestMethod.POST)
  6. Customer save(@RequestBody Customer customer);

封装Customer模块下的Controller

  1. @GetMapping("/customer/{id}")
  2. public Customer findById(@PathVariable Integer id){
  3. return searchClient.findById(id);
  4. }
  5. @GetMapping("/getCustomer")
  6. public Customer getCustomer(@RequestParam Integer id, @RequestParam String name){
  7. return searchClient.getCustomer(id,name);
  8. }
  9. @GetMapping("/save") // 会自动转换为POST请求 405
  10. public Customer save(Customer customer){
  11. return searchClient.save(customer);
  12. }

4 Feign的Fallback

Fallback可以帮助我们在使用Feign去调用另外一个服务时,如果出现了问题,走服务降级,返回一个错误数据,避免功能因为一个服务出现问题,全部失效。

4.1 FallBack方式

创建一个POJO类,实现Client接口。

  1. @Component
  2. public class SearchClientFallBack implements SearchClient {
  3. @Override
  4. public String search() {
  5. return "出现问题啦!!!";
  6. }
  7. @Override
  8. public Customer findById(Integer id) {
  9. return null;
  10. }
  11. @Override
  12. public Customer getCustomer(Integer id, String name) {
  13. return null;
  14. }
  15. @Override
  16. public Customer save(Customer customer) {
  17. return null;
  18. }
  19. }

服务间的调用-Feign - 图1

细节
image.png

不能添加我的requestmapping 注解,回报方法名已存在

在client添加yml配置

  1. feign:
  2. hystrix:
  3. enabled: true

4.2 FallBackFactory方式

调用方无法知道具体的错误信息是什么,通过FallBackFactory的方式去实现这个功能
FallBackFactory基于Fallback
创建一个POJO类,实现FallBackFactory

  1. import feign.hystrix.FallbackFactory;
  2. @Component
  3. public class SearchClientFallBackFactory implements FallbackFactory<SearchClient> {
  4. @Autowired
  5. private SearchClientFallBack searchClientFallBack;
  6. @Override
  7. public SearchClient create(Throwable throwable) {
  8. throwable.printStackTrace();
  9. return searchClientFallBack;
  10. }
  11. }

修改Client接口中的属性

  1. @FeignClient(value = "SEARCH",fallbackFactory = SearchClientFallBackFactory.class)

作业:
1、自我阐述cap 和base理论
2、实现robbin 集群
3、使用feign编写登录和注册