spring cloud alibaba openFeign 配置方式

390 阅读3分钟

1.前置准备

已经搭建起nacos 服务注册中心

有一个订单Order(order-service) 服务,两个库存Stock(stock-service) 服务

目录结构如下:

image.png

2.order-server 和 stock-service的依赖和属性配置文件

在最外侧的pom也就是sample-spring-cloud-alibaba-openfeign\pom.xml中导入依赖管理配置

<dependencyManagement>  
    <dependencies>  
        <dependency>  
            <groupId>org.springframework.boot</groupId>  
            <artifactId>spring-boot-starter-parent</artifactId>  
            <version>2.3.2.RELEASE</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
        <dependency>  
            <groupId>com.alibaba.cloud</groupId>  
            <artifactId>spring-cloud-alibaba-dependencies</artifactId>  
            <version>2.2.5.RELEASE</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
        <dependency>  
            <groupId>org.springframework.cloud</groupId>  
            <artifactId>spring-cloud-dependencies</artifactId>  
            <version>Hoxton.SR8</version>  
            <type>pom</type>  
            <scope>import</scope>  
        </dependency>  
    </dependencies>  
</dependencyManagement>

然后在order-service的 pom.xml中加入以下依赖

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
    </dependency>

<dependency>  
    <groupId>org.springframework.cloud</groupId>  
    <artifactId>spring-cloud-starter-openfeign</artifactId>  
</dependency>

</dependencies>

在stock-service的 pom.xml中加入以下依赖

<dependencies>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter</artifactId>  
    </dependency>  
    <dependency>  
        <groupId>org.springframework.boot</groupId>  
        <artifactId>spring-boot-starter-web</artifactId>  
    </dependency>  
  
    <dependency>  
        <groupId>com.alibaba.cloud</groupId>  
        <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>  
    </dependency>

</dependencies>

由于在外侧的pom.xml中已经带入了依赖管理,所以这个位置的版本号可以省略,其中spring-boot-starter,spring-boot-starter-web的版本号由spring-boot-starter-parent提供

spring-cloud-starter-alibaba-nacos-discovery和spring-cloud-starter-openfeign的版本由spring-cloud-alibaba-dependencies提供。

其中order-service 的application.properties内容如下

server.port=8080  
#你的服务名称  
spring.application.name=order-service  
#nacos的配置  
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848  
spring.cloud.nacos.discovery.username=nacos  
spring.cloud.nacos.discovery.password=nacos  
spring.cloud.nacos.discovery.namespace=public

stock-service 的application.properties内容如下

server.port=8091  
#nacos的相关配置  
spring.application.name=stock-service  
spring.cloud.nacos.discovery.server-addr=127.0.0.1:8848  
spring.cloud.nacos.discovery.username=nacos  
spring.cloud.nacos.discovery.password=nacos  
spring.cloud.nacos.discovery.namespace=public  
spring.cloud.nacos.discovery.ephemeral=false

3.使用feignClient

在stock-service 中,开发测试用的controller 方法

@RestController  
@RequestMapping("/stock")  
public class StockRestController {  
  
    @Value("${server.port}")  
    private String port;  
  
    @GetMapping("/submit")  
    public String submit() {  
        return "去庫存成功 : " + port;  
    }  
}

在order-service 中,开发调用stock-service的feignClient

@FeignClient(value = "stock-service", path = "/stock")  
public interface StockFeignClient {  
    @GetMapping("/submit")  
    String submit();  
}

发测试用的controller 方法

@RestController  
@RequestMapping("/order")  
public class OrderRestController {  
  
    @Autowired  
    private StockFeignClient stockFeignClient;  
  
    @GetMapping("/submit")  
    public String submit() {  
        String msg = stockFeignClient.submit();  
        return "下單成功 " + msg;  
    }  
}

此时目录结果如下:

image.png

完成后启动order-service(http://127.0.0.1:8080/order/submit) 后,成功从stock-service获取到返回值

image.png

4.feignClient日志配置

方式一:全局feignClient修改日志级别

@Configuration  
public class FeignConfiguration {  
     
    @Bean  
    public feign.Logger.Level feignLoggerLevel() {  
        return Logger.Level.*BASIC*;  
    }  
}

方式二:为某个feignClient 指定日志配置

FeignConfiguration的类上不需要带@Configuration注解

public class FeignConfiguration {  
     
    @Bean  
    public feign.Logger.Level feignLoggerLevel() {  
        return Logger.Level.BASIC;  
    }  
}

修改StockFeignClient , 在@FeignClient注解内添加configuration参数指定配置类

@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)  
public interface StockFeignClient {  
    @GetMapping("/submit")  
    String submit();  
}

方式三:在application.properties文件内修改对应服务的日志配置

feign.client.config.stock-service.logger-level=basic

以上三种方式,都需要在application.properties内加入 logging.level.com.riteny.feign=DEBUG

其中com.riteny.feign是你feignClient所在的路径

最后重启服务后调用接口,可以见到输出最基本的日志,也可以修改成其他,例如FULL去获得详细的日志

image.png

5.feignClient超时时间配置

方式一:全局feignClient修改超时时间配置

@Configuration  
public class FeignConfiguration {  
    @Bean  
    public Request.Options feignOptions() {  
        return new Request.Options(3000, 3000);  
    }  
}

方式二:为某个feignClient 指定超时时间配置

同样的,FeignConfiguration的类上不需要带@Configuration注解

public class FeignConfiguration {  
  
    @Bean  
    public Request.Options feignOptions() {  
        return new Request.Options(3000, 3000);  
    }  
}

修改StockFeignClient ,在@FeignClient注解内添加configuration参数指定配置类

@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)  
public interface StockFeignClient {  
    @GetMapping("/submit")  
    String submit();  
}

方式三:在application.properties文件内修改对应服务的日志配置

feign.client.config.stock-service.connect-timeout=3000  
feign.client.config.stock-service.read-timeout=3000

测试可以通过修改stock-service里面的接口,通过Thread.sleep 睡4秒,达到测试的效果

6.feignClient自定义拦截器

开发拦截器CustomInterceptor

public class CustomInterceptor implements RequestInterceptor {  
  
    @Override  
    public void apply(RequestTemplate requestTemplate) {  
        System.out.println("come into custom interceptor");  
    }  
}

方式一:全局添加feignClient 指定拦截器配置

@Configuration  
public class FeignConfiguration {  
    @Bean  
    public CustomInterceptor customInterceptor() {  
        return new CustomInterceptor();  
    }  
}

方式二:为某个feignClient 指定拦截器配置

同样的,FeignConfiguration的类上不需要带@Configuration注解

public class FeignConfiguration {  
    @Bean  
    public CustomInterceptor customInterceptor() {  
        return new CustomInterceptor();  
    }  
}

修改StockFeignClient ,在@FeignClient注解内添加configuration参数指定配置类

@FeignClient(value = "stock-service", path = "/stock", configuration = FeignConfiguration.class)  
public interface StockFeignClient {  
    @GetMapping("/submit")  
    String submit();  
}

方式三:在application.properties文件内为某个feignClient 指定拦截器配置

feign.client.config.stock-service.request-interceptors[0]=com.riteny.feign.interceptor.CustomInterceptor

修改完成后启动项目,可以见到拦截器输出正常

image.png

最后例子的项目结构如下:

image.png