zoukankan      html  css  js  c++  java
  • SpringCloudAlibaba项目之OpenFeign远程调用

    SpringCloudAlibaba随笔目录

    一、SpringCloudAlibaba项目之父工程搭建

    二、SpringCloudAlibaba项目之Nacos搭建及服务注册

    三、SpringCloudAlibaba项目之生产者与消费者

    四、SpringCloudAlibaba项目之Ribbon负载均衡

    五、SpringCloudAlibaba项目之OpenFeign远程调用

    六、SpringCloudAlibaba项目之Nacos-config配置中心

    七、SpringCloudAlibaba项目之Sentinel流量控制

    八、SpringCloudAlibaba项目之Seata分布式事务

    九、SpringCloudAlibaba项目之GateWay网关

    十、SpringCloudAlibaba项目之SkyWalking链路

    SpringCloudAlibaba项目之OpenFeign远程调用

    1、OpenFeign  

      OpenFeign是一种声明式、模板化的HTTP客户端。在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。

    2、Feign与OpenFeign的区别  

      Feign是Spring Cloud组件中一个轻量级RESTful的HTTP服务客户端,Feign内置了Ribbon,用来做客户端负载均衡,去调用服务注册中心的服务。Feign的使用方式是:使用Feign的注解定义接口,调用接口,就可以调用服务注册中心的服务。  

      OpenFeign是Spring Cloud在Feign的基础上支持了SpringMVC的注解,如@RequestMapping等等。OpenFeign的@FeignClient可以解析SpringMVC的@RequestMapping注解下的接口,并通过动态代理的方式产生实现类,实现类中做负载均衡并调用其他服务。

      说明:springcloud F 及F版本以上 springboot 2.0 以上基本上使用openfeign,openfeign 如果从框架结构上看就是2019年feign停更后出现版本,也可以说大多数新项目都用openfeign ,2018年以前的项目在使用 feign。

    3、快速使用

     

    pom.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <!-- 继承父工程版本依赖 -->
        <parent>
            <artifactId>spring-cloud-alibaba</artifactId>
            <groupId>com.qt</groupId>
            <version>1.0-SNAPSHOT</version>
        </parent>
    
        <modelVersion>4.0.0</modelVersion>
        <groupId>com.qt</groupId>
        <artifactId>service-openfeign</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>service-openfeign</name>
        <description>service-openfeign project</description>
    
        <dependencies>
            <!-- springweb 启动依赖 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <!-- nacos 服务注册发现(客户端)依赖 -->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
            </dependency>
            <!-- openfeign 远程调用依赖 -->
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-starter-openfeign</artifactId>
            </dependency>
            <!-- springboot 测试类 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
                <scope>test</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.junit.vintage</groupId>
                        <artifactId>junit-vintage-engine</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <version>3.8.1</version>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                        <encoding>UTF-8</encoding>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                    <version>2.3.7.RELEASE</version>
                    <configuration>
                        <mainClass>com.qt.serviceopenfeign.ServiceOpenfeignApplication</mainClass>
                    </configuration>
                    <executions>
                        <execution>
                            <id>repackage</id>
                            <goals>
                                <goal>repackage</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    </project>

    创建Openfeign服务接口

    /**
     * 库存服务接口
     * name:指定调用rest接口所对应的服务名
     * path:指定调用rest接口所在的StockController指定的@RequestMapping
     */
    @FeignClient(name = "service-stock",path = "stock")
    public interface StockOpenFeignService {
    
        //声明需要调用的rest接口对应的方法
        /**
         * 库存扣减
         * @return
         */
        @RequestMapping("/subStock")
        String subStock();
    
        /**
         * 库存新增
         * @return
         */
        @RequestMapping("/addStock")
        String addStock();
    }
    OrderController调用:
    /**
     * 订单服务
     */
    @RestController
    @RequestMapping("/order")
    public class OrderController {
    
        @Resource
        private StockOpenFeignService stockOpenFeignService;
    
        /**
         * 新增订单
         * @return
         */
        @RequestMapping("/addOrder")
        public String addOrder(){
            System.out.println("订单新增成功");
            //调用库存扣减
            String result = stockOpenFeignService.subStock();
            return "订单服务-订单新增成功:" + result;
        }
    }

    application.properties

    # 应用名称
    spring.application.name=service-openfeign
    # 应用服务 WEB 访问端口
    server.port=8060
    # Nacos帮助文档: https://nacos.io/zh-cn/docs/concepts.html
    # Nacos认证信息
    spring.cloud.nacos.discovery.username=nacos
    spring.cloud.nacos.discovery.password=nacos
    # Nacos 服务发现与注册配置,其中子属性 server-addr 指定 Nacos 服务器主机和端口
    spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848
    # 注册到 nacos 的指定 namespace,默认为 public
    spring.cloud.nacos.discovery.namespace=public

    访问地址:http://localhost:8060/order/addOrder

    4、日志配置

      有时候我们遇到bug,接口调用失败、参数没收到等问题,或者想看看调用性能,就需要配置OpenFeignde的日志了,以此让openFeign把请求信息输出来。

    OpenFeign提供了日志打印功能,我们可以通过配置来调整日恙级别,从而了解Feign 中 Http请求的细节。

    日志级别

    • NONE:默认的,不显示任何日志;
    • BASIC:仅记录请求方法、URL、响应状态码及执行时间;
    • HEADERS:除了BASIC中定义的信息之外,还有请求和响应的头信息;
    • FULL:除了HEADERS中定义的信息之外,还有请求和响应的正文及元数据;

     全局配置:

    操作步骤:

    • 在配置类中添加日志配置
    import feign.Logger;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    
    /**
     * 全局配置:当使用@Configuration 会将配置作用所有的服务提供方
     * 局部配置:如果只想针对某一个服务进行配置,就不要加@Configuration
     */
    @Configuration
    public class OpenFeignConfig {
    
        @Bean
         public Logger.Level feignLoggerLevel(){
             return Logger.Level.FULL;
         }
    }

    注:这里的logger是feign包里的

    • application.properties添加配置
    # openfeign配置包下(或指定哪些业务接口)以什么日志级别监听,springboot的默认日志级别是info,openFeign的日志级别debug就不会输出,所以需要加上此配置
    logging.level.com.qt.serviceopenfeign.openfeign=debug
    #
    logging.level.com.qt.serviceopenfeign.openfeign.StockOpenFeignService=debug

    日志输出效果:

    局部配置:

    方式1,直接在接口上指定

    /**
     * 库存服务接口
     * name:指定调用rest接口所对应的服务名
     * path:指定调用rest接口所在的StockController指定的@RequestMapping
     */
    @FeignClient(name = "service-stock",path = "stock",configuration = OpenFeignConfig.class)
    public interface StockOpenFeignService {
    
        //声明需要调用的rest接口对应的方法
        /**
         * 库存扣减
         * @return
         */
        @RequestMapping("/subStock")
        String subStock();
    
        /**
         * 库存新增
         * @return
         */
        @RequestMapping("/addStock")
        String addStock(@PathVariable("id") String id);
    }

    方式2,application.properties添加配置

    # openfeign日志局部配置
    feign.client.config.service-stock.loggerLevel=basic

     5、契约配置

    方式1,在OpenFeignConfig中添加配置类
    /**
     *全局配置:当使用@Configuration 会将配置作用所有的服务提供方
     * 局部配置:1、如果只想针对某一个服务进行配置,就不要加@Configuration
     *           2、配置文件
     */
    @Configuration
    public class OpenFeignConfig {
    
        /**
         * 日志配置
         * @return
         */
        /*@Bean
         public Logger.Level feignLoggerLevel(){
             return Logger.Level.FULL;
         }*/
    
         /**
         * 修改契约配置,支持Feign原生的注解
         * @return
         */
        @Bean
        public Contract feignContract(){
            return new Contract.Default();
        }
    }

    方式2,在配置文件中配置

    # openfeign日志局部配置
    feign.client.config.service-stock.loggerLevel=basic
    #设置为默认的契约 (还原成原生注解)
    feign.client.config.service-stock.contract=feign.Contract.Default

     修改StockOpenFeignService服务接口注解方式

    /**
     * 库存服务接口
     * name:指定调用rest接口所对应的服务名
     * path:指定调用rest接口所在的StockController指定的@RequestMapping
     */
    @FeignClient(name = "service-stock",path = "stock",configuration = OpenFeignConfig.class)
    public interface StockOpenFeignService {
    
        //声明需要调用的rest接口对应的方法
        /**
         * 库存扣减
         * @return
         */
        //@RequestMapping("/subStock")
        @RequestLine("GET /subStock") //feign的原生注解
        String subStock();
    
        /**
         * 库存新增
         * @return
         */
        //@RequestMapping("/addStock")
        @RequestLine("GET /addStock") //feign的原生注解
        //String addStock(@PathVariable("id") String id);
        String addStock(@Param("id") String id); //@PathVariable换成@Param
    }

     访问地址:http://localhost:8060/order/subOrder

     6、超时时间配置

     方式1,在OpenFeignConfig中添加配置类

    /**
     * 全局配置:当使用@Configuration 会将配置作用所有的服务提供方
     * 局部配置:1、如果只想针对某一个服务进行配置,就不要加@Configuration
     *         2、配置文件
     */
    @Configuration
    public class OpenFeignConfig {
    
        /**
         * 日志配置
         * @return
         */
        /*@Bean
         public Logger.Level feignLoggerLevel(){
             return Logger.Level.FULL;
         }*/
    
         /**
         * 修改契约配置,支持Feign原生的注解
         * @return
         */
        /*@Bean
        public Contract feignContract(){
            return new Contract.Default();
        }*/
    
        /**
         * 超时时间配置
         * @return
         */
        @Bean
        public Request.Options options(){
            return new Request.Options(5000,10000);
        }
    }

    方式2,配置文件修改

    application.properties添加配置

    #修改某个服务的默认超时时间
    # 配置 类别调用商品服务openfeign默认超时时间  默认连接超时和等待超时时间都是1s
    # 配置指定服务连接超时
    #feign.client.config.service-stock.connectTimeout=5000
    # 配置指定服务等待超时
    #feign.client.config.service-stock.readTimeout=5000
    
    #修改OpenFeign默认调用所有服务的默认超时时间
    # 配置openfeign默认超时时间  默认时间 单位毫秒
    feign.client.config.default.connectTimeout=5000
    feign.client.config.default.readTimeout=5000

     7、自定义拦截器

     

    自定义拦截器,CustomFeignInterceptor

    /**
     * 自定义feign拦截器
     */
    public class CustomFeignInterceptor implements RequestInterceptor {
    
        @Override
        public void apply(RequestTemplate requestTemplate) {
            //写一些自己的业务逻辑 带上token 什么之类的
            System.out.println("执行openFeign自定义拦截器");
            String access_token = UUID.randomUUID().toString();
            requestTemplate.header("Authorization",access_token);//设置认证
        }
    }
    全局配置
    如果写在配置类中,注入的形式则就是全局的拦截器,因为并没有指定是为具体服务进行配置。
    @Configuration
    public class OpenFeignConfig {
    
       
        /**
         * 自定义feign拦截器
         * @return
         */
        @Bean
        public CustomFeignInterceptor customFeignInterceptor() {
            return new CustomFeignInterceptor();
        }
    }

    配置文件,application.properties

    如果写在配置文件中指明了服务,则为具体的服务指定一个或者多个拦截器

    #在配置文件中设置feign拦截器
    feign.client.config.service-stock.requestInterceptors[0]=com.qt.serviceopenfeign.Interceptor.CustomFeignInterceptor

     

  • 相关阅读:
    vim常用命令
    re正则表达式
    time和datetime
    airtestpython连接airtest及生产报告
    Java中的监视器(monitor)是什么?
    CentOS6.9安装MySQL5.7
    CentOS6不能使用yum问题修复:Cannot find a valid baseurl for repo: base
    谁说BI是新兴的有前途的技术,说穿了,就是原来的报表系统
    Trained myself of Informatica 6.0 (part 2 Installation).
    开始看lcc编译器的实现。---跟.net暂时扯不上关系。
  • 原文地址:https://www.cnblogs.com/qiantao/p/15727108.html
Copyright © 2011-2022 走看看