1.什么是微服务
SOA(面向服务的架构)
微服务,是与之前的服务化思路和实践相比较而来的,早些年的服务实现和实施思路是将很多功能从开发到交付都打包成一个很大的服务单元(一般称为 Monolith),而微服务实现和实施思路则更强调功能趋向单一,服务单元小型化和微型化。
早期我们从开发到交付,都是单一应用结构,所有功能都集中在一个项目中,统一管理和开发。
微服务就是一个项目中的功能,独立的分成多个子项目,并行开发。
微服务其实是一种架构风格,提倡一个应用应该是一组小型服务组成,可以通过HTTP的方式进行互通。
在没有微服务之前我们软件架构方式称为单体应用:ALL IN ONE。就是所有的内容统一集中在一个应用程序中。
这种单体应用的优点:开发测试简单,不会涉及多个应用之间的互联互调,应用部署也简单,只需要一个war包就OK,不会对运维造成太大负担,应用程序的水平扩展也简单 (新增模块简单)。当并发量高的时候,我们可以将这个单体应用多复制几份部署在多个服务器上,通过负载均衡机制控制运行,可以提高并发访问。
缺点:需要对程序进行修改的时候需要重新打包,重新部署,重新运行,这就是一个牵一发动全身的情况,当然更大的挑战是来自于日益增长的软件需求。
微服务:每一个功能元素最终都是一个可独立替换和独立升级的软件单元,服务于服务之间通过http协议访问连接。
2.SpringBoot介绍
通过SpringBoot快速构建微服务应用,通过SpringCloud进行分布式互联互调,形成分布式结构,通过SpringCloudDataFlow进行流式数据运算和批处理操作。
SpringBoot使创建独立的、生产级的、基于Spring的应用程序变得容易,可以“只运行”,帮助我们快速的创建出基于Spring的应用程序。
在没有使用SpringBoot的时候我们需要导入大量jar包和编写大量配置文件,开始编写业务逻辑进行单元测试,最后打成war包部署服务器。带来的结果是降低开发效率,导包和编写配置文件时容易遗漏某一项操作。
SpringBoot底层实际上还是使用Spring技术,他是通过整合Spring提供的针对不同领域开发框架来达到简化Java EE 程序的开发步骤。
Spring提供的针对不同领域的开发框架:
Spring Framework:提供IOC容器
Spring Cloud:分布式框架
Spring Data:数据库访问框架
Spring Security:安全校验框架
…
SpringBoot的优点
快速创建独立运行的Spring项目以及与主流框架集成
使用嵌入式的Servlet容器,应用无需打成WAR包
starters自动依赖与版本控制
大量的自动配置,简化开发,也可修改默认值
无需配置XML,无代码生成,开箱即用
准生产环境的运行时应用监控
与云计算的天然集成
…
3.简单开发SpringBoot项目
使用IDEA创建项目:
一路Next直至项目创建成功
pom.xml配置文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
编写控制器类:
package qing.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class TestContrller {
@RequestMapping("/test")
@ResponseBody
public String getString() {
return "小李同学,晚上好!!";
}
}
主程序类:
package qing.springbootdemo1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("qing.controller")
public class Springbootdemo1Application {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo1Application.class, args);
}
}
由于创建的控制器类与SpringBoot的主类不在同一个包中,所以我们需要给主类上添加@ComponentScan(“qing.controller”),如果我们自己创建的控制器类与SpringBoot的主类在同一个包中,那么这个注解不用加。
控制台输出:
浏览器:
还可以直接打成jar包通过java-jar xxxx.jar命令来执行。
将这个jar包复制出去,编写一个与之对应的批处理文件,双击就可运行。
打开浏览器访问直接访问。
4.解析pom.xml文件
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.0</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
上面的配置是项目需要依赖的父项目spring‐boot‐starter‐parent,我们在新建的SpringBoot项目是spring‐boot‐starter‐parent项目下的一个子项目,我们的SpringBoot项目继承了spring‐boot‐starter‐parent父项目。
spring‐boot‐starter‐parent父项目继承了spring-boot-dependencies
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.4.0</version>
</parent>
spring‐boot‐starter‐parent父项目是spring-boot-dependencies的子项目
spring-boot-dependencies-2.4.0.pom
<properties>
<activemq.version>5.16.0</activemq.version>
<antlr2.version>2.7.7</antlr2.version>
<appengine-sdk.version>1.9.83</appengine-sdk.version>
<artemis.version>2.15.0</artemis.version>
<aspectj.version>1.9.6</aspectj.version>
<assertj.version>3.18.1</assertj.version>
<atomikos.version>4.0.6</atomikos.version>
<awaitility.version>4.0.3</awaitility.version>
<bitronix.version>2.1.4</bitronix.version>
......
</properties>
上面的元素中配置的是我们所创建的项目的所有依赖包版本
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-amqp</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-blueprint</artifactId>
<version>${activemq.version}</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-broker</artifactId>
<version>${activemq.version}</version>
</dependency>
.......
</dependencies>
</dependencyManagement>
这个spring‐boot‐dependencies项目实际是用来真正管理Spring Boot应用里面的所有依赖包。有了spring‐boot‐dependencies项目以后我们新建的SpringBoot项目所需要的依赖包导入就不要在再配置版本和元素导入依赖,从spring‐boot‐dependencies项目中继承就可以了。
5.SpringBoot启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
命名:spring-boot-starter-xxxx SpingBoot的启动器
spring-boot-starter:帮助我们导入springboot基础依赖包
spring-boot-starter-web:帮我们导入了web模块正常运行所依赖包
spring-boot-starter-test:帮我们导入了单元测试模块正常运行所依赖包
Spring Boot将所有的功能的依赖包都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter 那么实现相关功能的所有依赖都会自动导入进来,且没有版本冲突。要用什么功能就导入什么场景的启动器就可以了 。
基本的启动器
Spring Boot应用启动器基本的一共有44种,具体如下:
1、spring-boot-starter:这是Spring Boot的核心启动器,包含了自动配置、日志和YAML。
2、spring-boot-starter-actuator:帮助监控和管理应用。
3、spring-boot-starter-amqp:通过spring-rabbit来支持AMQP协议(Advanced Message Queuing Protocol)。
4、spring-boot-starter-aop:支持面向方面的编程即AOP,包括spring-aop和AspectJ。
5、spring-boot-starter-artemis:通过Apache Artemis支持JMS的API(Java Message Service API)。
6、spring-boot-starter-batch:支持Spring Batch,包括HSQLDB数据库。
7、spring-boot-starter-cache:支持Spring的Cache抽象。
8、spring-boot-starter-cloud-connectors:支持Spring Cloud Connectors,简化了在像Cloud Foundry或Heroku这样的云平台上连接服务。
9、spring-boot-starter-data-elasticsearch:支持ElasticSearch搜索和分析引擎,包括spring-data-elasticsearch。
10、spring-boot-starter-data-gemfire:支持GemFire分布式数据存储,包括spring-data-gemfire。
11、spring-boot-starter-data-jpa:支持JPA(Java Persistence API),包括spring-data-jpa、spring-orm、Hibernate。
12、spring-boot-starter-data-mongodb:支持MongoDB数据,包括spring-data-mongodb。
13、spring-boot-starter-data-rest:通过spring-data-rest-webmvc,支持通过REST暴露Spring Data数据仓库。
14、spring-boot-starter-data-solr:支持Apache Solr搜索平台,包括spring-data-solr。
15、spring-boot-starter-freemarker:支持FreeMarker模板引擎。
16、spring-boot-starter-groovy-templates:支持Groovy模板引擎。
17、spring-boot-starter-hateoas:通过spring-hateoas支持基于HATEOAS的RESTful Web服务。
18、spring-boot-starter-hornetq:通过HornetQ支持JMS。
19、spring-boot-starter-integration:支持通用的spring-integration模块。
20、spring-boot-starter-jdbc:支持JDBC数据库。
21、spring-boot-starter-jersey:支持Jersey RESTful Web服务框架。
22、spring-boot-starter-jta-atomikos:通过Atomikos支持JTA分布式事务处理。
23、spring-boot-starter-jta-bitronix:通过Bitronix支持JTA分布式事务处理。
24、spring-boot-starter-mail:支持javax.mail模块。
25、spring-boot-starter-mobile:支持spring-mobile。
26、spring-boot-starter-mustache:支持Mustache模板引擎。
27、spring-boot-starter-redis:支持Redis键值存储数据库,包括spring-redis。
28、spring-boot-starter-security:支持spring-security。
29、spring-boot-starter-social-facebook:支持spring-social-facebook
30、spring-boot-starter-social-linkedin:支持pring-social-linkedin
31、spring-boot-starter-social-twitter:支持pring-social-twitter
32、spring-boot-starter-test:支持常规的测试依赖,包括JUnit、Hamcrest、Mockito以及spring-test模块。
33、spring-boot-starter-thymeleaf:支持Thymeleaf模板引擎,包括与Spring的集成。
34、spring-boot-starter-velocity:支持Velocity模板引擎。
35、spring-boot-starter-web:支持全栈式Web开发,包括Tomcat和spring-webmvc。
36、spring-boot-starter-websocket:支持WebSocket开发。
37、spring-boot-starter-ws:支持Spring Web Services。
Spring Boot应用启动器面向生产环境的还有2种,具体如下:
38、spring-boot-starter-actuator:增加了面向产品上线相关的功能,比如测量和监控。
39、spring-boot-starter-remote-shell:增加了远程ssh shell的支持。
最后,Spring Boot应用启动器还有一些替换技术的启动器,具体如下:
40、spring-boot-starter-jetty:引入了Jetty HTTP引擎(用于替换Tomcat)。
41、spring-boot-starter-log4j:支持Log4J日志框架。
42、spring-boot-starter-logging:引入了Spring Boot默认的日志框架Logback。
43、spring-boot-starter-tomcat:引入了Spring Boot默认的HTTP引擎Tomcat。
44、spring-boot-starter-undertow:引入了Undertow HTTP引擎(用于替换Tomcat)。
6.SpringBoot的主类
package qing.springbootdemo1;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;
@SpringBootApplication
@ComponentScan("qing.controller")
public class Springbootdemo1Application {
public static void main(String[] args) {
SpringApplication.run(Springbootdemo1Application.class, args);
}
}
Springbootdemo1Application包含了主方法public static void main(String[] args) {}
SpringApplication 将一个典型的 Spring 应用启动的流程“模板化”,在没有特殊需求的情况下,默认模板化后的执行流程就可以满足需求,但有特殊需求也没关系。SpringApplication 在合适的流程结点开放了一系列不同类型的扩展点,我们可以通过这些扩展点对 SpringBoot 程序的启动和关闭过程进行扩展。
通过SpringApplication设置修改启动图标:在resources文件夹中创建banner.txt
'##::::'##:'########:'##:::::::'##::::::::'#######::
##:::: ##: ##.....:: ##::::::: ##:::::::'##.... ##:
##:::: ##: ##::::::: ##::::::: ##::::::: ##:::: ##:
#########: ######::: ##::::::: ##::::::: ##:::: ##:
##.... ##: ##...:::: ##::::::: ##::::::: ##:::: ##:
##:::: ##: ##::::::: ##::::::: ##::::::: ##:::: ##:
##:::: ##: ########: ########: ########:. #######::
..:::::..::........::........::........:::.......:::
直接启动主程序: