zoukankan      html  css  js  c++  java
  • 三、springcloud之服务调用Feign

    一、背景

     项目中接口调用:

    • Httpclient
    • Okhttp
    • Httpurlconnection
    • RestTemplate

    微服务提供了更简单,方便的Feign

    二、Feign简介

    • Feign是一个声明式的REST客户端,它的目的就是让REST调用更加简单。
    • Feign提供了HTTP请求的模板,通过编写简单的接口和插入注解,就可以定义好HTTP请求的参数、格式、地址等信息。
    • 而Feign则会完全代理HTTP请求,我们只需要像调用方法一样调用它就可以完成服务请求及相关处理。
    • SpringCloud对Feign进行了封装,使其支持SpringMVC标准注解和HttpMessageConverters。
    • Feign可以与Eureka和Ribbon组合使用以支持负载均衡。

    三、使用

    1.准备:  

      1.gradle:

    compile('org.springframework.cloud:spring-cloud-starter-feign')

      2.在应用主类中通过@EnableFeignClients注解开启Feign功能,具体如下: 

      @EnableFeignClients可以指定扫描的包。如@EnableFeignClients(com.test)

    @SpringBootApplication
    @EnableDiscoveryClient
    @EnableFeignClients
    public class MyApplication {
            
        public static void main(String[] args) {
            SpringApplication.run(MyApplication.class, args);
        }
    
    }

    2.绑定服务

         1.服务提供方提供接口

      2.消费方继承接口,添加注解

    @FeignClient(name = "微服务之间调用直接在name处输入服务名,其他rest需要指定url", url = "${yml配置文件url地址}", fallback = HystrixLawsFallback.class, configuration = MyFeignConfig.class)
    public interface ServiceClient {
    
        @RequestMapping(method = RequestMethod.GET, value = "/client/{id}")
        ClientVo getClient(@RequestParam("id") String id);
    }

      

    @FeignClient

      name/value:微服务之间调用直接在name处输入服务名,其他rest需要指定url,若是没有其他可以省略

          原有serviceId已废弃

      url:指定访问路径RequestMapping表明相对路径

      fallback:Feign熔断器回调

      configuration:可以让你自定义配置信息来覆盖Feign的默认配置

      value:表示你要消费哪个服务的接口

      path:就是统一的前缀

      该注解表示申明创建一个rest client bean,可以直接通过Autowired注入使用,如果ribbon在工程中启用,则会使用load balance进行后端请求调用,可以为FeignClient指定value表明需要访问的serviceId

    说明:

      fallback = HystrixServiceFallback.class为熔断返回处理

    @Component
    public class HystrixServiceFallback implements Client {
    
        @Override
        public ClientVo getClient(String id) {  
            ClientVo client = new FClientVo();
            client.setName(false);
            return client;
        }
        
    }

      configuration = MyFeignConfig.class配置日志输出

    @Configuration
    public class MyFeignConfig {
        @Bean
        Logger.Level feignLoggerLevel() {
            return Logger.Level.FULL;
        }
    }

    level级别:

    NONE:不记录任何信息

    BASIC:仅记录请求方法、URL以及响应状态码和执行时间

    HEADERS:BASIC信息加上请求和响应的头信息

    FULL:记录所有请求与响应的明细,包括头信息、请求体、元数据等。

    3.调用

      controller直接注入使用:

      @Autowired
        private ServiceClient serviceClient;
        
        @GetMapping("{id}")
        public ClientVo getClient(@PathVariable String id) throws Exception {
            ClientVo client = serviceClient.getClient(id);
            return client;
        }

    Feign的源码实现的过程:

    首先通过@EnableFeignCleints注解开启FeignCleint
    根据Feign的规则实现接口,并加@FeignCleint注解
    程序启动后,会进行包扫描,扫描所有的@ FeignCleint的注解的类,并将这些信息注入到ioc容器中。
    当接口的方法被调用,通过jdk的代理,来生成具体的RequesTemplate
    RequesTemplate在生成Request
    Request交给Client去处理,其中Client可以是HttpUrlConnection、HttpClient也可以是Okhttp
    最后Client被封装到LoadBalanceClient类,这个类结合类Ribbon做到了负载均衡。
  • 相关阅读:
    客户端性能优化
    session、cookie、token的区别
    java 动态代理模式(jdk和cglib)
    java 静态代理模式
    java ReentrantLock 公平锁 非公平锁 测试
    java ReentrantLock结合条件队列 实现生产者-消费者模式 以及ReentratLock和Synchronized对比
    VS2010 开发 VB6.0 activeX控件 dll
    C++CLI语法 在项目中的使用
    word 内容控件属性编辑
    VC调用静态库、动态库
  • 原文地址:https://www.cnblogs.com/soul-wonder/p/9200608.html
Copyright © 2011-2022 走看看