当前位置:   article > 正文

SpringBoot微服务架构学习

springboot微服务
一、SpringBoot概述
1、什么是SpringBoot?

SpringBoot是一个开发基于Spring框架的应用的快速开发框架,它也是SpringCloud构建微服务分布式系统的基础设施。

2、SpringBoot有哪些主要特性?

        SpringBoot的主要特色包括构建独立的Spring应用、嵌入式的Web容器、固化的starter依赖、自动装配Spring模块或第三方库、产品就绪特性(日志、指标、健康检查、外部化配置等)、避免或简化XML配置等特性。

(1)可独立运行的Spring应用

        相对于普通的Spring应用,使用SpringBoot构建的Spring应用可以直接打包为一个独立可执行的jar或war包,使用java -jar命令即可运行,不需要管理依赖的第三方库,也不需要依赖外部容器来启动应用。之前使用Spring开发的Java Web应用,一般都会在第三方的Web容器中启动,比如Tomcat等,而使用SpringBoot开发的Java Web应用,虽然基于Spring,但它提供了内嵌的Web容器(基于Servlet或Reactive的Web容器,如Tomcat、Jetty、Undertow、NettyWebServer),通过SpringBoot插件,把所有依赖的第三方库、Web容器和应用本身一起重新打包(repackage)为一个Fat Jar或Fat War,然后直接使用java -jar命令运行即可。

(2)嵌入式Web容器

        SpringBoot内置了多种嵌入式Web容器,包括Tomcat、Jetty、Undertow、NettyWebServer等,用于运行基于Servlet或Reactive的Web应用,无需再打包部署WAR文件,即不需要依赖外部的Web容器部署。

(3)固化的starter依赖

        SpringBoot提供了一系列的starter依赖,用于快速的引入应用依赖的Spring模块及相关的第三方库。不同版本的SpringBoot,与其依赖的Spring模块及其相关的第三方库的版本关系是固定的,一一对应的。开发人员不需要关注依赖的Spring模块和第三方库的版本,只需要关心SpringBoot的版本即可,SpringBoot会正确引入依赖的Spring模块和第三方库的版本。固化依赖,可以降低SpringBoot应用管理依赖的成本。

(4)自动装配Spring模块或第三方库

        SpringBoot启动应用时,会推断应用类型,并检测引入的Spring模块或第三方库,当条件满足时自动加载Spring模块或第三方库的组件到容器中,以提供给应用使用。

(5)产品就绪特性

        SpringBoot提供了应用部署产品环境运行所必须的日志、指标、健康检查、外部化配置等特性,为部署后的运维提供工具支持,支撑应用尽可能快的部署到产品环境。

(6)避免或简化配置

        不会额外生成代码,并且可以简化甚至不需要xml或properties文件配置,即可快速开发Spring应用。

3、Spring、SpringBoot、SpringCloud有什么区别?

        以前说到Spring,一般指Spring框架(SpringFramework),它是一个开源、轻量级的Java应用开发框架。其核心是控制反转IOC和面向切面编程AOP。Spring提供了很多包括ORM、事务管理、WebMVC等非常有用的模块构建Java应用。

        SpringBoot则是在Spring基础之上,用于快速构建Spring应用的一个框架,它并不是要取代Spring,而是基于Spring的。

        SpringCloud是一个分布式微服务系统的开发框架,SpringBoot则是SpringCloud的基础设施。三者之间都不是取代的关系,而是一种倒三角的依赖关系,顶层是SpringCloud,中间层是SpringBoot,底层是Spring。

二、SpringBoot功能
1、自动配置(核心)

        springboot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是在Springboot自动完成的。

2、起步依赖(核心)

        起步依赖的本质是Maven项目对象模型(POM),定义了对其他库的传递依赖,这些东西加在一起支持某项功能。

        简单的说,起步依赖就是将具备某种功能的坐标打包在一起,并提供一些默认的功能。

3、辅助功能

        提供了一些大型项目中常见的非功能性特性,如嵌入式服务器,安全,指标,健康检查,外部配置等

总结:Springboot并不是对spring功能上的增强,而是提供了一种快速使用spring的方式。Springboot是对Spring的优化。

三、springboot项目的启动类
  1. @SpringBootApplication
  2. @ServletComponentScan
  3. @EnableFeignClients
  4. @ComponentScan({"com.xxx.xxx.web", "com.xxx.xxx.log", "com.xxx.xxx.activiti", "com.xxx.xxx.autoconfigure"})
  5. public class Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Application.class, args);
  8. }
  9. }

使用Springboot和Spring构建的项目,业务代码编写方式完全一样

四、SpringBoot起步依赖原理分析

1、起步依赖原理分析

        (1) spring-boot-starter-parent

        在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本

        在各种starter中,定义了完成该功能需要的坐标集合,其中大部分版本信息来自于父工程

        我们的工程继承了parent,引入starter后,通过依赖传递,就可以简单方便获得需要的jar包,并且不会存在版本冲突问题

        (2)  spring-boot-starter-web

