OpenFeign 各种用法、 logger 日志记录
<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 日志记录的更多相关文章
- FastAPI logger日志记录方案 loguru模块
实现方式: 采用 loguru 模块.跟flask直接挂载到app上有区别,当然也可以尝试去这样做. 但是 好像没有这个必要.要的就是个快速.整那些子虚乌有的东西完全木有意义. 1.首先是去项目git ...
- PHP中错误与异常的日志记录用法分析
原文:http://www.jb51.net/article/89548.htm ----------------------------------------------------------- ...
- log4net--不可多得的开源日志记录组件
log4net--不可多得的开源日志记录组件 1 前奏 一直在用log4net日志工具,却没时间写个日志给大家分享一下这个工具,趁最近比较空些,好好分享一下这个工具. 2 说明 Log4net介绍就不 ...
- Java日志记录的5条规则
日志记录是在软件开发过程中常常需要考虑的关键因素. 当产品运行出错时,日志文件通常是我们进行错误分析的首要选择. 而且,在很多情况下,它们是我们手上唯一可以用来查明发生状况和问题根本原因的信息. 可见 ...
- 从壹开始前后端分离 [.netCore 不定期更新 ] 三十五║ 完美实现全局异常日志记录
缘起 哈喽我是不定期更新的日常,昨天群里小伙伴问到了记录日志,当然,以前我也挖过这个坑,后来一直没有来得及填上,也想着 swagger 一直又有错误信息展示的功能,就迟迟没有添加这个功能,不过昨天夜里 ...
- Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验
Net Core平台灵活简单的日志记录框架NLog+SqlServer初体验 前几天分享的"[Net Core平台灵活简单的日志记录框架NLog+Mysql组合初体验][http://www ...
- Python开发之日志记录模块:logging
1 引言 最近在开发一个应用软件,为方便调试和后期维护,在代码中添加了日志,用的是Python内置的logging模块,看了许多博主的博文,颇有所得.不得不说,有许多博主大牛总结得确实很好.似乎我再写 ...
- Python的日志记录-logging模块的使用
一.日志 1.1什么是日志 日志是跟踪软件运行时所发生的事件的一种方法,软件开发者在代码中调用日志函数,表明发生了特定的事件,事件由描述性消息描述,同时还包含事件的重要性,重要性也称为级别或严重性. ...
- 在SpringBoot中用SpringAOP实现日志记录功能
背景: 我需要在一个SpringBoot的项目中的每个controller加入一个日志记录,记录关于请求的一些信息. 代码类似于: logger.info(request.getRequestUrl( ...
- 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 中,执行该操作的另一种方法 ...
随机推荐
- 双指针:盛最多水的容器(4.18leetcode每日一题)
给你 n 个非负整数 a1,a2,...,an,每个数代表坐标中的一个点 (i, ai) .在坐标内画 n 条垂直线,垂直线 i 的两个端点分别为 (i, ai) 和 (i, 0).找出其中的两条线, ...
- CTA策略介绍
CTA策略更多的时候是一种投资方法,更准确的说,主要投资于衍生品的.比较系统化规则化的投资方法都可以称作CTA投资,它并不拘泥于量化或是主动,其具有相当的生命力,会长期存在. CTA策略的收入来源是多 ...
- 实例讲解Python 解析JSON实现主机管理
本文分享自华为云社区<Python 解析JSON实现主机管理>,作者: LyShark. JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,它以易 ...
- HDU 4787 GRE Revenge
Now Coach Pang is preparing for the Graduate Record Examinations as George did in 2011. At each day, ...
- MySQL日期查询
MySQL日期查询 1.今天 select * from 表名 where to_days(时间字段名) = to_days(now()); 2.昨天 SELECT * FROM 表名 WHERE T ...
- vmware虚拟机 linux 本地yum源,网卡配置ens33,防火墙selinux
1.挂载镜像文件,CentOS-7-x86_64-DVD-1804.iso,并且要处于连接状态 #光盘挂载至/mntmount /dev/sr0 /mnt #备份yum源文件cd /etc/yum.r ...
- Celery将任务分发到不同的队列,交给不同的Worker处理
https://docs.celeryq.dev/en/stable/userguide/routing.html#routing-tasks https://blog.csdn.net/wangle ...
- 【Python】【ChatGPT】本地部署ChatGPT学习记录
学习一下GPT项目的相关使用和部署 一.GPT4ALL模型 Github:https://github.com/nomic-ai/gpt4all GPT4ALL项目部署简易,但是在运行体验上一般,并且 ...
- 记一次 .NET某股票交易软件 灵异崩溃分析
一:背景 1. 讲故事 在dump分析的旅程中也会碰到一些让我无法解释的灵异现象,追过这个系列的朋友应该知道,上一篇我聊过 宇宙射线 导致的程序崩溃,后来我又发现了一例,而这一例恰恰是高铁的 列控连锁 ...
- git报错解决,warning: could not find UI helper 'git-credential-manager-ui'
在克隆远程代码时,可能遇到这样的报错 warning: could not find UI helper 'git-credential-manager-ui' 这样的报错经常会在我们换了一台电脑或者 ...