释时所发生的情况是禁用了Spring

结果表明,SpringBoot与标准的SpringMVC并没有很好地结合在一起。@EnableWebMvc。添加注释时所发生的情况是禁用了Spring引导自动配置。

坏的部分(浪费了我几个小时)是,在没有指南,你可以找到明确声明。在…pringBoot自动添加它,但没有说明如果您遵循以前的经验并只添加注释,会发生什么情况。

事实上,由于这种自动禁用的自动配置而产生问题的人,正试图以各种方式解决这个问题。最常见的方法是保留@EnableWebMvc,但也扩展SpringBoot的WebMvcAutoConfiguration。喜。我找到他们后,我得到了这个想法,并实现了它的方式。然后意识到这样做是多余的,在浏览了SpringBoot的代码之后,看到自动配置类中的内部类有一个单行javadoc语句。

 

这回答了我的问题:Spring引导自动配置是否遗漏了EnableWebMvc的一些“特性”。它们扩展了提供EnableWebMvc的类,而不是镜像功能(我猜这是显而易见的),这是很好的。

当您想要自定义bean时,您应该做什么?与往常一样,扩展WebMvcConfigurerAdapter(用@Component)并进行自定义。

因此,具体问题的底线是:不要在Spring引导中使用@EnableWebMvc,只需将SpringWeb作为maven/Gradle依赖项,它就会自动配置。

这里的大图导致我在主配置类中添加了一个注释,详细说明了为什么@EnableWebMvc不应该放在那里。因此,自动配置魔法使我节省了很多工作,但我仍然添加了一行解释为什么没有什么东西。

那是因人们习惯于使用@EnableWebMvc。因此,最自然和最常见的做法是添加它,特别是如果您不知道Spring引导自动配置是如何工作的。他们将继续这样做,并在意识到应该删除它之前浪费几个小时(或者在扩展一系列引导类以达到同样的效果之前)。

在这种情况下,我的建议是:记录一个警告。并要求显式禁用自动配置以消除警告。我必须打开DEBUG来查看什么是自动配置的,然后研究一组类来检查必需的条件,以便了解情况。

SpringBoot的主要用例之一是JAR打包的Web应用程序。这就是大多数教程的用途,我猜这也是它的主要用途。因此,对于这个常见的用例,应该有特殊的处理--附加的日志记录和记录信息帮助人们通过自动配置的迷宫。

我不想被看作是“说教”Spring团队,他们在拥有良好的文档和直截了当的行为方面做了出色的工作。但在这种情况下,在多个子项目“碰撞”,它似乎可以改进。

什么是分布式缓存?一种在应用程序中“部署”的解决方案(通常是Web应用程序),它确保数据是从内存中加载的,而不是从磁盘加载的(这要慢得多),以提高性能和

响应时间。

https://greasyfork.org/sv/scripts?set=477831

如果要在一台机器上使用缓存,这看起来很容易--您只需从内存中的数据库(例如,一个Guava Cache实例)加载您最活跃的数据,然后从那里提供它。当必须在集群中工作时,这会变得更加复杂--例如,5个应用程序节点以循环的方式向用户提供请求。

每次通过对其中一台机器的请求更新数据时,都必须更新所有机器上的内存缓存。如果您只是在内存中加载所有数据,而不使其失效,那么缓存就不会是“一致的”--它将具有陈旧的值,而对不同应用程序节点的请求将有不同的结果,这是您肯定希望避免的。或者,您可以拥有一个具有大量内存的大型缓存服务器,但它可能会失效--这可能会破坏正常的运行,因此您可能希望在一个集群中至少有两台机器。

您可以以不同的方式获得分布式缓存。举几个例子:英菲尼斯erracotta/Ehcache、Hazelcast、Memcached、Redis、Cassandra、Elesticache(亚马逊)。前三个是特定于Java的(都符合JCache),但其余的可以在任何设置中使用。Cassandra最初并不打算成为缓存解决方案,但它可以很容易地作为缓存解决方案使用。

