<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. 双指针:盛最多水的容器(4.18leetcode每日一题)

    给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...

  2. CTA策略介绍

    CTA策略更多的时候是一种投资方法,更准确的说,主要投资于衍生品的.比较系统化规则化的投资方法都可以称作CTA投资,它并不拘泥于量化或是主动,其具有相当的生命力,会长期存在. CTA策略的收入来源是多 ...

  3. 实例讲解Python 解析JSON实现主机管理

    本文分享自华为云社区<Python 解析JSON实现主机管理>,作者: LyShark. JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易 ...

  4. HDU 4787 GRE Revenge

    Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. At each day, ...

  5. MySQL日期查询

    MySQL日期查询 1.今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 2.昨天 SELECT * FROM 表名 WHERE T ...

  6. vmware虚拟机 linux 本地yum源,网卡配置ens33,防火墙selinux

    1.挂载镜像文件,CentOS-7-x86_64-DVD-1804.iso,并且要处于连接状态 #光盘挂载至/mntmount /dev/sr0 /mnt #备份yum源文件cd /etc/yum.r ...

  7. Celery将任务分发到不同的队列,交给不同的Worker处理

    https://docs.celeryq.dev/en/stable/userguide/routing.html#routing-tasks https://blog.csdn.net/wangle ...

  8. 【Python】【ChatGPT】本地部署ChatGPT学习记录

    学习一下GPT项目的相关使用和部署 一.GPT4ALL模型 Github:https://github.com/nomic-ai/gpt4all GPT4ALL项目部署简易,但是在运行体验上一般,并且 ...

  9. 记一次 .NET某股票交易软件 灵异崩溃分析

    一:背景 1. 讲故事 在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁 ...

  10. git报错解决,warning: could not find UI helper 'git-credential-manager-ui'

    在克隆远程代码时,可能遇到这样的报错 warning: could not find UI helper 'git-credential-manager-ui' 这样的报错经常会在我们换了一台电脑或者 ...