五、配置文件
1、分类

properties(高优先级):键值对

server.port = 8080

yml(低优先级):缩进

server:

    port: 8080

小结

springboot提供了两种配置文件类型:properties和yml

默认配置文件名称:application

在同一级目录下优先级为:properties > yml > yaml

2、读取配置文件中的内容

1)@Value

  1. @Value("${name}")
  2. private String name;

注入单个值的属性是比较合适的

2)Environment

  1. @Autowired
  2. private Environment env;
  3. String name = env.getProperty("name")

3)@ConfigurationProperties

配合@Component使用,直接加载类上面即可;

3、profile(动态切换不同环境的配置文件)

        开发SpringBoot应用时,通常同一套程序会被安装到不同环境,比如:开发、测试、生产等。其中数据库地址,服务器端口等等配置都不同,如果每次打包时都要修改配置文件,那么非常麻烦。profile功能就是来进行动态配置切换的。

(1)profile配置方式

        多profile文件方式

        yml多文档方式

(2)profile激活方式

        配置文件:在application.propertie中配置: spring.profile.active=dev

        虚拟机参数:在VM options指定:-Dspring.profiles.active=dev

        命令行参数:java -jar xxx.jar --spring.profile.active=dev

六、springboot整合其他框架
1、整合Junit(单元测试)

(1)搭建springboot工程

(2)引入starter-test起步依赖

(3)编写测试类

(4)添加测试相关注解

        @RunWith(SpringRunner.class)

        @SpringBootTest(classes=启动类.class)

(5)编写测试方法

2、整合Redis

(1)搭建springboot工程

(2)引入redis起步依赖

        spring-boot-starter-data-redis

(3)配置redis相关属性

(4)注入RedisTemplate模板

        

  1. import org.junit.Test;
  2. import org.junit.runner.RunWith;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.boot.test.context.SpringBootTest;
  5. import org.springframework.test.context.junit4.SpringRunner;
  6. @RunWith(SpringRunner.class)
  7. @SpringBootTest
  8. public class application {
  9. @Autowired
  10. private RedisTemplate redisTemplate;
  11. @Test
  12. public void set(){
  13. redisTemplate.boundValueOps("name").set("zhangsan");
  14. }
  15. @Test
  16. public void get(){
  17. Object name = redisTemplate.boundValueOps("name").get();
  18. System.out.println(name);
  19. }
  20. }

(5)编写测试方法

3、整合mybatis

(1)搭建springboot工程

(2)引入mybatis起步依赖,添加MySQL驱动

        mybatis-spring-boot-starter

        mysql-connecor-java

(3)编写DataSource和Mybatis相关配置

(4)定义表和实体类

(5)编写dao和Mapper文件/纯注解开发

(6)测试

七、SpringBoot的启动流程

1、启动SpringBoot启动类SpringbootdemoApplication中的main方法。

2、调用SpringApplication.run(SpringbootdemoApplication.class, args),且构建了一个SpringApplication对象,应用程序将从指定的主要来源加载Bean。

3、运行 Spring 应用程序,创建并刷新一个新的 ApplicationContext。

一、原理初探

1、pom.xml

spring-boot-dependencies:核心依赖在父工程中

我们在写或者引入一些springboot依赖的时候,不需要指定版本,就因为有这些版本仓库

2、启动器

<dependency>

        <groupid>org.springframework.boot</groupid>

        <artifactId>spring-boot-starter</artifactId>

</dependency>

启动器:即springboot的启动场景

比如spring-boot-starter-web,它就会帮我们自动导入web环境所有依赖

springboot会将所有的功能场景变成一个个启动场景

我们要使用什么功能,就只需要找到对应的启动器即可

3、主程序

@SpringBootApplication

        标志这个类是一个springboot的应用

  1. public static void main(String[] args) {
  2. SpringApplication.run(Application.class, args);
  3. }

Java注解

@RestController

        @RestController 是@Controller和@ResponseBody 的结合

        @Controller 将当前修饰的类注入SpringBoot IOC容器,使得该类所在的项目跑起来的过程中,这个类就被实例化。
        @ResponseBody 的作用是指该类中所有的API接口返回的数据,对应的方法返回Map或是其他Object,都会以Json字符串的形式返回给客户端

@RequestMapping

        @RequestMapping注解是一个用来处理请求地址映射的注解,可用于映射一个请求或一个方法,可以用在类或方法上,处理get和post的请求

        @GetMapping处理get请求

        @PostMapping处理post请求

        用于类上,表示类中的所有响应请求的方法都是以该地址作为父路径。

        用于方法上,表示在类的父路径下追加方法上注解中的地址将会访问到

SpringBoot快速入门

        · SpringBoot造创建项目时,使用jar的打包方式

        · SpringBoot的引导类,启动类,是项目的入口,运行main方法就可以启动项目

        · 使用SpringBoot和Spring构建的项目,业务代码编写方式完全一样

