SpringBoot学习条记

打印 上一主题 下一主题

主题 862|帖子 862|积分 2586

微服务阶段

javaSE:OOP
mySQL:持久化
html+css+js+jquery+框架:视图,框架不熟练,css欠好;
javaweb:独立开发MVC三层架构的的网站:原始
ssm:框架:简化了我们的开发流程,配置也开始较为复杂;
war:tomcat运行
spring再简化:springBoot-jar:内嵌tomcat;微服务架构!
服务越来越多:springcloud!

高内聚,低耦合
微服务(Microservices)——Martin Flower阅读条记

整体风格(monolithic style):一个完备应用步伐(monolithic application)构建成一个单独的单元。企业级应用通常被构建成三个重要部分:客户端用户界面(由运行在客户机器上的浏览器的 HTML 页面、Javascript 组成)、数据库(由很多的表构成一个通用的、相互关联的数据管理体系)、服务端应用。服务端应用处理 HTTP 请求,执行领域逻辑(domain logic),检索并更新数据库中的数据,使用得当的 HTML 视图发送给浏览器。服务端应用是完备的 ,是一个单独的的逻辑执行。任何对体系的改变都涉及到重新构建和部署一个新版本的服务端应用步伐。(单一应用步伐的毛病,可拓展性较差,维护难度较大)
微服务架构风格(microservice architectural style):把应用步伐构建为一套服务。究竟是,服务可以独立部署和扩展,每个服务提供了一个坚实的模块边界,甚至不同的服务可以用不同的编程语言编写。它们可以被不同的团队管理。
微服务风格的特性:

  • 组件化(Componentization )与服务(Services)
  • 围绕业务功能的构造
    不是按照技术构建团队而是按照业务进行组建,意味着团队内将由不同技术方向的成员构成,如UI工程师、后端工程师、数据工程师等,而非先前的单一专业。
  • 产品不是项目:团队应该负责产品的整个生命周期
  • 强化终端及弱化通道:微服务的应用致力松耦合和高内聚
  • 分散治理:不同的需求,不同的业务,不同的微服务,不同的技术,不同的语言,雷同的项目。
  • 分散数据管理:当对概念模式下决心进行分散管理时,微服务也决定着分散数据管理。微服务让每个服务管理自己的数据库:无论是雷同数据库的不同实例,或者是不同的数据库体系。这种方法叫Polyglot Persistence(多种持久化方法)。微服务架构强调服务间事件的协调,并清晰的认识同等性只能是最终同等性以及通过补偿运算处理问题。
  • 基础设施自动化:微服务的出现使得体系的运维测试工作难度加大,必要对体系的打包发布测试等环节尽可能的接纳自动化手段进行,因此有必要对软件开发流程中的部分环节接纳自动化改进。
  • 容错性设计:使用服务作为组件的一个结果在于应用必要有能容忍服务的故障的设计。任务服务可能由于供应商的不可靠而故障,客户端必要尽可能的优化这种场景的响应。跟整体构架相比,这是一个缺点,由于它带来的额外的复杂性。
    服务可以随时故障,快速故障检测,乃至,自动恢复变更非常重要。监控体系可以提供一种早期故障告警体系,让开发团队跟进并调查。对于微服务框架来说,这相当重要,由于微服务相互的通讯可能导致告急不测行为。
  • 设计改进:决定拆分我们应用的原则是什么呢?首要的因素,组件可以被独立替换和更新的,这意味着我们探求的关键在于,我们要想象着重写一个组件而不影响它们之前的协作关系。究竟上,很多的微服务小组给它进一步的预期:服务应该能够报废的,而不是要长久的发展的。其次,可代替是模块化开发中的一个特例,它是用模块来应对必要变更的。把组件改成服务,增长了细化发布计划的一个机会。
微服务是未来吗?
微服务构架风格是一个非常重要的想法:一个值得企业应用中认真考虑的东西。
微服务架构的成功依赖于软件如何拆分成适合的模块。指出不同模块的精确边界现实上是非常困难的。改良设计要承认边界的权益困境和因此带来的易于重构的重要性。
spring Boot

环境:

  • jdk:1.8
  • maven:3.6.1
  • springboot:最新版
  • IDEA
一、第一个SpringBoot步伐

1.1 如何创建springboot项目


  • 方法一:可以在管网配置后直接下载,导入IDEA开发(Spring Initializr)或者使用aliyun的Cloud Native App Initializer (aliyun.com)来创建新的springboot项目
    注:aliyun目前支持使用java8创建springboot项目,
  • 方法二:直接使用IDEA创建一个springboot项目(其实和官网类似,一般开发直接在IDEA中创建)
