AWS 微服务spring boot

Spring Boot微服务

2017-10-28  本文已影响268人  鲁云飞_

Spring Boot微服务

SpringBoot揭秘:快速构建微服务体系

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

Why 微服务

微服务演变历程

Spring IoC

SpringBoot的工作机制

建立一个Spring Boot 应用

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

@SpringBootApplication

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
//对于Spring应用,重要的只有下面三个注解
@Configuration
@EnableAutoConfiguration
@ComponentScan

@Configuration

@EnableAutoConfiguration

EnableAutoConfiguration得以生效的关键组件关系图

其中最关键的要属@Import(EnableAutoConfigurationImportSelector.class),借助EnableAutoConfigurationImportSelector类,@EnableAutoConfiguration可以帮助SpringBoot应用将所有符合条件的@Configuration配置都加载到当前SpringBoot创建并使用的IoC容器
* EnableAutoConfigurationImportSelector类中使用了工具类SpringFactoriesLoader帮助进行智能自动配置,源码如下:

public class EnableAutoConfigurationImportSelector
      implements DeferredImportSelector, BeanClassLoaderAware, ResourceLoaderAware,
      BeanFactoryAware, EnvironmentAware, Ordered {
...

/**
   * Return the auto-configuration class names that should be considered. By default
   * this method will load candidates using {@link SpringFactoriesLoader} with
   * {@link #getSpringFactoriesLoaderFactoryClass()}.
   * @param metadata the source metadata
   * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation
   * attributes}
   * @return a list of candidate configurations
   */
  protected List<String> getCandidateConfigurations(AnnotationMetadata metadata,
          AnnotationAttributes attributes) {
      List<String> configurations = SpringFactoriesLoader.loadFactoryNames(
              getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader());
      Assert.notEmpty(configurations,
              "No auto configuration classes found in META-INF/spring.factories. If you "
                      + "are using a custom packaging, make sure that file is correct.");
      return configurations;
  }
}

  1. @EnableAutoConfiguration就是从classpath中搜寻所有META-INF/spring.factories
  2. 将spring.factories中key为org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的value通过反射实例化为对应的标注了@Configuration的JavaConfig形式的IoC容器配置类
  3. 汇总为一个并加载到IoC容器
    @EnableAutoConfiguration工作流程

@ComponentScan

@PropertySource @PropertySources

// >=Java8
@Configuration
@PropertySource("classpath:1.properties")
@PropertySource("classpath:2.properties")
@PropertySource("...")
public class XConfiguration{

    //这种方式不推荐了
    @Value("${mongodb.db}")
    private String defaultDb;

    //推荐这种方式
    @Autowired  
    Environment env;

    private void demo(){
    String mongodbUrl = env.getProperty("mongodb.url");  
    String defaultDb = env.getProperty("mongodb.db");
    }

    //如果properties中有${}占位符,需要加以下这段,才能让spring正确解析出${}中的值
    @Bean
    public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
    return new PropertySourcesPlaceholderConfigurer();
  }
}

//<Java8
@PropertySources({
    @PropertySource("classpath:1.properties"),
    @PropertySource("classpath:2.properties"),
    ...
})
public class XConfiguration{...}

@Import @ImportResource

<import resource="XXX.xml/>将多个分开的容器配置合到一个配置中

@Configuration
//@Import负责引入JavaConfig形式的配置
@Import(MockConfiguration.class)
//@ImportResource负责引入XML形式的配置
@ImportResource("classpath:spring-dubbo.xml")
public class XConfiguration{...}

SpringBoot启动过程

@SpringApplicationRunListener

public interface SpringApplicationRunListener {
    void started();
    void environmentPrepared(ConfigurableEnvironment environment);
    void contextPrepared(ConfigurableApplicationContext context);
    void contextLoaded(ConfigurableApplicationContext context);
    void finished(ConfigurableApplicationContext context, Throwable exception);

}
EventPublishingRunListener

