<spring-cloud-openfeign.version>2.2.6.RELEASE</spring-cloud-openfeign.version>
对应的SpringBoot
<version>2.3.0.RELEASE</version>

<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
<version>${spring-cloud-openfeign.version}</version>
<exclusions>
<exclusion>
<artifactId>archaius-core</artifactId>
<groupId>com.netflix.archaius</groupId>
</exclusion>
</exclusions>
</dependency>

如果不在同一个 Module 中,需要添加 MapperScan

@ComponentScan(basePackages = {"com.iron"})
@SpringBootApplication
@EnableFeignClients(basePackages = {"com.iron.his"})
@MapperScan(basePackages ={"com.iron.his.mapper"} ) -- 如果两个MapperScan 就需要 classpath: 改成 classpath*
public class DefaultApplication {
public static void main(String[] args) {
SpringApplication.run(VipSoftWebApplication.class, args);
}
}

日志记录

FeignConfig

package com.vipsoft.dingtalk.config;

import feign.Logger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; @Configuration
public class FeignConfig { /**
* Feign 的详细日志,配合yml使用
*logging:
* level:
* # feign 日志以什么级别监控哪个接口
* com.vipsoft.ecgreport.sehedule.service: debug
* @return
*/
@Bean
Logger.Level fegnLoggerLevel(){
return Logger.Level.FULL;
}
}

application.yml

server:
application:
name: VipSoft Dingtalk
port: 8080
servlet:
context-path: /dingtalk
tomcat:
basedir: ./logs/
background-processor-delay: 30
redirect-context-root: true
uri-encoding: UTF-8
accesslog:
enabled: true #为true时,上面的日期格式才有意义,否则就是写在一个文件里了
buffered: true
directory: ./logs
file-date-format: .yyyy-MM-dd
#pattern: '%h %l %u %t "%r" %s %b "%{Referer}i" "%{User-Agent}i" %D ms'
pattern: '%t %a %m %U %s %b %D ms'
prefix: access_log
rename-on-rotate: false
request-attributes-enabled: false
rotate: true
suffix: .log # 因为feign调试日志是debug级别输出,springboot默认的日志级别是info,所以feign的debug日志级别就不会输出
# logging.level=debug这样配置是对所有的日志级别进行配置
# 该场景只需要对feign接口进行debug配置,所以是这样配置logging.level.com.vipsoft.dingtalk.rpc=debug
logging:
level:
# feign 日志以什么级别监控哪个接口
com.vipsoft.dingtalk.rpc: debug dingtalk:
rebot-url: https://oapi.dingtalk.com

简单调用

//定义一个拦截器
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("AppId", "AppId");
requestTemplate.header("AppKey", "myuser1");
requestTemplate.header("AppSecret", "mypassword");
}
} //接口类
@Component
@FeignClient(name = "demo-feign",
url = "https://www.fastmock.site/mock/e5738f58a04967320a772f1d69aa4a41/mp/",
configuration = FeignInterceptor.class)
public interface IFeignTestService { @GetMapping(value = "/GetUser")
String getUser(@RequestBody String words); } //调用
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FeignTests {
Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private IFeignTestService feignTestService; @Test
void searchTest() {
String result = feignTestService.getUser("VipSoft");
logger.info(result); } }

OpenFeign 动态URL

//定义一个拦截器
public class FeignInterceptor implements RequestInterceptor {
@Override
public void apply(RequestTemplate requestTemplate) {
requestTemplate.header("AppId", "AppId");
requestTemplate.header("AppKey", "myuser1");
requestTemplate.header("AppSecret", "mypassword");
}
} //接口类
@Component
@FeignClient(name = "demo-feign",
url = "url必须有值,这里随便写,但不能为空",
configuration = FeignInterceptor.class)
public interface IFeignTestService { @PostMapping("/")
String getWebsite(URI uri, @RequestBody String words);
} //调用
@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class FeignTests {
Logger logger = LoggerFactory.getLogger(this.getClass()); @Autowired
private IFeignTestService feignTestService; @Test
void searchTest() {
String ss1 = feignTestService.getWebsite(new URI("https://www.fastmock.site/mock/e5738f58a04967320a772f1d69aa4a41/mp/GetUser"), "");
logger.error(ss1);
String ss2 = feignTestService.getWebsite(new URI("https://www.fastmock.site/mock/e5738f58a04967320a772f1d69aa4a41/mp/hospital"), "");
logger.error(ss2);
String ss3 = feignTestService.getWebsite(new URI("https://www.fastmock.site/mock/e5738f58a04967320a772f1d69aa4a41/mp/device"), "");
logger.error(ss3);
} }