注:假如初学者电脑安装的是1.8,可以额外安装jdk17
1.2 Springboot自动装配原理


  • pom.xml

    • spring-boot-dependencies:核心依赖在父工程中!
    • 我们在写或者引入一些springboot依赖的时候,不必要指定版本,就是由于有这些版本仓库

  • 启动器

      1. <dependency>
      2.             <groupId>org.springframework.boot</groupId>
      3.             <artifactId>spring-boot-starter</artifactId>
      4. </dependency>
      复制代码
    • 启动器说白了就是springboot的启动场景
    • 好比spring-boot-starter-web,它就会帮我们自动导入web环境的所有依赖!
    • springboot会将所有的功能场景都变成一个个的启动器
    • 我们要使用什么功能,就只必要找到对应的启动器就可以了
    • 所有springboot启动器列表(version2.7.18)Spring Boot Reference Documentation

  • 主步伐

      1. //程序主入口
      2. //本身就是spring的一个组件
      3. //@SpringBootApplication标注这个类是一个springboot的应用
      4. @SpringBootApplication
      5. public class SpringBoot17Application {
      6.     public static void main(String[] args) {
      7.         SpringApplication.run(SpringBoot17Application.class, args);
      8.     }
      9. }
      复制代码
    • 注解:

        1. @SpringBootConfiguration:springboot的配置
        2.     @Configuration:spring的配置类
        3.     @Component:说明这也是一个spring的组件
        复制代码
        1. @EnableAutoConfiguration:自动配置,获取pom中的全部依赖并导入
        2.     @AutoConfigurationPackage:自动配置包
        3.          @Import({AutoConfigurationPackages.Registrar.class}):自动配置`包注册`
        4.     @Import({AutoConfigurationImportSelector.class}):自动配置导入选择器
        复制代码
        1. //获取所有的配置
        2. List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
        复制代码
        1. //获取候选的配置
        2. protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        3.                 List<String> configurations = ImportCandidates.load(AutoConfiguration.class, getBeanClassLoader())
        4.                         .getCandidates();
        5.                 Assert.notEmpty(configurations,
        6.                                 "No auto configuration classes found in "
        7.                                                 + "META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports. If you "
        8.                                                 + "are using a custom packaging, make sure that file is correct.");
        9.                 return configurations;
        10.         }
        复制代码
      • 必要注意,springboot2和3在这个地方的写法略微有些不同,上面的是springboot3的代码,下满是2的
        1. protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
        2.         List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
        3.         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.");
        4.         return configurations;
        5.     }
        6.     protected Class<?> getSpringFactoriesLoaderFactoryClass() {
        7.         return EnableAutoConfiguration.class;
        8.     }
        复制代码
      • META-INF/spring.factories:自动配置的核心文件


          1. Properties properties = PropertiesLoaderUtils.loadProperties(resource);
          2. 所有资源加载到配置类中!
          复制代码



结论:springboot所有自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,但是不一定生效,要判断条件是否成立。假如导入了对应的start,就有对应的启动器了,有了启动器,自动装配就会生效,然后就配置成功。

  • springboot在启动的时候,从类路径下/META-INF/spring.factories获取指定的值;
  • 将这些自动配置的类导入容器,自动配置就会生效,帮步伐员进行自动配置
  • 从前我们必要自动配置的东西,现在springboot帮我们做了
  • 整合JavaEE,办理方案和自动配置的东西都在spring-boot-autoconfigure
  • 它会把所有必要导入的组件,以类名的方式返回,这些组件就会被添加到容器中。
  • 容器中也会存在非常多的xxxAutoConfiguration的文件(@Bean),就是这些类给容器中导入了这个场景必要的所有组件,并自动配置,@Configuration
  • 有了自动配置类,免去了我们手动编写配置类的需求。
1.3 SpringApplication.Run


  • SpringApplication.run分析
    1. public static void main(String[] args) {
    2.         SpringApplication.run(SpringLearningApplication.class, args);
    3.     }
    复制代码
    该方法分成两部分,一部分是SpringApplication的实例化,另一个是run方法的执行。
  • SpringApplication分析
    这个类重要做了以下四件事情

    • 推断应用的类型是普通项目还是Web项目
    • 查找并加载所有可用的初始化器,设置到initializers属性中
    • 找出所有的应用步伐监听器,设置到listeners属性中
    • 推断并设置main方法的定义类,找到运行的主类
    构造器如下:
    1. public SpringApplication(ResourceLoader resourceLoader, Class<?>... primarySources) {
    2.         this.sources = new LinkedHashSet();
    3.         this.bannerMode = Mode.CONSOLE;
    4.         this.logStartupInfo = true;
    5.         this.addCommandLineProperties = true;
    6.         this.addConversionService = true;
    7.         this.headless = true;
    8.         this.registerShutdownHook = true;
    9.         this.additionalProfiles = Collections.emptySet();
    10.         this.isCustomEnvironment = false;
    11.         this.lazyInitialization = false;
    12.         this.applicationContextFactory = ApplicationContextFactory.DEFAULT;
    13.         this.applicationStartup = ApplicationStartup.DEFAULT;
    14.         this.resourceLoader = resourceLoader;
    15.         Assert.notNull(primarySources, "PrimarySources must not be null");
    16.         this.primarySources = new LinkedHashSet(Arrays.asList(primarySources));
    17.         this.webApplicationType = WebApplicationType.deduceFromClasspath();
    18.         this.bootstrapRegistryInitializers = new ArrayList(this.getSpringFactoriesInstances(BootstrapRegistryInitializer.class));
    19.         this.setInitializers(this.getSpringFactoriesInstances(ApplicationContextInitializer.class));
    20.         this.setListeners(this.getSpringFactoriesInstances(ApplicationListener.class));
    21.         this.mainApplicationClass = this.deduceMainApplicationClass();
    22.     }
    复制代码
