1. Linux 中的线程
原文:
长久以来,Linux 并没有线程的概念。Linux 中的线程是使用子进程模拟的。在 2.6 以前的版本,Linux 的线程是靠 pthread 库实现的,但是其只实现了 POSIX 中对线程定义的几条要求中的一条,相去甚远。
在 2.6 之后,task_struct 结构中增加了一个 tgid。这个数据结构上的变化使得 Linux 中的线程完整实现了 POSIX 的要求。
2. DDD、CQRS 与 EventSourcing
原文:
DDD 中的聚合和聚合根
聚合指的是一组内聚的实体和值对象。 聚合根指的就是这一组聚合的根对象。聚合之间的交互都必须通过聚合根进行,不能绕过聚合根直接和其下面的实体进行交互。
聚合与一致性
聚合内部要保证强一致性,聚合与聚合之间要保证最终一致性。
EventSourcing 是否适合互联网
大量的 log 数据和数据预热等问题存在,我不太认为 EventSourcing 适合互联网应用。当然这也只是我现阶段的看法。
3. Spring 4 新特性
用 Groovy DSL 配置 Spring Bean
原文:
Spring 4.0 引入了 Groovy DSL,但目前看还不是很完善,不推荐大规模使用。
4. Slf4J
Logger.error(String message, Object... args) args 中如果最后一个是 Throwable,且没有匹配到 {}
的话,便会打印出异常栈
5. CORS
原文: 简单的 demo:
Cross-origin resource sharing (CORS) is a W3C specification implemented by most browsers that allows you to specify in a flexible way what kind of cross domain requests are authorized, instead of using some less secured and less powerful hacks like IFrame or JSONP.
Spring 4.2 中增加了完善的 CORS 支持,既可以在 Controller 类级别和方法级别上进行配置,也可以进行全局配置。
类级别配置:
@CrossOrigin(maxAge = 3600)@RestController@RequestMapping("/account")public class AccountController { @CrossOrigin(origins = "http://domain2.com") @RequestMapping("/{id}") public Account retrieve(@PathVariable Long id) { // ... } @RequestMapping(method = RequestMethod.DELETE, value = "/{id}") public void remove(@PathVariable Long id) { // ... }}
全局配置:
@Configuration@EnableWebMvcpublic class WebConfig extends WebMvcConfigurerAdapter { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**") .allowedOrigins("http://domain2.com") .allowedMethods("PUT", "DELETE") .allowedHeaders("header1", "header2", "header3") .exposedHeaders("header1", "header2") .allowCredentials(false).maxAge(3600); }}
如果使用 Spring Boot,则可以使用下面的配置:
@Configurationpublic class MyConfiguration { @Bean public WebMvcConfigurer corsConfigurer() { return new WebMvcConfigurerAdapter() { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/api/**"); } }; }}
当使用 Spring Security 时,为了使 Spring Security 也支持 CORS,则需要基于 Filter 支持 CORS:
@Configurationpublic class MyConfiguration { @Bean public FilterRegistrationBean corsFilter() { UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); CorsConfiguration config = new CorsConfiguration(); config.setAllowCredentials(true); config.addAllowedOrigin("http://domain1.com"); config.addAllowedHeader("*"); config.addAllowedMethod("*"); source.registerCorsConfiguration("/**", config); FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source)); bean.setOrder(0); return bean; }}
说实话上面这些配置还是有些复杂