OpenFeign  application/x-www-form-urlencoded

@Test
void queryOrderTest() {
MultiValueMap<String, Object> param = new LinkedMultiValueMap<>();
param.add("msg_type", "GUOGUO_QUERY_SEND_SERVICE_DETAIL");
param.add("logistic_provider_id", "123456");
param.add("data_digest", "def");
param.add("logistics_interface", "abc");
String result = cainiaoService.querySendServiceDetail(param);
logger.info(PojoUtil.pojoToJson(param));
logger.info(result);
} @Component
@FeignClient(name = "feign-cainiao", url = "${cainiao.url}")
public interface IFeignCainiaoService { /**
* 获取三期API接口
*
* @param bodyParam AppId、PageIndex、PageSize
* @return
*/
@PostMapping(headers = {"content-type=application/x-www-form-urlencoded"})
String querySendServiceDetail(@RequestBody MultiValueMap<String, Object> bodyParam);
}

OpenFeign 自定义配置

//接口类
@Component
@FeignClient(name = "demo-feign",
url = "url必须有值,这里随便写,但不能为空",
configuration = IFeignTestService.MultipartSupportConfig.class)
public interface IFeignTestService {
//写接口内部,这样可以高内聚
class MultipartSupportConfig { @Autowired
private ObjectFactory<HttpMessageConverters> messageConverters; @Bean
public Encoder feignFormEncoder() {
return new SpringFormEncoder(new SpringEncoder(messageConverters));
}
} @PostMapping("/")
String getWebsite(URI uri, @RequestBody String words);
}

传 Header、URL 参数

/**
* 发送预警信息
* @return
*/
@PostMapping(value = "/")
String sendMessage(@RequestHeader Map<String, Object> headerParam, @RequestBody RobotMessage param); /**
* 发送预警信息
* @return
*/
@PostMapping(value = "/robot/send")
String sendMessage(@RequestParam Map<String, Object> headerParam, @RequestBody RobotMessage param);

上传文件

@FeignClient(name = "vipsoft", url = "${api.url}")
public interface ICallbackFeignService {
/**
* 上传文件
*
* 注意: 使用openfeign传递参数含有文件类型时必须指定 consumes = MediaType.MULTIPART_FORM_DATA_VALUE*
* @return
*/
@PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
String upload(@RequestPart("file") MultipartFile file); } package com.vipsoft.web; import com.vipsoft.web.rpc.ICallbackFeignService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.mock.web.MockMultipartFile;
import org.springframework.web.multipart.MultipartFile; import java.io.File;
import java.io.FileInputStream; @SpringBootTest
public class AppCallbackTest { @Autowired
ICallbackFeignService appCallbackFeignService; @Test
void Upload() throws Exception { File file = new File("D:\\Users\\Desktop\\fanye.mp4");
//这里的第一个参数值 file 是对应上面feign的文件注解中的@RequestPar中的name。一定要对应上
MultipartFile multipartFile = new MockMultipartFile("file", file.getName(), "application/octet-stream;charset=utf-8", new FileInputStream(file));
appCallbackFeignService.upload(multipartFile);
}
}