Docker:历程
关于Springboot,谈谈个人理解:

  • 自动装配
  • run()
全面接管SpringMVC的配置
1.4 SpringBoot:配置文件及自动装配原理


  • 配置文件
    SpringBoot使用一个全局配置文件,配置文件名称是固定的(application)

    • application.properties(等号取值)

      • 语法结构:key=value

    • application.yml(冒号取值,一定注意空格)

      • 语法结构:key:空格 value

    配置文件的作用:修改SpringBoot自动装配的默认值,由于SpringBoot在底层都给我们自动配置好了;

  • YAML
    标志语言

    • 从前的配置文件,大多数使用xml来配置;好比一个简单的端口配置,我们来对比下yaml和xml
    yaml配置

      1. server:
      2.   port: 8081
      复制代码
    xml配置

      1. <server>
      2.     <port>8081</port>
      3. </server>
      复制代码
    YAML基本语法

      1. spring.application.name=springboot-02-config
      2. # 官方配置太多了,需要了解原理:一通百通
      3. # properties智能保存键值对
      复制代码
      1. # 注意,yaml文件对空格的要求十分严格,一旦空格有误容易导致上下级属性关系错位# 可以注入到配置类中# 普通的key-valueserver:
      2.   port: 8081# 还可以存储对象student:  name: wut  age: 25# 或者将对象写在行内student1: {name: wut,age: 24}# 甚至可以保存数组pets:  - cat  - dog  - pig# 数组也可以这么写pets1: [cat,dog,pig]
      复制代码


  • 疏松绑定
    ​        使用@ConfigurationProperties(prefix = "xxx")注解可以进行疏松绑定,接纳驼峰命名规则就可以实现前后端赋值,但是注意假如是字段上接纳@Value("xx")这种针对某个单一字段进行辅助,没有疏松绑定,必要字段名同等才气实现。
  • JSR303数据校验

    • 相当于在赋值的时候添加一层过滤器,对赋值内容进行校验,有点类似于前端的内容检查。
    • 开启方法是在类上添加@Validated注解



    • @ConfigurationProperties@Value功能批量注入配置文件中的属性一个个指定代码中参数取值疏松绑定(疏松语法)支持不支持SpEl(Spring Expression Language)不支持支持JSR303数据校验支持不支持复杂类型封装支持不支持

注:


  • ​        在使用@ConfigurationProperties(prefix = "xxx")注解时,会出现这样的东西,原因是“Spring Boot配置注解执行器没有配置”。配置注解执行器配置完成后,当执行类中已经定义了对象和该对象的字段后,在配置文件中对该类赋值时,便会非常方便的弹出提示信息。但不配置也不影响体系运行。办理这个问题的方法如下:
    1. <dependency>
    2.             <groupId>org.springframework.boot</groupId>
    3.             <artifactId>spring-boot-configuration-processor</artifactId>
    4.             <optional>true</optional>
    5. </dependency>
    复制代码
  • 这个地方有一个必要注意的地方,假如当前springboot版本为2.3.0以上,则必要手动在springboot的启动中引入相关的校验包
    1. <dependency>
    2.             <groupId>org.springframework.boot</groupId>
    3.             <artifactId>spring-boot-starter</artifactId>
    4. </dependency>-validation
    复制代码
    ​        另外注意一点springboot3不再支持使用原来的javax.validatio,必要使用jakarta.validation,这一点是springboot2和springboot3之间的区别。
  • 多环境配置以及配置文件位置

    • 配置环境优先级,springboot项目一共有四个地方可以配置相关环境,分别是

      • optional:classpath:/config/
      • optional:file:./config/*/
      • optional:classpath:custom-config/
      • optional:file:./custom-config/



    • 黄色优先级最高,红色其次,蓝色第三,绿色第四
    • 多环境配置实现:通过spring.profiles.active指定生效文件,如下所示:


        1. spring:
        2.   profiles:
        3.     active: dev
        复制代码

    • 或者通过yaml实现多配置模块

        1. spring:
        2.   profiles:
        3.     active: dev---server:  port: 8082spring:  config:    activate:      on-profile: dev---server:  port: 8083spring:  config:    activate:      on-profile: test
        复制代码
      • 此处必要注意不同版本的誊写格式不太一样



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

半亩花草

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表