@ApplicationListener

  1. 经验证,最新SpringBoot版本没有以下静态方法

    SpringApplication.addListeners(...) 或者 SpringApplication.setListeners(...)
    
  2. 在当前SpringBoot应用的classpath下的META-INF/spring.factories文件中进行如下配置

    org.springframework.context.=com.lyf.springboot.demo.DemoApplicationListener
    

@ApplicationContextInitializer

public class DemoApplicationContextInitializer implements ApplicationContextInitializer{
    @Override
    public void initialize(ConfigurableApplicationContext applicationContext) {
        // do whatever you want with applicationContext,
        // e.g. applicationContext.registerShutdownHook();
    }
}

CommandLineRunner

public interface CommandLineRunner {
    void run(String... args) throws Exception;
}
标注@org.springframework.core.annotation.Order
或
实现org.springframework.core.annotation.Order接口

spring-boot-starter

spring-boot-starter在Spring Boot生态中被称为Starter POMs。Starter POMs是一系列轻便的依赖包,是一套一站式的Spring相关技术解决方案。开发者在使用和整合模块时,不必再去搜寻样例代码中的依赖配置来复制使用,只需要引入对应的模块包即可,比如,开发Web应用时,就引入spring-boot-starter-web, 希望应用具备数据库访问能力的时候,那就引入spring-boot-starter-jdbc

spring-boot-starter-logging

为SpringBoot引入应用日志框架,以下选择一种,注意一定不要将这些完成同一目的的spring-boog-starter都引入

/application.properties
logging.level.root=debug

配置方式有两种
* 遵循logback约定,在classpath中使用自定义的logback.xml配置文件
* application.properties中使用logging.config配置项指向logback.xml配置文件
logging.config=/{some.path.you.defined}/logback.xml

spring-boot-starter-web

默认为jar包形式打包 传统war包形式
src/main/resources src/main/webapp
静态资源(css,js等): src/main/resources/static
模版文件(*.vm): src/main/resources/templates
默认为我们自动配置如下SpringMVC必要组件 定制方法
1.必要的ViewResolver, 比如ContentNegotiatingViewResolver,和BeanNameViewResolver
2. 将必要的Converter,GenericConverter和Formatter等bean注册到IoC容器
3. 添加一系列的HttpMessageConverter以便支持对Web请求和相应的类型转换
4.自动配置和注册MesasageCodesResolver
5.其他
1.在IoC容器中注册新的同类型的bean定义来替换
2. 直接提供一个基于WebMccConfigurerAdapter类型的bean定义来定制
3.甚至直接提供一个标注了@EnableWebMvc的@Configuration配置类来完全接管所有SpringMVC的相关配置,自己完全重新配置

spring.mvc.view.suffix=.jsp
```

    * 目录结构,由于tomcat硬编码的原因, 对目录结构有要求,webapp还是需要的

      ![目录结构](http:https://img.haomeiwen.com/i5748528/832609f7cd383a5e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

打包成可执行war

apply plugin: 'org.springframework.boot'
buildscript {
    dependencies {
        classpath("org.springframework.boot:spring-boot-gradle-plugin:1.4.2.RELEASE")
    }
}
buildscript {
    repositories {
        maven {
            name 'Aliyun Maven Repository'
            url 'http://maven.aliyun.com/nexus/content/groups/public'
        }
    }
}

spring-boot-starter-jdbc

传统方式 外部化方式
SQL分布在各项目中 SQL集中到一处管理,有利于DBA进行SQL审查
多个应用使用同一个数据库时,容易相互干扰,且数据库连接过多 统一调度
需要完整的软件交付链路支撑平台

spring-boot-starter-aop

spring-boot-starter-security

SpringSecurity核心概念示意图

HOLD进程

try {
            Thread.currentThread().join();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
上一篇下一篇

猜你喜欢

热点阅读