SpringBoot起步依赖原理分析

        · 在spring-boot-starter-parent中定义了各种技术的版本信息,组合了一套最优搭配的技术版本,可以不用自己指定导入依赖的版本

        · 在各种starter中,定义了完成该功能的需要的坐标(gav)合集,其中大部分版本信息来自于父工程

        · 我们的工程继承spring-boot-starter-parent,引入starter之后,通过依赖传递,可以简单方便获得需要的jar包,并且不会存在版本冲突等问题

SpringBoot配置

配置文件分类

        SpringBoot是基于约定的,所以很多配置都有默认值,如Tomcat端口是8080;但是如果想使用自己的配置替换默认配置的话,就可以使用application.properties或application.yaml进行配置;配置文件中包括两种内容,一种是程序能够自动识别的内容,一种是我们自己配置的内容,需要用注解或是其他

·properties

        server.port=8080

·yml

        server:

            port: 8080       

·xml

<server>

        <port>8080</port>

        <address>127.0.0.1</address>

</server> 

YAML

        YAML是一种直观的能够被电脑识别的数据序列化格式,并且能够被人阅读,容易和脚本语言交互的,可以被支持YAML库的不同的编程语言程序导入;YAML文件是以数据为核心的,比传统的xml方式更加简介,其扩展名为.yaml或.yml; 简洁,以数据为中心;

        ·大小写敏感

        ·数据值前面必须有空格,作为分隔符

        ·使用缩进表示层级关系

        ·缩进时不允许使用Tab,只允许使用空格(因为各个系统中Tab对应的空格数可能不同,最后导致层次混乱)

        ·缩进的空格数目不重要,只要相同层级的元素左对齐即可

        ·#表示注释,从这个字符一直到行尾,都会被解析器忽略

YAML数据格式

        ·对象(map):键值对的集合

        person:

            name:zhangsan

        person: {name: zhangsan}

        ·数组:一组依次排列的值

        address:

            -beijing

            -shanghai

        address: [beijing,shanghai]

        ·纯量:单个的,不可再分的值

        msg: 'hello \n world' #单引号忽略转义字符

        msg1: "hello \n world"  #双引号识别转义字符

YAML参数引用

        name: lisi

        person:

            name: ${name} #引用上边定义的name值

读取配置内容

        (1)@Value

                @Value("${name}")

                private String name;

        (2)Environment

                @Autowired

                private Environment env;

                env.getProperty("name")

        (3)@ConfigurationProperties

profiles

        在开发springboot的应用时,通常同一程序会被安装到不同环境,比如:开发、测试、生产等;其中数据库地址、服务器端口等等配置都不同,如果每次打包时,都需要修改配置文件,那么非常麻烦。profile功能就是用来进行动态配置切换的。

        profile激活方式:配置文件、虚拟机参数、命令行参数

        配置文件:在配置文件application.properties中配置:spring.profiles.active=pro

        表示需要激活的配置文件是application-pro.properties,即程序里面需要使用的配置都从application-pro.properties里面取

        虚拟机参数:在工程的VM options指定:-Dspring.profiles.active=pro

        命令行参数:将工程打包放到服务器上面,或者是在终端进行运行

        java -jar 包名.jar --spring.profiles.active=pro

SpringBoot整合其他框架

整合Junit进行单元测试

整合redis

        Redis 是一个高性能的key-value数据库

整合MyBatis

        实现步骤

        ①搭建springboot工程

        ②引入mybatis起步依赖,添加MySQL驱动

        ③编写DataSource和mybatis相关配置

        ④定义表和实体类

        ⑤编写dao和mapper文件/纯注解开发

        ⑥测试

SpringBoot高级

SpringBoot原理分析

        ·SpringBoot自动配置

                Condition

                Condition是在spring4.0增加的条件判断功能,通过这个可以实现选择性的创建Bean操作

                ·自定义条件:

                        ① 定义条件类:自定义类实现Condition接口,重写matches方法,在matches方法中进行逻辑判断,返回boolean值,matches方法有两个参数

                                --context:上下文对象,可以获取属性值,获取类加载器,获取BeanFactory

                                --metadata:元数据对象,用于获取注解属性

                        ② 判断条件:在初始化Bean时,使用@Conditional(条件类.class)注解

                ·SpringBoot提供的常用条件注解:

                        (1)ConditionalOnProperty

                        (2)ConditionalOnClass

                        (3)ConditionalOnMissingBeans

                Enable注解原理

                        SpringBoot中提供了很多Enable开头的注解,这些注解都是用于动态开启某些功能的。而其底层原理是使用@Import注解导入一些配置类,实现Bean的动态加载。 

                        @Import注解后面的类都会被spring创建并放入IOC容器;

                        @Import的用法:(1)导入Bean(2)导入配置类(3)导入ImportSelecter实现类,一般用于加载配置文件中的类(4)导入ImportBeanDefinitionRegestrar实现类

                @EnableAutoConfiguration注解

                @EnableAutoConfiguration内部使用@Import(AutoConfig)                

SpringBoot监控

SpringBoot项目部署

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/364105
推荐阅读
相关标签
  

闽ICP备14008679号