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 中,执行该操作的另一种方法 ...
随机推荐
- rust程序设计(3)结构体相关概念和疑问
结构体 // 如何定义结构体 struct User { active: bool, username: String, email: String, sign_in_count: u64, } // ...
- 牛客多校第五场 K King of Range
题意: 给定一个\(n\)个数得序列\(a_i\),给定\(m\)个询问,每次给出一个\(k\),寻找有多少个区间\([l, r]\)中最大值与最小值之差严格大于\(k\). 思路: 可以发现,如果已 ...
- Python将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
def SlowSnail(n): while n != 1: # 循环保证递归 for index in range(2, n + 1): if n % index == 0: n //= inde ...
- 文心一言 VS 讯飞星火 VS chatgpt (151)-- 算法导论12.2 7题
七.用go语言,对于一棵有 n 个结点的二叉搜索树,有另一种方法来实现中序遍历,先调用 TREE-MINIMUM 找到这棵树中的最小元素,然后再调用 n-1 次的 TREE-SUCCESSOR.证明: ...
- out.print()
在学习过程中发现跟着视频打out.print报错 查阅资料知道 新建Java工程时,应选择Java Enterprise而非Java里的webapplication(Java Enterprise会自 ...
- RV1126 快速启动
一.硬件信息 RV1126/RV1109 系列芯⽚内置硬件解压缩模块 -- decom,可以极⼤得提升系统启动速度 RV1126/RV1109 内置⼀个 MCU,MCU 在 SoC 上电后就会快速启动 ...
- 开发期间flask运行方式(1.x和2.x区别)
1.x使用app.run(参数) 可以使用debug=True控制处于什么模式. app.run(host="127.0.0.1", port=5000, debug=True) ...
- 组合式api的使用方式
方式一:通过setup选项 <script> export default { setup(){ // 提供数据 // 提供函数 // 提供计算属性等等..... } } </scr ...
- python异步编程之asyncio初识
async await介绍 用asyncio提供的@asyncio.coroutine可以把一个生成器标记为协程类型,然后在协程内部用yield from 等待IO操作,让出cpu执行权. 然而异步的 ...
- Odoo16—国际化翻译
开发odoo系统模块的时候,如果一开始就有国际化的需求,无论是模型的定义还是视图的构建,建议使用英语作为第一语言:一方面,英语本身就是一种国际化的语言:另一方面,odoo内置模型字段描述如Create ...