所有这些都有不同的配置和不同的选项,甚至不同的体系结构。例如,您可以使用*Terracotta服务器或对等八卦协议运行Ehcache。过程中的方法也适用于InfinispanandHazelcast.或者,您可以依赖云提供的服务,如ElestiCache,或者您可以设置您自己的memcached/redis/Cassandra服务器集群。由于网络开销,在应用程序节点上拥有缓存比拥有专用内存服务器(集群)稍微快一些。

https://www.douban.com/doulist/144578376/comments/

缓存是围绕键和值构造的--每个键都有一个缓存的条目。当您希望从数据库中加载某些内容时,首先检查缓存中是否有带有该键的条目(例如,基于数据库记录的ID)。如果缓存中存在密钥,则不执行数据库查询。

但是这些数据是如何“分布”的呢?同时在所有节点上加载所有数据是没有意义的,因为重复是对空间的浪费,保持缓存的一致性也是一个问题。大多数解决方案依特定的键时,它的散列将被计算出来(取决于缓存集群中的机器数量),缓存解决方案确切地知道相应的值位于哪台机器上。您可以在Wikipedia文章中阅读更多细节,但即使在从缓存集群中添加或删除节点(即存储缓存数据的计算机集群)时,这种方法也有效。

然后,在进行更新时,还会更新缓存条目,缓存解决方案会传播该条目,以使缓存一致。请注意,如果直接在数据库中进行手动更新,缓存将有陈旧的数据。

在应用程序级别上,您通常希望抽象与缓存的交互。最后,您将得到一个通用的“GET”方法,该方法检查缓存,然后才进入数据库。对于GET-by-id查询,这是正确的,但是缓存也可以应用于其他SELECT查询--您只需使用查询作为键,查询结果作为值。对于更新,它将类似地更新数据库和缓存。

https://www.jianshu.com/p/ee5464ffd4d5

有些框架提供了这些现成的抽象--像Hibernate这样的Orms有所谓的缓存提供程序,所以您只需要添加一个配置选项,上面写着“我想使用(二级)缓存”,您的ORM操作在访问数据库之前会自动咨询配置好的缓存提供程序。春有@Cacheable注释,它可以缓存方法调用,使用它们的参数作为键。其他框架和语言通常也有类似的东西。

一个重要的附加注意事项--您可能需要预加载缓存。在集群的新启动(例如,/网络故障/等等)系统填充缓存的速度可能很慢。因此,您可以在启动时运行一个批处理作业,从数据库中获取一些数据并将它们放入缓存中。

这听起来很简单,而且很好--基本设置涵盖了大多数情况。实际上,调整缓存配置要复杂一些。即使您成功地设置了一个集群(这在AWS中是很有挑战性的),您的缓存策略可能也不是那么简单。您必须回答几个可能很重要的问题--您希望您的缓存条目存活多少?你需要你的缓存有多大?元素应该如何过期(缓存驱逐策略)-最近使用最少、使用最少、先到先出?

这些选择听起来往往是武断的。您通常使用默认设置,而不必费心。但是你必须不断关注缓存统计数据,做性能测试,测量和调整。有时,单个配置选项会产生很大影响。

在测量方面有一个重要的注意事项--你不一定要缓存所有的东西。您可以这样开始,但结果可能是,对于某些类型的条目,您实际上是更好的没有缓存。通常情况下,这些文件被更新得太频繁,而不是经常读取,所以经常用它们来更新缓存是一种没有回报的开销。所以-测量,调整,重复。

分布式缓存几乎是Web应用程序的一个强制性组件。然而,我已经多次讨论了一个给定的系统是如何非常大,需要很多硬件,在那里所有的数据将适合我的笔记本电脑的内存。所以,令我惊讶的是,它还不是一个众所周知的概念。我希望我已经给出了一个简短的,但充分的概述的概念和各种选择。

上一篇:1.VSCode之编写Vue单文件组件时template标签报红


下一篇:VSCode 离线安装中文语言包