Format's Notes

分享技术和生活


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

  • 搜索
close

SpringBoot源码分析之内置Servlet容器

发表于 2017-05-22   |   分类于 springboot   |     |   阅读次数

SpringBoot内置了Servlet容器,这样项目的发布、部署就不需要额外的Servlet容器,直接启动jar包即可。SpringBoot官方文档上有一个小章节内置servlet容器支持用于说明内置Servlet的相关问题。

在SpringBoot源码分析之SpringBoot的启动过程文章中我们了解到如果是Web程序,那么会构造AnnotationConfigEmbeddedWebApplicationContext类型的Spring容器,在SpringBoot源码分析之Spring容器的refresh过程文章中我们知道AnnotationConfigEmbeddedWebApplicationContext类型的Spring容器在refresh的过程中会在onRefresh方法中创建内置的Servlet容器。

接下来,我们分析一下内置的Servlet容器相关的知识点。

阅读全文 »

SpringBoot源码分析之条件注解的底层实现

发表于 2017-05-16   |   分类于 springboot   |     |   阅读次数

SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation)。比如@ConditionalOnBean、@ConditionalOnClass、@ConditionalOnExpression、@ConditionalOnMissingBean等。

条件注解存在的意义在于动态识别(也可以说是代码自动化执行)。比如@ConditionalOnClass会检查类加载器中是否存在对应的类,如果有的话被注解修饰的类就有资格被Spring容器所注册,否则会被skip。

比如FreemarkerAutoConfiguration这个自动化配置类的定义如下:

1
2
3
4
5
6
@Configuration
@ConditionalOnClass({ freemarker.template.Configuration.class,
FreeMarkerConfigurationFactory.class })
@AutoConfigureAfter(WebMvcAutoConfiguration.class)
@EnableConfigurationProperties(FreeMarkerProperties.class)
public class FreeMarkerAutoConfiguration

这个自动化配置类被@ConditionalOnClass条件注解修饰,这个条件注解存在的意义在于判断类加载器中是否存在freemarker.template.Configuration和FreeMarkerConfigurationFactory这两个类,如果都存在的话会在Spring容器中加载这个FreeMarkerAutoConfiguration配置类;否则不会加载。

阅读全文 »

SpringBoot源码分析之Spring容器的refresh过程

发表于 2017-05-10   |   分类于 springboot   |     |   阅读次数

上一篇文章中,我们分析了SpringBoot的启动过程:构造SpringApplication并调用它的run方法。其中构造SpringApplication的时候会初始化一些监听器和初始化器;run方法调用的过程中会有对应的监听器监听,并且会创建Spring容器。

Spring容器创建之后,会调用它的refresh方法,refresh的时候会做很多事情:比如完成配置类的解析、各种BeanFactoryPostProcessor和BeanPostProcessor的注册、国际化配置的初始化、web内置容器的构造等等。

我们来分析一下这个refresh过程。

阅读全文 »

SpringBoot源码分析之SpringBoot的启动过程

发表于 2017-04-30   |   分类于 springboot   |     |   阅读次数

SpringBoot的启动很简单,代码如下:

1
2
3
4
5
6
@SpringBootApplication
public class MyApplication {
public static void main(String[] args) {
SpringApplication.run(MyApplication.class, args);
}
}

从代码上可以看出,调用了SpringApplication的静态方法run。这个run方法会构造一个SpringApplication的实例,然后再调用这里实例的run方法就表示启动SpringBoot。

因此,想要分析SpringBoot的启动过程,我们需要熟悉SpringApplication的构造过程以及SpringApplication的run方法执行过程即可。

我们以上述这段代码为例,分析SpringBoot的启动过程。

阅读全文 »

记录自己理解的一些设计模式

发表于 2017-03-26   |   分类于 architecture   |     |   阅读次数

记录一下自己理解的一些设计模式,并尽量使用表达清楚的例子进行讲解。

阅读全文 »

SpringCloud网关服务zuul介绍

发表于 2017-02-22   |   分类于 springcloud   |     |   阅读次数