OpenFeign 各种用法、 logger 日志记录的更多相关文章

  1. FastAPI logger日志记录方案 loguru模块

    实现方式: 采用 loguru 模块.跟flask直接挂载到app上有区别,当然也可以尝试去这样做. 但是 好像没有这个必要.要的就是个快速.整那些子虚乌有的东西完全木有意义. 1.首先是去项目git ...

  2. PHP中错误与异常的日志记录用法分析

    原文:http://www.jb51.net/article/89548.htm ----------------------------------------------------------- ...

  3. log4net--不可多得的开源日志记录组件

    log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...

  4. Java日志记录的5条规则

    日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见 ...

  5. 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录

    缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...

  6. Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验

    Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...

  7. Python开发之日志记录模块:logging

    1 引言 最近在开发一个应用软件,为方便调试和后期维护,在代码中添加了日志,用的是Python内置的logging模块,看了许多博主的博文,颇有所得.不得不说,有许多博主大牛总结得确实很好.似乎我再写 ...

  8. Python的日志记录-logging模块的使用

    一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...

  9. 在SpringBoot中用SpringAOP实现日志记录功能

    背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...

  10. EF Core使用SQL调用返回其他类型的查询 ASP.NET Core 2.0 使用NLog实现日志记录 CSS 3D transforms cSharp:use Activator.CreateInstance with an Interface? SqlHelper DBHelper C# Thread.Abort方法真的让线程停止了吗? 注意!你的Thread.Abort方法真

    EF Core使用SQL调用返回其他类型的查询   假设你想要 SQL 本身编写,而不使用 LINQ. 需要运行 SQL 查询中返回实体对象之外的内容. 在 EF Core 中,执行该操作的另一种方法 ...

随机推荐

  1. 一个java文件的JVM之旅

    准备 我是小C同学编写得一个java文件,如何实现我的功能呢?需要去JVM(Java Virtual Machine)这个地方旅行. 变身 我高高兴兴的来到JVM,想要开始JVM之旅,它确说:&quo ...

  2. windows11配置wsl2虚拟linux环境

    windows11配置wsl2虚拟linux环境 wsl( Windows Subsystem for Linux )是microsoft官方为windows开发的模拟Linux方法.避免了虚拟机vm ...

  3. JavaScript Date转字符串格式

    JavaScript Date转字符串格式

  4. 宏(define)与常量(const)

    既然选择了远方,便只顾风雨兼程. 宏(define) 一. 宏的理解   宏是一种批量处理的称谓.一般说来,宏是一种规则或模式,或称语法替换 ,用于说明某一特定输入(通常是字符串)如何根据预定义的规则 ...

  5. Python学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

    def SlowSnail(score): name = input('请输入姓名:') if score >= 90: grade = 'A' elif score >= 60: gra ...

  6. In 查询及其优化

      translator Afrikaans Albanian - shqipe Arabic - ‎‫العربية‬‎ Armenian - Հայերէն Azerbaijani - azərb ...

  7. Node01-简介与安装

    01. Node.js是什么? pNode.js是一个基于V8 JavaScript引擎的JavaScript运行时环境. 也就是说: Node.js基于V8引擎来执行JavaScript的代码. V ...

  8. 用友NC产品接口开发,通过轻易云数据集成平台快速调用

    通过用友NC产品的 UAP V63平台.插件相关处理.相关业务逻辑处理课程目标与要求课程内容课程目标与要求业务逻辑处理外部系统信息设置节点新建外部系统默认匹配规则:仅按对照表:外部系统数据与UAP.接 ...

  9. extern关键字的用法

    extern关键字的理解 extern是C/C++语言中的一个关键字,用于声明一个变量或函数具有外部链接性(external linkage),即这些变量或函数可以被其他文件访问. 在C/C++中,如 ...

  10. AutoCAD ObjectARX 二次开发(2020版)--4,使用ARX向导创建CAD二次开发项目(编程框架)--

    手动创建ObjectARX应用程序非常麻烦,在此步骤中,将介绍ObjectARX向导. 在这里,我们将使用ObjectARX向导创建我们的ObjectARX应用程序. 本节的程序的需求是,接收CAD用 ...