• 微服务技术方案:Spring Cloud 从入门到实战


    随着互联网技术的发展与不断创新,以及用户流量的不断增大,越来越多的企业项目面临大数据、高并发等问题,随之而来的就是通过分布式模型组建架构,微服务思想就集中体现了应用价值,2020 年的你还没有掌握微服务技术吗?

    本课程会讲解 Spring Cloud 的重要知识点同时也会跟随源码,与框架设计者共同探索其设计奥妙所在,做到知其然更知其所以然!

    实验介绍

    Spring Cloud 是一系列框架的有序集合。它利用 Spring Boot 的开发便利性巧妙地简化了分布式系统基础设施的开发。

    我们知道,Spring Cloud 整套微服务方案是基于 Spring Boot 作为架构制成的,那么 SpringBootApplication 启动类作为 Spring Boot 的项目起点,至关重要,本节就了解一下 SpringBootApplication。

    知识点

    • 自定义 SpringApplication
    • 配置 Spring Boot 源
    • SpringApplication 类型推断
    • Spring Boot 事件

    如何创建一个 Spring Boot 项目

    1. Spring 官网创建

    如图所示,在 官网 上快速搭建一个 Spring Boot 项目。

    我们可以看到上面可以选择构建工具、语言、Spring Boot 版本、group 和 artifact 以及依赖。这里我们依据上图所示的选项进行创建项目,点击 Generate Project。

    2. Maven 命令创建

    同样地,我们也可以使用命令在终端上创建一个项目:

    mvn archetype:generate -DgroupId=com.test -DartifactId=demo -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
    

    当我们将新创建后的项目结构展开就会得到:

    在我们的环境中已经为大家准备好项目包,同学们执行以下命令便可以把项目下载到 WebIDE 中了。

    wget https://labfile.oss.aliyuncs.com/courses/2502/demo.zip && unzip demo.zip
    

    建议同学们直接使用我们的安装包解压项目,如果使用命令创建项目的话,在接下来会讲解的一些类就需要同学们手动创建了。

    如果同学们不清楚详细的创建过程以及适配环境相关问题,可以先学习 Spring Boot 基础入门,因为 Spring Boot 是在 Spring 的基础上建立的。

    SpringApplication 的详细讲解

    实验之前,我们首先对新生成的 demo 项目对其做一个调整:将 .mvn 目录和 .gitignore 目录以及多余配置项删除(因为这些配置项目与本次实验无关),并对配置文件和 pom.xml 文件做一个修改:

    • 将 resources 资源目录下的 application.properties 文件修改为:
    # 声明开放端口号
    server.port = 8080
    # 声明项目名称
    spring.application.name = spring-application
    

    最终的效果如图所示:

    完成以上步骤配置,第一个 Spring Boot 项目的创建到这里就基本结束了,接下来我们分析一下 demo 项目中主函数代码,即在目录 com.example.demo 就可以查看到启动类 DemoApplication

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

    这就是最简化版本的 Spring Boot 启动类,这里有两个地方值得我们注意:

    一个是类 SpringApplication,另外一个是注解 @SpringBootApplication

    Q: 什么是 SpringApplication
    A: SpringApplication 是 Spring Boot 驱动 Spring 应用上下文的引导类。

    Q:怎么理解注解 @SpringBootApplication
    A:直接查看此注解的源码,源码如下:

    @SpringBootConfiguration
    @EnableAutoConfiguration
    @ComponentScan(excludeFilters = {
            @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
            @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
    public @interface SpringBootApplication {
        ...
    }
    

    这里有三个注解值得我们注意:

    1. @ComponentScan 是用于定义扫描的路径,从中找出标识了需要装配的类自动装配到 Spring 的 Bean 容器中。
    2. @EnableAutoConfiguration 是激活自动装配,用于自动载入应用程序所需的所有 Bean。
    3. @SpringBootConfiguration 用于标注当前类是配置类,并会将当前类内声明的一个或多个以 @bean 注解标记的方法的实例纳入到 Spring 容器中,它与 @Configuration,在功能上是一致的。

    Q: 如何理解 @Component 的“派生性”?
    A:@Component 是用来把普通 POJO(Plain Ordinary Java Object) 实例化到 Spring 容器中,相当于配置文件中的 <bean id="" class=""/>,通常我们将 @Component 称之为元注解。所谓的派生性指的是以元注解为基准,其他注解再次调用元注解而产生的派生。

    Spring 之注解编程模型

    回顾一下 Spring Boot 中常见的注解,诸如 @Service@Repository@Controller@Configuration。Spring 在设计的时候,都是引入了 @component 作为这些注解的元注解。

    @component:泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

    1. @Service:用于标注业务层组件。
    @Component
    public @interface Service {
            ...
    }
    
    1. @Repository:用于标注数据访问组件,即 DAO 组件。
    @Component
    public @interface Repository {
           ...
    }
    
    1. @Controller:用于标注控制层组件。
    @Component
    public @interface Controller {
           ...
    }
    
    1. @Configuration:允许通过调用同一类中的其他 @Bean 方法来定义 Bean 之间的依赖关系。
    @Component
    public @interface Configuration {
           ...
    }
    

    Q:关于 Spring 之模式注解(Stereotype Annotations)?
    A:所谓的模式注解:@component 逻辑上与 @Service@Repository@Controller@Configuration 都是一样,只是物理层面上不同,但都是为了找到 BeanDefinition。

    现在我们来分析一下,@SpringBootApplication 这个注解,下面是通过源码显示的调用关系:

    • @SpringBootApplication:引入了 @SpringBootConfiguration 注解。
    @SpringBootConfiguration
    public @interface SpringBootApplication {
            ...
    }
    
    • @SpringBootConfiguration:又引入了 @Configuration 注解。
    @Configuration
    public @interface SpringBootConfiguration {
            ...
    }
    
    • @Configuration:最终引入了 @Component 注解。
    @Component
    public @interface Configuration {
            ...
    }
    

    实际上注解 @SpringBootApplication 会标注当前一些功能。我们知道,注解不能像 Java 类一样继承,就通过以上的这样的方式层层调用。而注解的功能基本相似,我们就把注解的这种特性称之为派生性。

    SpringApplication 启动类的基本写法

    启动类 SpringApplication 就是 Spring Boot 应用的引导。

    1. 最简化的 SpringApplication(通过 Spring 官网通过脚手架下载的最简化的启动类):
    @SpringBootApplication
    public class DemoApplication {
            public static void main(String[] args) {
                    SpringApplication.run(DemoApplication.class, args);
            }
    }
    
    1. 通过 SpringApplication 增加参数的方式。现在我们在项目目录 com.test 创建 DemoApplication.java
    package com.test;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    @SpringBootApplication
    public class DemoApplication{
            public static void main(String[] args) {
                    SpringApplication springApplication = new SpringApplication(DemoApplication.class);
                    Map<String,Object> properties = new LinkedHashMap<>();
                    properties.put("server.port",0);
                    springApplication.setDefaultProperties(properties);
                    ConfigurableApplicationContext context = springApplication.run(args);
            }
    
    1. SpringApplicationBuilder 方式。现在我们在项目目录 com.test 创建 SpringBootEventApplication.java
    package com.test;
    
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    
    @SpringBootApplication
    public class SpringBootEventApplication{
            public static void main(String[] args) {
                    new SpringApplicationBuilder(SpringBootEventApplication.class) // Fluent API
                                // 单元测试是 PORT = RANDOM
                                .properties("server.port=0")  // 随机向 OS 要可用端口
                                .run(args);
            }
    
    1. 非 Web 程序方式。现在我们在项目目录 com.test 创建 MicroservicesProjectApplication.java
    package com.test;
    
    import org.springframework.boot.SpringApplication;
    import org.springframework.boot.WebApplicationType;
    import org.springframework.boot.autoconfigure.SpringBootApplication;
    import org.springframework.context.ConfigurableApplicationContext;
    
    import java.util.LinkedHashMap;
    import java.util.Map;
    
    @SpringBootApplication
    public class MicroservicesProjectApplication {
    
            public static void main(String[] args) {
                    SpringApplication springApplication = new SpringApplication(DemoApplication.class);
                    Map<String, Object> properties = new LinkedHashMap<>();
                    properties.put("server.port", 0);
                    springApplication.setDefaultProperties(properties);
                    // 设置为非 web 应用
                          springApplication.setWebApplicationType(WebApplicationType.NONE);
            ConfigurableApplicationContext context = springApplication.run(args);
                    // 当前 Spring 应用上下文的类:org.springframework.context.annotation.AnnotationConfigApplicationContext
                    System.out.println("当前 Spring 应用上下文的类:" + context.getClass().getName());
    

    点击实验楼新课《Spring Cloud 从入门到实战》,快开始学习之旅!

  • 相关阅读:
    tabhost切换标签:Log中出现You must supply a layout_width attribute的解决方法
    listview去掉底部多出的边框黑色
    使用fragmenttabhost后,子fragment怎么获取ID?怎么用getSharedPreferences
    android用shape给linearLayout设置边框,怎样只保留底部或顶部的边框,把其它三个方向的边框去掉呢?
    linux删除文件未释放空间问题处理
    mount: unknown filesystem type 'LVM2_member'解决方案【转】
    centos系统lvm的安装
    一个或多个音频服务未运行 win7 错误1079:此服务的账户不同于运行于同一进程上的其他服务账户
    php SimpleXML
    new JSONObject(str)无法解析 报错:org.json.JSONException: Value of type java.lang.String cannot be converted to JSONObject
  • 原文地址:https://www.cnblogs.com/shiyanlou/p/13994794.html
Copyright © 2020-2023  润新知