• 服务间的调用-Feign


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

    2 Feign的快速入门
    client 客服端 消费者
    导入依赖

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

    在启动类上添加注解
    :::tips
    @EnableFeignClients
    :::
    添加一个注解 cutomer

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

    测试使用

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


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

    在Search模块下准备三个接口

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


    再封装feign接口

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

    封装Customer模块下的Controller

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

    4 Feign的Fallback

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

    4.1 FallBack方式

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

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



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

    在client添加yml配置

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

    4.2 FallBackFactory方式

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

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

    修改Client接口中的属性

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

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

  • 相关阅读:
    【Arduino+ESP32专题】案例:编写Arduino类库
    Vue学习笔记 —— 使用Vue的ref实现动态添加活动类名
    中国移动云能力中心(苏小研)--秋招面经(已offer)
    JS数组方法总结
    compact unwind compressed function offset doesn‘t fit in 24 bits
    泛积木-低代码 使用攻略
    无法启动此程序,因为计算机中“找不到msvcp140.dll”的解决方法
    什么叫渗透测试爆破
    Intel HDSLB 高性能四层负载均衡器 — 基本原理和部署配置
    Zookeeper leader选举源码分析(超详细)
  • 原文地址:https://blog.csdn.net/yc_Cabbage/article/details/126394966