OpenFeign使用教程

一、OpenFeign 服务消费者pom坐标

<dependencies>
  	<!--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>
</dependencies>

二、服务提供者

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


//商品服务测试
@RestController
@Slf4j
@RequestMapping("/product")
public class ProductController {

    @RequestMapping("/{id}")
    public String product(@PathVariable("id") Integer id) throws InterruptedException {
        return "商品服务" + id;
    }
}

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


//库存服务测试
@RestController
@Slf4j
@RequestMapping("/stock")
public class StockController {
    //测试负载均衡器的调用
    @Value("${server.port}")
    public String port;

    @RequestMapping("/test")
    public String test() {
        return "库存服务提供" + port;
    }
}

三、服务消费者配置

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.openfeign.EnableFeignClients;

@SpringBootApplication 	//springboot启动注解
@EnableFeignClients 	//启用OpenFeign
@Slf4j
public class OrderApplication {
    public static void main(String[] args) {
        SpringApplication.run(OrderApplication.class,args);
        log.info("order启动了");
    }
}

3.3 服务消费者定义fegin接口

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

/*
* 与商品服务接口是一一对应的
* */
@FeignClient(name = "product-service",path = "/product")
public interface ProductFeignService {
    @RequestMapping("/{id}")
    String product(@PathVariable("id") Integer id);
}
/*
* 与库存服务接口是一一对应的
* */

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

/*
* name:微服务名称
* path:指的是接口所在的controller所指定的  @RequestMapping("/stock")
* */
@FeignClient(name = "stock-service",path = "/stock")
public interface StockFeignService {

    //声明需要调用的rest接口的方法
    @RequestMapping("/test")
    String test();
}
import com.cdd.order.feign.ProductFeignService;
import com.cdd.order.feign.StockFeignService;
import lombok.extern.slf4j.Slf4j;
import lombok.val;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;


//测试微服务 openFigen调用
@RestController
@Slf4j
@RequestMapping("/order")
public class OrderController {
    @Autowired
    StockFeignService stockFeignService;

    @Autowired
    ProductFeignService productFeignService;


    //openFeign测试
    @GetMapping("/test")
    public String OrderTest() {
        String result =  stockFeignService.reduct();
        val result1 = productFeignService.product(100);
        return result + "======" + result1;
    }
}

四、openFeign日志配置

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

4.1 全局配置

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

4.2 局部yml配置

# SpringBoot 默认的日志输出级别是Info
# 指定openfeign日志以什么级别监控在哪个模块展示(可多个)
logging:
    level:
        com.cdd.order.feign: debug
feign:
    client:
        config:
        	#商品服务 日志级别
            product-service:
                logger-level: FULL
            #库存服务 日志级别
            stock-service:
                logger-level: BASIC

五、openFeign超时时间配置

5.1 全局超时配置

@Configuration
public class FeignConfig {
	/*
    *   全局openFeign日志界别配置
    * */
    @Bean
    public Logger.Level feignLoggerLevel() {
        return Logger.Level.FULL;
    }

	/*
    *   全局的修改Feign的超时时间 (毫秒)
    *   connectTimeoutMillis    连接超时时间
    *   readTimeoutMillis       请求处理时间
    * */
    @Bean
    public Request.Options options() {
        return new Request.Options(5000,10000);
    }
}


5.2 局部yml超时配置

feign:
    client:
        config:
        	#商品服务 日志级别
            product-service:
                logger-level: FULL
                #Feign 请求超时时间 默认2s
                connect-timeout: 5000
                #Feign 请求处理超时时间  默认5s
                read-timeout: 3000
            #库存服务 日志级别
            stock-service:
                logger-level: BASIC
                #Feign 请求超时时间 默认2s
                connect-timeout: 5000
                #Feign 请求处理超时时间  默认5s
                read-timeout: 5000

六、openFeign拦截器配置

6.1 定义拦截器


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

public class FeignInterceptor implements RequestInterceptor {
    Logger logger = LoggerFactory.getLogger(this.getClass());
    @Override
    public void apply(RequestTemplate requestTemplate) {
        // ToDo  自己的业务逻辑
        logger.info("openFeign 拦截器");
        requestTemplate.header("token","123456");
    }
}

6.2 使用拦截器yml配置

feign:
    client:
        config:
        	#商品服务 日志级别
            product-service:
                logger-level: FULL
                #Feign 请求超时时间 默认2s
                connect-timeout: 5000
                #Feign 请求处理超时时间  默认5s
                read-timeout: 3000
                #设置自定义的拦截器 (数组可以是多个)
                request-interceptors[0]:
                    com.cdd.order.interceptor.FeignInterceptor
            #库存服务 日志级别
            stock-service:
                logger-level: BASIC
                #Feign 请求超时时间 默认2s
                connect-timeout: 5000
                #Feign 请求处理超时时间  默认5s
                read-timeout: 5000
                #设置自定义的拦截器 (数组可以是多个)
                request-interceptors[0]:
                    com.cdd.order.interceptor.FeignInterceptor
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值