二者都是Spring家族中的顶级项目
Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的,使得Spring的学习和使用变得快速无痛。不仅适合替换原有的工程结构,更适合微服务开发。
Spring Cloud基于Spring Boot,为微服务体系开发中的架构问题,提供了一整套的解决方案——服务注册与发现,服务消费,服务保护与熔断,网关,分布式调用追踪,分布式配置管理等。
Spring Cloud是一个基于Spring Boot实现的云应用开发工具;Spring boot专注于快速、方便集成的单个个体,Spring Cloud是关注全局的服务治理框架;spring boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring boot来实现。
学过Spring的都知道,Spring开发有非常头疼的三点:
以启动一个带Hibernate的Spring MVC为例。
1. 依赖太多,而且要注意版本兼容。这个应用,要添加10-20个依赖,Spring相关的包10多个,然后是Hibernate包,Spring与Hibernate整合包,日志包,json包一堆,而且要注意版本兼容性。
2. 配置太多,要配置注解驱动,要配置数据库连接池,要配置Hibernate,要配置事务管理器,要配置Spring MVC的资源映射,要在web.xml中配置启动Spring和Spring MVC等
3. 部署和运行麻烦 。要部署到tomcat里面。不能直接用java命令运行。
太多重复和大家都一样的配置了。
Spring Boot的哲学就是 约定大于配置 。既然很多东西都是一样的,为什么还要去配置。
Spring Boot的三大魔法:
1. 通过starter和依赖管理 解决依赖 问题。
2. 通过自动配置, 解决配置复杂 问题。
3. 通过内嵌web容器,由应用启动tomcat,而不是tomcat启动应用,来 解决部署运行 问题。
Spring Cloud体系就比较复杂了。基本可以理解为通过Spring Boot的三大魔法, 将各种组件整合 在一起,非常简单易用。
你可以把spring boot的官方的包分为两类,一种是为了搭建一个服务用的,比如hibernate jpa,比如 message。另外一种含有cloud关键字的,是为了各个spring boot之间管理和使用的包。
因为当把集群、CI等方法集中进来一起考虑的时候,这件事情就复杂了。
多个小有服务整合成的大服务,要有一个消息总线来用于互相通知和调用,要有一个服务发现程序来管理某个小服务上线可用,同时在服务离线时也要能处理,各个小服务要尽量各自独立,还要考虑服务的依赖性,集群的负载均衡,配置文件的分离。
再把CI和Docker拿进来一起考虑的话,更乱。
但我认为这样完成的一个服务是更具有可插拔性,更容易维护的。而且遵循了上面的cloud方案的话,在服务的健壮性上面也很强。
写到这里对于新接触的我认为可以先从单独的spring boot程序开始入门,当要添加一个新功能时,考虑拆分成另外服务。两个程序间可以通过 jmx或是 其它消息中间件或是rest通讯。最后实现了一个各自独立的功能集群。
直白地说: Spring boot可以离开Spring Cloud独立使用开发项目,但是Spring Cloud离不开Spring boot,属于依赖的关系。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>1.0-SNAPSHOT</version>
<parent> <!-- 继承默认值为Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.3.RELEASE</version>
</parent>
<dependencies>
<dependency> <!--Web应用程序的依赖项-->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
package demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class,args);
}
}
注意包的层次,可能会导致不能够成功启动。
package com.example.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@RequestMapping(name = "/hello")
public String helloWorld(){
return "Hello World!";
}
}
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.3.RELEASE)
....... . . .
....... . . . (log output here)
....... Tomcat started on port(s): 8080 (http) with context path ''
........ Started DemoApplication in 2.222 seconds (JVM running for 6.514)
出现最后两行行字样,说明Spring Boot启动成功。
倒数第二行的port(s): 8080为端口号。
出现响应内容,即为项目创建成功。
File >>>> New >>>> Project / Module
使用IDE创建好项目后,可以将项目中一些不需要的文件或文件夹删除掉
Spring Boot注解说明
Spring Boot 整个应用程序只有一个配置文件,application.properties 或 application.yml 文件。由于Spring Boot使用了很多默认配置,而且我们也可以在这个配置文件中修改配置信息去覆盖默认配置。
这里主要介绍两种文件结构。
server.port=8081 #修改Tomcat端口
server.servlet.context-path=/api #请求前缀
#如2.2中进行这两项修改,
#请求路径将由 http://localhost:8080/hello 变更为http://localhost:8081/api/hello
server:
port: 8081
servlet:
context-path: /api
#类似于文件夹一样,同一父目录下的配置名可以通过缩进进行表示,不同父目录下的需要另外起行
#效果与2.5.1中的相同
在一个企业级系统中,我们可能会遇到这样一个问题:开发时使用开发环境,测试时使用测试环境,上线时使用生产环境。每个环境的配置都可能不一样,比如开发环境的数据库是本地地址,而测试环境的数据库是测试地址。那我们在打包的时候如何生成不同环境的包呢?
这里的解决方案有很多:
以 .yml 格式为例:
第一步: 创建application.yml文件,进行如下配置
spring:
profiles:
active: dev
#表示应用dev配置文件
第二步: 创建 application-{profiles}.yml 文件,并进行相应环境配置
{profiles} 为被替换内容,我们创建的文件名为 application-dev.yml ,.properties文件相同只需要将文件后缀改为 .properties 即可。