Halo(十三)
Spring Boot Actuator 请求跟踪
Spring Boot Actuator 的关键特性是在应用程序里提供众多 Web 接口,
通过它们了解应用程序运行时的内部状况,且能监控和度量 Spring Boot 应用程序。
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
Spring Boot Actuator 默认会把最近100次的 HTTP 请求记录到内存中,对应的实现类是 InMemoryHttpTraceRepository。
使用
@Service
public class TraceService {
private final HttpTraceRepository httpTraceRepository;
public TraceServiceImpl(HttpTraceRepository httpTraceRepository) {
this.httpTraceRepository = httpTraceRepository;
}
public List<HttpTrace> listHttpTraces() {
return httpTraceRepository.findAll();
}
}
public final class HttpTrace {
private final Instant timestamp;
private volatile Principal principal;
private volatile Session session;
private final Request request;
private volatile Response response;
private volatile Long timeTaken;
}
Configuration FreeMarker配置
Configuration:
是一个存放应用级别(application level)公共配置信息,
以及模版(Template)可使用的全局共享变量的一个对象。
同时它还负责模版(Template)实例的创建以及缓存。
Configuration 实际上是 freemarker.template.Configuration 对象的实例,使用其构造函数创建。
通常应用使用一个共享的单实例 Configuration 对象。
Configuration 对象可被 Template 对象的方法使用,每一个模版实例都关联与一个 Configuration 实例,
它是通过 Template 的构造函数被关联进去的,通常是你使用这个方法来 Configuration.getTemplate 获得模版对象的。
共享变量:
共享变量是那些定义给所有模版(Template)使用的变量。
你可以通过 configuration 对象的 setSharedVariable 方法来添加共享变量。
所有与该 configuration 对象关联的模版实例都就可以通过获得 to_upper 转换器,company 来获得字符串,
因此你不需要再一次次的往 root 中添加这些变量了。如果你往 root 添加同名的变量,
那么你新添加的变量将会覆盖之前的共享变量。
private final Configuration configuration;
//设置共享变量
configuration.setSharedVariable(String name, Object value);
//获取模板
configuration.getTemplate(String name, String encoding);
//合并模板和数据模型
Template template = freeMarker.getConfiguration().getTemplate("common/web/rss.ftl");
String template_string = FreeMarkerTemplateUtils.processTemplateIntoString(template, model);
@Configuration
public class Configuration {
/**
* 配置 freemarker 模板文件路径
*
* Configuration 会被 Spirng Boot 自动注入到 Bean 容器中:
*
* @Bean
* public freemarker.template.Configuration freeMarkerConfiguration(FreeMarkerConfig configurer) {
* return configurer.getConfiguration();
* }
*/
@Bean
public FreeMarkerConfigurer freemarkerConfig() throws IOException, TemplateException {
FreeMarkerConfigurer configurer = new FreeMarkerConfigurer();
configurer.setTemplateLoaderPaths("file:///用户目录/.halo/templates/", "classpath:/templates/");
configurer.setDefaultEncoding("UTF-8");
Properties properties = new Properties();
properties.setProperty("auto_import", "/common/macro/common_macro.ftl as common,/common/macro/global_macro.ftl as global");
configurer.setFreemarkerSettings(properties);
//如果是线上环境就重新抛出异常,由全局异常处理来解决。
freemarker.template.Configuration configuration = configurer.createConfiguration();
if (判断是否是线上环境) {
//Freemarker抛出异常,则这个异常会被全局异常处理来解决。否则就会由Freemarker自己解决。
configuration.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
}
configurer.setConfiguration(configuration);
return configurer;
}
}
RestTemplate Spring便捷访问远程Http服务
-Get请求
在RestTemplate中通过如下两个方法进行调用
--第一种:getForEntity()函数
返回:ResponseEntity(对HTTP响应的封装,重要元素:HTTP请求状态的枚举对象HttpStatus,
HTTP请求头信息对象HttpHeaders,泛型的请求体对象)
例如:
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://USER-SERVICE
/user?name={1}", String.class, "ld");
String body = responseEntity.getBody();
解析:该请求是访问USER-SERVICE服务的/user请求,同时最后一个请求参数"ld"会替换url中的{1}的占位符,而返回的
ResponseEntity对象中的body内容会根据第二个参数转换成String类型
三个重载方法:
getForEntity(String url, Class<T> responseType, Object... uriVariables)
解析:url为请求地址,responseType为请求响应体body的包装类型,uriVariables为url中的参数绑定
注意:uriVariables是一个数组,所以他的顺序会对应url中占位符定义的数字的顺序
getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables)
解析:这里只有uriVariables这个参数不同,这里使用了Map类型,
注意:使用该方法进行参数绑定时需要在占位符中指定Map的key
例如:
RestTemplate restTemplate = new RestTemplate();
Map<String, String> params = new HashMap<>();
params.put("name","ld");
ResponseEntity<String> responseEntity = restTemplate.getForEntity("http://SERVICE-
USER/user?name={name}", String.class, params);
getForEntity(URI url, Class<T> responseType)
解析:该方法使用URI替换之前的url和urlVariables参数来指定访问地址和参数绑定。
例如:
RestTemplate restTemplate = new RestTemplate();
UriComponents uriComponenets = UriComponentsBuilder.fromUriString(
"http://USER-SERVICE/user?name={name}")
.build()
.expand("ld")
.encode();
URI uri = uriComponenets.toUri();
ResponseEntity<String> responseEntity = restTemplate.getForEntity(uri,
String.class).getBody();
--第二种:getForObject()函数
解析:它可以理解为getForEntity的进一步封装,它通过HttpMessageConverterExtractor对HTTP请求响应体body内容进行
对象转换,实现请求直接返回包装好的对象内容
例如:
RestTemplate restTemplate = new RestTemplate();
String result = restTemplate.getForObject(uri, String.class);
当body是一个User对象的时候,可以直接这样实现
RestTemplate restsTemplate = new RestTempalte();
User user = restTemplate.getForObject(uri, User.class);
使用场景:当不需要关注请求响应除body外的其他内容时,该函数就非常好用,可以少一个从Response中获取body的步骤。
三个重载方法:
1.getForObject(String url, Class<T> responseType, Object... uriVariables)
解析:url指定访问的地址,responseType指定访问的地址,urlVariables为url中占位符对应的参数
2.getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables)
解析:该函数使用Map类型的urlVariables替代上面数组形式的urlVariables,因此使用时在url中需要将占位符的
名称与Map类型中的Key一一对应设置
3.getForObject(URI url, Class<T> responseType)
解析:该方法使用URI对象来替换之前的url和urlVariabels参数使用
-Post请求
在RestTempalte中,对POST请求时可以通过如下三个方法进行调用
--第一种:postForEntity()函数
解析:该方法与Get请求中的getForEntity()函数类似,返回ResponseEntity<T>对象,其中T为请求响应的body类型。
例如:
RestTemplate restTemplate = new RestTempalte();
User user = new User("ld", 30);
ResponseEntity<String> responseEntity = restTemplate.postForEntity("http://USER-SERVICE/user",
user, String);
String body = responseEntity.getBody();
三个重载方法:
1.postForEntity(String url, Object request, Class<T> responseType, Object... uriVariables)
2.postForEntity(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
3.postForEntity(URI url, Object request, Class<T> responseType)
解析:重载函数中的uriVariables用来对url中的参数进行绑定,responseType参数是对请求响应的body内容的类型定
义
注意:新增的request参数,改参数可以是一个普通的对象,也可以是一个HttpEntity对象。
如果request是一个普通对象时,RestTemplate会将这个普通对象转换成HttpEntity对象来处理,其中Object就是
request的类型,request内容会被当成一个完整的body来处理;
如果resuqet是一个HttpEntity对象时,那么request会被当成一个完整的HTTP请求对象来处理,这个request中不
仅包含了body内容,也包含了header的内容
--第二种:postForObject()函数
解析:它简化了postForEntity()的后续处理,通过直接将请求响应的body内容包装陈对象来简化返回使用。
例如:
RestTemplate restTemplate = new RestTemplate();
User user = new User("ld", 20);
String postResult = restTemplate.postForObject("http[://USER-SERVICE/user", user, String.class);
三个重载方法:
postForObject(String url, Object request, Class<T> responseType, Object... uriVariables)
postForObject(String url, Object request, Class<T> responseType, Map<String, ?> uriVariables)
postForObject(URI url, Object request, Class<T> responseType)
--第三种:postForLocation()函数
解析:该函数实现了以post请求提交资源,并放回新资源的URI
例如:
User user = new User("ld", 40);
URI responseUri = restTemplate.postForLocation("http://USER-SERVICE/user", user);
三个重载方法:
postForLocation(String url, Object request, Object... uriVariables)
postForLocation(String url, Object request, Map<String, ?> uriVariables)
postForLocation(URI url, Object request)
解析:由于postForLocation函数会返回新资源的URI,该URI就相当于指定了放回类型,所以此方法实现的post请求不需
要像postforEntity和postForObject一样执行responseType。
其他参数用法相同
-Put请求
在RestTemplate中,对PUT请求可以通过put方法进行调用实现
例如:
RestTemplate restTemplate = new RestTemplate();
Long id = 100L;
User user = new User("ld", 40);
restTemplate.put("http://USER-SERVICE/user/{1}", user, id);
解析:put函数返回类型为void类型,所以没有返回内容,也就没有其他函数定义的responseType参数,除此之外的其他传入参数定义和
用法与postForObject基本一致。
-Delete请求
在RestTemplate中,对DELETE请求可以通过delete方法进行调用实现
例如:
RestTemplate restTemplate = new RestTemplate();
Long id = 100L;
restTemplate.delete("http://USER-SERVICE/user/{1}",id);
三个重载方法:
delete(String url, Object... urlVariables)
delete(String url, Map urlVariables)
delete(URI uri)
解析:由于我们在进行REST请求时,通常都将delete请求的唯一标识拼接在url中,所以delete请求也不需要requestType的body信
息,就如上面三个函数一样,非常简单。
url指定delete请求的位置,urlVariable绑定url中的参数即可。
RestTemplate 的配置项
1)setBufferRequestBody 是否是否缓冲流来存储请求体,默认true
2)setProxy 设置代理对象
3)setChunkSize 设置每次传输字节长度,与 setBufferRequestBody(false)结合使用
4)setConnectTimeout 设置连接超时时间,默认 -1
5)setReadTimeout 设置读取内容超时时间,默认 -1
6)setOutputStreaming 设置Connection是否设置输出流程
7)setTaskExecutor 设置异步回调执行器
Halo(十三)的更多相关文章
- CRL快速开发框架系列教程十三(嵌套查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- 我的MYSQL学习心得(十三) 权限管理
我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...
- WPF入门教程系列二十三——DataGrid示例(三)
DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...
- Java期末设计(十三周)
一.项目完成计划 十三周和十四周完成用户交互界面的设计(1.登陆界面2.订票以及查询界面3.用户管理界面4.退票界面): 十三周完成登陆界面,十四周完成订票以及查询界面,用户管理界面和 ...
- Bootstrap <基础二十三>页面标题(Page Header)
页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...
- Bootstrap<基础十三> 按钮组
按钮组允许多个按钮被堆叠在同一行上.当你想要把按钮对齐在一起时,这就显得非常有用.你可以通过Bootstrap 按钮(Button) 插件 添加可选的 JavaScript 单选框和复选框样式行为. ...
- AngularJs的UI组件ui-Bootstrap分享(十三)——Progressbar
进度条控件有两种指令,第一种是uib-progressbar指令,表示单一颜色和进度的一个进度条.第二种是uib-bar和uib-progress指令,表示多种颜色和多个进度组合而成的一个进度条. 这 ...
- 第十一&十二&十三周周记
周数 专业学习目标 专业学习时间 新增代码量 博客发表量 人文方面的学习 知识技能总结 第十一周 认真学习网络技术,了解路由器和交换机之间的联通和使用. 一天一小时 300 一篇 每天用一小时看关于经 ...
- JAVA EE的十三种技术
java ee 的十三中技术 一.jdbc 1). jdbc-odbc桥 2). jdbc-native 驱动桥 3). jdbc-network 桥 4). 纯java驱动 二. java命令和目录 ...
随机推荐
- [CSP-S模拟测试]:Reverse(模拟+暴力+剪枝)
题目描述 小$G$有一个长度为$n$的$01$串$T$,其中只有$T_S=1$,其余位置都是$0$.现在小$G$可以进行若干次以下操作: $\bullet$选择一个长度为K的连续子串($K$是给定的常 ...
- CSS动画之旋转魔方轮播
很久没有回头来复习CSS方面的知识了, 正好又到了月底写文章的deadline......所以这次选择了详细巩固一下CSS3动画有关的知识点,因为之前只是用过一些属性并没有深究细节. 在我自己写完这篇 ...
- python list,dic,json型字符串转为list,dict,json
import ast strr='{"1":"A","3":"B"}' dicts= ast.literal_eval( ...
- node中console自定义样式
最近公司的项目一直使用gulpfile打包,项目会有三种项目打包(生产环境)和监听(开发环境)两种过程,同时需要清除文件夹,希望打包时增加提示以便区分,暂时分为上述三种提示打包.监听.清除. 先上co ...
- Redis 基础及各数据类型对应的命令
Redis 命令文档 基本概念 安装及使用 可以在官网下载源码编译安装.对于 CentOS,还可以通过 yum install redis 安装. Redis 安装完成后,通过 redis-serve ...
- (appium+python)UI自动化_10_adb常用命令
前言 adb(Android Debug Bridge)工具是android-sdk里的一个工具,是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互.在app自动化测试过程中,有时要用到adb命 ...
- Yaconf – 一个高性能的配置管理扩展
鸟哥出品:http://www.laruence.com/2015/06/12/3051.html 首先说说, 这个是干啥的. 我见过很多的项目中, 用PHP文件做配置的, 一个config目录下可能 ...
- JavaScript高级程序设计(第3版) 第三章 (基本概念)
3.1 语法 1.不以数字开头的数字,字母,下划线,美元符号 2.注释:html <!-- --> css/**/ js单行// 多行/**/ 3.ES5 引入了严格模式(strict m ...
- mybatis全局配置mybatis-config.xml
大部分时候,我们都是在Spring 里面去集成MyBatis.因为Spring 对MyBatis 的一些操作进行的封装,我们不能直接看到它的本质,所以先看下不使用容器的时候,也就是编程的方式,MyBa ...
- Runnable、Callable、Future、FutureTask的区别
转自:https://blog.csdn.net/jdsjlzx/article/details/52912701 FutureTask既是Future.Runnable,又是包装了Callable( ...