Zuul是Netflix开发的一款提供动态路由、监控、弹性、安全的网关服务。

使用Zuul网关服务带来的好处是统一向外系统提供REST API,并额外提供了权限控制、负载均衡等功能,并且这些功能是从原先的服务中抽离出来并单独存在的。

Zuul提供了不同类型的filter用于处理请求,这些filter可以让我们实现以下功能:

  1. 权限控制和安全性:可以识别认证需要的信息和拒绝不满足条件的请求
  2. 监控:监控请求信息
  3. 动态路由:根据需要动态地路由请求到后台的不同集群
  4. 压力测试
  5. 负载均衡
  6. 静态资源处理:直接在zuul处理静态资源的响应而不需要转发这些请求到内部集群中
阅读全文 »

SpringCloud使用Hystrix实现断路器

发表于 2017-02-19   |   分类于 springcloud   |     |   阅读次数

Hystrix是一个供分布式系统使用,提供延迟和容错功能,保证复杂的分布系统在面临不可避免的失败时,仍能有其弹性。

比如系统中有很多服务,当某些服务不稳定的时候,使用这些服务的用户线程将会阻塞,如果没有隔离机制,系统随时就有可能会挂掉,从而带来很大的风险。

SpringCloud使用Hystrix组件提供断路器、资源隔离与自我修复功能。下图表示服务B触发了断路器,阻止了级联失败。

image

阅读全文 »

Loadbalance的几种算法以及在ribbon中的使用

发表于 2017-01-29   |   分类于 springcloud   |     |   阅读次数

Load Balance负载均衡是用于解决一台机器(一个进程)无法解决所有请求而产生的一种算法。

像nginx可以使用负载均衡分配流量,ribbon为客户端提供负载均衡,dubbo服务调用里的负载均衡等等,很多地方都使用到了负载均衡。

使用负载均衡带来的好处很明显:

  1. 当集群里的1台或者多台服务器down的时候,剩余的没有down的服务器可以保证服务的继续使用
  2. 使用了更多的机器保证了机器的良性使用,不会由于某一高峰时刻导致系统cpu急剧上升

负载均衡有好几种实现策略,常见的有:

  1. 随机 (Random)
  2. 轮询 (RoundRobin)
  3. 一致性哈希 (ConsistentHash)
  4. 哈希 (Hash)
  5. 加权(Weighted)
阅读全文 »

2016总结

发表于 2017-01-01   |   分类于 总结   |     |   阅读次数
2016年总结
阅读全文 »

SpringBoot编写自定义的starter

发表于 2016-11-16   |   分类于 springboot   |     |   阅读次数

在之前的文章中,我们分析过SpringBoot内部的自动化配置原理和自动化配置注解开关原理。

我们先简单分析一下mybatis starter的编写,然后再编写自定义的starter。

mybatis中的autoconfigure模块中使用了一个叫做MybatisAutoConfiguration的自动化配置类。

这个MybatisAutoConfiguration需要在这些Condition条件下才会执行:

  1. @ConditionalOnClass({ SqlSessionFactory.class, SqlSessionFactoryBean.class })。需要SqlSessionFactory和SqlSessionFactoryBean在classpath中都存在
  2. @ConditionalOnBean(DataSource.class)。 spring factory中需要存在一个DataSource的bean
  3. @AutoConfigureAfter(DataSourceAutoConfiguration.class)。需要在DataSourceAutoConfiguration自动化配置之后进行配置,因为mybatis需要数据源的支持

同时在META-INF目录下有个spring.factories这个properties文件,而且它的key为org.springframework.boot.autoconfigure.EnableAutoConfiguration,这样才会被springboot加载:

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

有了这些东西之后,mybatis相关的配置会被自动加入到spring container中,只要在maven中加入starter即可:

<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.1.1</version>
</dependency>
阅读全文 »
1234…13
Format

Format

《深入理解Spring Cloud与实战》正式开始售卖啦!

122 日志
27 分类
65 标签
RSS
GitHub Twitter Weibo
友情链接
  • Vangoleo
© 2020 Format
由 Hexo 强力驱动
主题 - NexT.Pisces