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(十三)的更多相关文章

  1. CRL快速开发框架系列教程十三(嵌套查询)

    本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...

  2. 我的MYSQL学习心得(十三) 权限管理

    我的MYSQL学习心得(十三) 权限管理 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  3. WPF入门教程系列二十三——DataGrid示例(三)

    DataGrid的选择模式 默认情况下,DataGrid 的选择模式为“全行选择”,并且可以同时选择多行(如下图所示),我们可以通过SelectionMode 和SelectionUnit 属性来修改 ...

  4. Java期末设计(十三周)

    一.项目完成计划     十三周和十四周完成用户交互界面的设计(1.登陆界面2.订票以及查询界面3.用户管理界面4.退票界面):     十三周完成登陆界面,十四周完成订票以及查询界面,用户管理界面和 ...

  5. Bootstrap <基础二十三>页面标题(Page Header)

    页面标题(Page Header)是个不错的功能,它会在网页标题四周添加适当的间距.当一个网页中有多个标题且每个标题之间需要添加一定的间距时,页面标题这个功能就显得特别有用.如需使用页面标题(Page ...

  6. Bootstrap<基础十三> 按钮组

    按钮组允许多个按钮被堆叠在同一行上.当你想要把按钮对齐在一起时,这就显得非常有用.你可以通过Bootstrap 按钮(Button) 插件 添加可选的 JavaScript 单选框和复选框样式行为. ...

  7. AngularJs的UI组件ui-Bootstrap分享(十三)——Progressbar

    进度条控件有两种指令,第一种是uib-progressbar指令,表示单一颜色和进度的一个进度条.第二种是uib-bar和uib-progress指令,表示多种颜色和多个进度组合而成的一个进度条. 这 ...

  8. 第十一&十二&十三周周记

    周数 专业学习目标 专业学习时间 新增代码量 博客发表量 人文方面的学习 知识技能总结 第十一周 认真学习网络技术,了解路由器和交换机之间的联通和使用. 一天一小时 300 一篇 每天用一小时看关于经 ...

  9. JAVA EE的十三种技术

    java ee 的十三中技术 一.jdbc 1). jdbc-odbc桥 2). jdbc-native 驱动桥 3). jdbc-network 桥 4). 纯java驱动 二. java命令和目录 ...

随机推荐

  1. 【CDN+】Kafka 的初步认识与入门

    前言 项目中用到了Kafka 这种分布式消息队列来处理日志,本文将对Kafka的基本概念和原理做一些简要阐释 Kafka 的基本概念 官网解释: Kafka是最初由Linkedin公司开发,是一个分布 ...

  2. GitLab 安装,配置及维护

    参考: GitLab 官方文档 docker-gitlab,通过 docker-compose 快速安装 GitLab rake,是 Rails 的工具,类似 ruby 中常用的的 make.通过 R ...

  3. TCP 为什么是三次握手,而不是两次或四次?

    记得第一次看TCP握手连接的时候,有同样的疑问,我的疑问是,为何不是两次呢?后来随着对网络的理解深入,明白TCP报文是交由IP网络来负责运输,IP网络并不能保证TCP报文到达目的地,既然IP网络是指望 ...

  4. 腾达Tenda W311MA无线网卡Linux下驱动安装

    菜鸟看这里https://help.ubuntu.com/community/WifiD ... enda_W311M 最近也买了颗Tenda W311M网卡,简单说一下驱动的安装和hostapd做S ...

  5. linux点滴记录

    以下均为在Ubuntu下实践操作 更改DNS //编辑文件 - “/etc/resolv.conf”,打开“终端应用程序”-“附件” - “终端”,在终端里输入下面的命令: sudo nano /et ...

  6. 移动端web整理 移动端问题总结,移动web遇到的那些坑

    meta基础知识 H5页面窗口自动调整到设备宽度,并禁止用户缩放页面 忽略将页面中的数字识别为电话号码 忽略Android平台中对邮箱地址的识别 当网站添加到主屏幕快速启动方式,可隐藏地址栏,仅针对i ...

  7. Python入门习题2.蟒蛇绘制(turtle库)

    例2.调用turtle库中的若干函数来绘制蟒蛇,要求:(1)主体窗口宽650像素,高度350像素,窗口左侧与屏幕左侧像素距离200,窗口顶部与屏幕顶部像素距离200:(2)画笔落点在原点反向前进250 ...

  8. JAVA模拟Spring实现IoC过程(附源码)

    前言:本人大四学生,第一次写博客,如果有写得不好的地方,请大家多多指正 一.IoC(Inversion of Control)反转控制 传统开发都是需要对象就new,但这样做有几个问题: 效率低下,创 ...

  9. #python# 代理过程中遇到的error

    做一下总结 urllib.error.HTTPError: HTTP Error 503: Too many open connections TimeoutError: [WinError 1006 ...

  10. MapReduce工作流程及Shuffle原理概述

    引言: 虽然MapReduce计算框架简化了分布式程序设计,将所有的并行程序均需要关注的设计细节抽象成公共模块并交由系统实现,用户只需关注自己的应用程序的逻辑实现,提高了开发效率,但是开发如果对Map ...