最后
针对最近很多人都在面试,我这边也整理了相当多的面试专题资料,也有其他大厂的面经。希望可以帮助到大家。
最新整理面试题
上述的面试题答案都整理成文档笔记。也还整理了一些面试资料&最新2021收集的一些大厂的面试真题
最新整理电子书
最新整理大厂面试文档
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
就个人而言,笔者更喜欢基于Logback和专用追加器的配置。它似乎比使用Filebeat代理更简单。除了必须部署其他服务外,Filebeat 还要求我们使用解析表达式,如Grok过滤器。使用Logback追加器时,不需要任何日志发送程序。这个追加器在项目LogstashJSON编码器中可用。开发人员可以通过在logback -spring.xml文件中声明netlogstash.logback.
appender.LogstashSocketAppender appender来为自己的应用程序启用它。我们还将讨论使用消息代理将数据发送到Logstash的替代方法。在我们即将讨论的示例中,将演示如何使用SpringAMQPAppender将日志事件发布到RabbitMQ交换消息。
在这种情况下,Logstash 将订阅该消息并使用已发布的消息。
1.使用LogstashTCPAppender
库logstash-logback-encoder可以提供3种类型的追加器一UDP、TCP和异步(Async)。TCP追加器是最常用的。值得一提的是,TCP追加器是异步的,所有的编码和通信都被委托给-一个线程。 除了追加器之外,该库还提供了一些编码器和布局,使开发人员能够以JSON格式记录日志。因为Spring Boot默认包含一个Logback 库,以及springoo-tarterweb,所以我们只需要为Maven的pom.xml 添加一个依赖项即可。
net .logstash. logback
logstash-logback-encoder
4.11
</ dependency>
下一步是在Logback配置文件中使用LogstashTCPAppender类定义追加器。每个TCP追加器都要求开发人员配置编码器。可以在LogstashEncoder和
LoggingEventCompositelsonEncoder之间做出选择。
LoggingEventCompositeJsonEncoder 可以为开发人员提供更大的灵活性。它由一个或多个映射到JSON输出的JSON提供程序组成。默认情况下,如果没有配置JSON提供程序,那么它不会按LogstashTCPAppender的方式工作。它默认包含若干个标准字段,如时间戳、版本、日志程序名称和堆栈跟踪等。此外,它还会添加来自映射诊断上下文(Mapped Diagnostic Context, MDC)的所有条目和上下文,当然,开发人员也可以通过将includeMde或includeContext属性中的一个设置为false来禁用它。
<appender name- “STASH”
class=“net .logstash. logback. appender。LogstashTcpSocketAppender”>
192.168.99.100:5000
<encode r
class="net. logstash. logback. encoder . Loggi ngEventCompositeJsonEncoder ">
“appName”: "order- service”
sthreadName />
现在再回来看一看我们的示例系统。开发人员仍然可以在同一个Git 存储库( htp:/ithb com/piomin/sample- spring-cloud-comm.git)和feign. with. discovery分支(
http:/ithb.co/pioin/saople-spring-cloudo comm/ree/feign. with _discovery) 找到该示例。笔者已根据第9.1节“微服务的最佳8志记录实践”中提出的建议在源代码中添加了一些日志记录条目。以下是order-service服务中POST方法的当前版本。笔者已经通过从rgsg4fjLoggeFactory调用getLogger方法将SLF4J上的Logback用作日志记录程序。
@PostMapping
public Order prepare (8RequestBody Order order): throws
JaonProcess ingException {
int price一0;
List products =
productClient. findByIds (order .getProductIds();
LOGGER. info (“Products found: 1”,mapper . writeValueAsString (products));
Customer customer 一
customerClient. findByIdWithAccounts (order. getCustomerId());
LOGGER. info (“Customer found: (}”, mapper . writeValueAsString (customer));
for (Product product : products)
price ± product .getPrice();
final int priceDiscounted = priceDiscount (price, customer) ;
LOGGER. info ("Discounted price: ()”,
mapper .writeValueAsString (Collect ions. singletonMap (“price”,
priceDiscounted))) :
Optional account = cus tomer .getAccounts() .stream() .filter(a - >
(a.getBalance() > priceDiscounted)) .findFirsto ;
if (account. isPresent() {
order.setAccountId (account.get() .getId()) :
order . setStatus (Orde rStatus。ACCEPTED) ;
order .setPrice (priceDiscounted) ;LOGGER. info ("Account found: { ”,
mapper .writevalueAsString (account.get))) :
F else
order.setStatus (OrderStatus。REJECTED) ;
LOGGER. info("Account not found: { F”,
mapper.writeValueAsstring (customer。getAccounts())) ;
}
return repository.add (order) ;
}
现在来看一看如图9.1所示的Kibana仪表板。它可以在htp://92. 168.99.100:5601处获得。在该仪表板中可以轻松发现和分析应用程序日志。在页面左侧的菜单中可以选择所需的索引名称(在图9.1的屏幕截图中标记为1)。日志统计信息显示在时间线图(标记为2).上。可以通过单击具体条或选择一组条来缩小搜索参数所采用的时间。给定时间段内的所有日志都显示在图表下方的面板上(标记为3)。
可以扩展每个条目以查看其详细信息。在详细的Table (表)视图中,我们可以看到诸如Elasticsearch索引(_ index) 的名称以及微服务的级别或名称(appName) 。大多数这些字段都已经通过
LoggingEventCompositeJsonEncoder设置。我们只定义了一个特定于应用程序的字段appName,如图9.2所示。
Kibana提供了搜索特定条目的强大功能。开发人员可以仅通过单击所选条目来定义过滤器,以便定义一组搜索条件。在图9.2中,可以看到如何使用传入的HTTP请求过滤掉所有条目。如前文所述,
org.springframework.web.filter.CommonsRequestIL oggingFilter类负责记录这些日志。我们刚刚定义了一个过滤器,其名称等于完全限定的日志记录器类名称。如图9.3所示是笔者的Kibana仪表板屏幕,它显示了仅由CommonsRequestI oggingiter生成的日志。
2.使用AMQP追加器和消息代理
使用SpringAMQP追加器和消息代理的配置比使用简单TCP追加器的方法要稍微复杂一些。首先,开发人员需要在本地计算机上启动消息代理。本书已经在第5章“使用Spring Cloud Config进行分布式配置”中详细介绍了此过程,其中还专门介绍了RabbitMQ, 以便使用Spring Cloud Bus重新加载动态配置。如果开发人员已在本地或作为Docker容器启动了RabitMQ实例,则可以继续进行配置。必须创建-个队列来发布传入事件,然后将其绑定到交换消息( Exchange)。要实现此目的,应该先登录Rabbit管理控制台,然后转到Queues (队列)部分。我们已经创建了一个名为q logstash 的队列,并且使用名称ex. logstash 定义了新的Exchange消息,如图9.4所示。对于所有示例微服务,队列都已经使用路由键值绑定到该Exchange消息。
在启动并配置了RabbitMQ的实例之后,即可开始在应用程序端集成。首先,开发人员必须在项目依赖项中包含spring bostarer-amqp,,以提供AMQP客户端和AMQP追加器的实现。
org. springframework. boot
spring-boot-starter-amqp</arti factId>
然后,唯一要做的就是使用Logback配置文件中的org. springframnework amp.rabit.logback. AmqpAppender类来定义追加器。需要设置的最重要的属性是RabbitMQ网络地址( host和port).已声明的交换消息名称( exchangeName )和路由键值( routingKeyPatterm),该键值必须和已声明交换消息绑定的键值之一匹配。与TCP追加器相比,这种方法的缺点是需要自己准备发送给Logstash的JSON消息。以下是order-service 服务的Logback配置的一个片段。
<appender name- “AMQP”
class=“org. springf ramework。amqp. rabbit。1 ogback . AmqpAppender”>
<1ayout>
spattern>
“time”: “8date{IS086011”,
“thread”; “'thread” ,
“level”: “号level”,
“class”: “%logger(36}”,
“message”:” tmessage"
总结
互联网大厂比较喜欢的人才特点:对技术有热情,强硬的技术基础实力;主动,善于团队协作,善于总结思考。无论是哪家公司,都很重视高并发高可用技术,重视基础,所以千万别小看任何知识。面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。其实我写了这么多,只是我自己的总结,并不一定适用于所有人,相信经过一些面试,大家都会有这些感触。
**另外本人还整理收藏了2021年多家公司面试知识点以及各种技术点整理 **
下面有部分截图希望能对大家有所帮助。
[外链图片转存中…(img-h2ebNMgP-1715267502530)]