SpringCloudAlibaba之整合openFeign

一.openFeign的入门使用(4步)

1.引入openFeign的依赖包,记得父项目中要加上SpringCloud依赖

        
            org.springframework.cloud
            spring-cloud-starter-openfeign
        

2.写一个openFeign的接口

  对应服务提供者的controller的代码。

package com.tulingxueyuan.order.feign;


import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "stock-nacos",path = "/stock")
public interface StockService {

    @RequestMapping("/getStock")
    String getStock();
}

3.在启动类上加入@EnableFeignClient

package com.tulingxueyuan.order;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;


@SpringBootApplication
@EnableFeignClients
public class OrderFeignApplication {

    public static void main(String[] args) {
        SpringApplication.run(OrderFeignApplication.class, args);
    }

}

4.在需要远程调用的地方注入service,发起调用,像调用本地方式一样调用远程服务

package com.tulingxueyuan.order.controller;

import com.tulingxueyuan.order.feign.StockService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

@RestController
@RequestMapping("/order")
public class OrderController {

    @Autowired
    private StockService stockService ;

    @RequestMapping("/getStock")
    public String getStock(){
        return stockService.getStock();
    }

}

二.Spring Cloud Feign的自定义配置及使用

1.日志配置

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

1)定义一个配置类,指定日志级别

   通过源码可以看到日志等级有 4 种,分别是:

 NONE【性能最佳,适用于生产】:不记录任何日志(默认值)。

 BASIC【适用于生产环境追踪问题】:仅记录请求方法、URL、响应状态代码以及 执行时间。

 HEADERS:记录BASIC级别的基础上,记录请求和响应的header。

 FULL【比较适用于开发及测试环境定位问题】:记录请求和响应的header、body 和元数据。

package com.tulingxueyuan.order.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration 
//  注意: 此处配置@Configuration注解就会全局生效,如果想指定对应微服务生效,就不能配置
public class FeignConfig {

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

2) 局部配置,让调用的微服务生效,在@FeignClient 注解中指定使用的配置类

   局部配置要将第一步的配置类中的@Configuration注解去掉

package com.tulingxueyuan.order.feign;


import com.tulingxueyuan.order.config.FeignConfig;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.RequestMapping;

@FeignClient(name = "stock-nacos",path = "/stock"
,configuration = FeignConfig.class)
public interface StockService {

    @RequestMapping("/getStock")
    String getStock();
}

3) 在yml配置文件中执行 Client 的日志级别才能正常输出日志,格式是"logging.level.feign接口包路径 =debug"   因为springboot中的默认日志级别是info,而feign的默认日志级别是debug

logging:
  level:
    com.tulingxueyuan.order: debug

ps:补充:局部配置可以在yml中配置 对应属性配置类:

feign:
  client:
    config:
      stock-nacos:
        loggerLevel: FULL

2 契约配置

SpringCloudAlibaba之整合openFeign_第1张图片

这样,可以使用feign原生的@RequestLine和@Param这些注解了(契约基本不会用到)

 SpringCloudAlibaba之整合openFeign_第2张图片

 3.超时时间配置

 主要配置connectTimeout(网络请求连接最大等待时间)和readTimeout(读取数据最大等待时间)

SpringCloudAlibaba之整合openFeign_第3张图片

 4.自定义拦截器

1)在核心配置文件中加入

requestInterceptors[0]: com.tulingxueyuan.order.intercepter.feign.MyInterceptor

SpringCloudAlibaba之整合openFeign_第4张图片

或者也可以使用全局的配置方法:

在配置类中加入一下代码

    @Bean
    public MyInterceptor myInterceptor(){
        return new MyInterceptor();
    }

2)实现RequestInterceptor 接口,重写apply方法

package com.tulingxueyuan.order.intercepter.feign;

import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

public class MyInterceptor implements RequestInterceptor {

    private Logger logger = LoggerFactory.getLogger(MyInterceptor.class);
    @Override
    public void apply(RequestTemplate requestTemplate) {
        requestTemplate.header("cafe","babe");
        logger.debug("hello {0} RequestInterceptor","malimalih");
    }
}

服务提供方可以通过 @RequestHeader获取请求参数。

你可能感兴趣的:(spring,boot,spring,java)