文章目录
- 第三章 Spring Cloud微服务解决方案
- 第一节 Spring Boot
- 3.1.1 Spring Boot设计理念
- 1. Spring Boot介绍
- 2. Spring Boot优势快速预览
- 3. 开发第一个Spring Boot应用
- 3.1.2 系统配置自动装载机制
- 1. @SpringBootApplication注解
- 2. 代码包扫描
- 3. 零Spring配置文件
- 4. 个性化加载配置
- 5. 外部参数配置信息加载
- 1)加载方式
- 2)不同环境的配置
- 3)使用properties文件导入配置
- 6. 环境化配置-profile
- 1) profile是什么机制
- 2)如何指定profile
- 3)如何在开发中使用
- 7. 配置文件
- 1)配置文件可以存放在哪些位置
- 2)自定义配置名称和存储路径
- 8. 配置文件格式
- 1)yaml语法精简版说明
- 2)properties示例
- 9. 参数使用
- 3.1.3 Starter快速集成机制详解
- 1. Starter介绍
- 2. Web开发示例
- 3. 自研starter的步骤
- 3.1.4 使用Actuator管理你的Spring程序
- 1. Actuator介绍
- 2. 端点配置
- 3. http端点配置
- 1)http配置
- 2)CORS跨域支持(默认情况下禁用CORS支持)
- 3)修改ManagerServer服务器配置
- 4. 端点讲解
- 1)Health健康检查
- 2)日志配置
- 3)metrics
- i. 支持查看哪些数据
- ii. 与监控系统的集成
- iii. 自定义监控指标
- 4)自定义端点
- 5. 快速理解JMX机制
- 3.1.5 命令行工具SpringBoot-CLI
- 1. CLI安装
- 1)下载
- 2)解压到指定文件夹
- 3)添加环境变量
- 4)检查是否安装成功
- 2. 作用
- 2)spring命令说明
- 3)项目构建
第三章 Spring Cloud微服务解决方案
第一节 Spring Boot
3.1.1 Spring Boot设计理念
1. Spring Boot介绍
- Spring Boot对Spring平台和第三方库进行了整合,可创建
可以运行的、独立的、生产级的
基于Spring的应用程序。(大多数Spring Boot应用程序只需很少的Spring配置)
- Spring Boot可以使用java -jar或更传统的war部署启动的Java应用程序创建,可以内嵌Tomcat、Jetty、Undertow容器,快速启动web程序。
- 设计目标
- 为所有Spring开发提供更快且可通用的入门体验。
- 开箱即用,可以根据需求快速调整默认值。
- 提供大型项目(例如嵌入式服务器、运行状况检查和统一配置)通用的一系列非功能性功能。
- 绝对没有代码生成,也不需要XML配置。
2. Spring Boot优势快速预览
3. 开发第一个Spring Boot应用
1)依赖
Maven依赖管理
-spring-boot-dependencies提供了SB支持的依赖,以及相关的版本定义
<dependencyManagement>
<dependencies>
<dependency>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-dependenciesartifactid>
<version>2.1.3.RELEASEversion>
<type>pomtype>
<scope>importscope>
dependency>
dependencies>
dependencyManagement>
- 示例:引入Web开发相关的依赖(无需再指定版本,有spring-boot-dependencies定义)
<dependency>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-starter-webartifactid>
dependency>
2)打包运行
- 通过IDEA运行main方法
- maven插件运行:
mvn spring-boot:run
,需要添加spring-boot-maven-plugin
到pom.xml文件中
- 创建可执行的jar,需要添加
spring-boot-maven-plugin
到pom.xml文件中
- 打包命令:
mvn package
- 执行命令:
java -jar xxx.jar
- 注意事项:jar文件生成在target目录下,**…jar.original这个文件一般很小,这是打包可执行jar文件之前的原始jar
<build>
<plugins>
<plugin>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-maven-pluginartifactid>
plugin>
plugins>
build>
3)编写自己的程序代码
@SpringBootApplication
public class Example{
public static void main(String[] args){
SpringApplication.run(Example.class,args);
}
}
- SpringBoot中通用的约定:
- 注解扫描的包目录basePackage为启动类Main函数入口所在的宝路径;
- 配置文件约定classpath目录下的application.yml或者application.properties
- web开发的静态文件放在classpath,访问顺序依次是:
/META-INF/resources -> resources -> static -> public
- web开发中页面模板,约定放在classpath目录,/templates/目录下
3.1.2 系统配置自动装载机制
1. @SpringBootApplication注解
- 这个注册相当于三个注解的功能集成
@EnableAutoConfiguration
:启用SpringBoot的自动bean加载机制
@ComponentScan
:在应用程序所在的包上启用扫描
@Configuration
:允许在Spring中注册额外的bean或导入其他配置类
import org.springframework.boot.SpringApplication;
import org.springframwork.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application{
public static void main(String[] args){
SpringApplication.run(Application.class,args);
}
}
@SpringBootConfiguration
:在@Configuration基础上做了包装,多了一点功能。
2. 代码包扫描
1)扫描路径
- 如果在Application.java文件中设置了
@ComponentScan
,则默认会扫描@ComponentScan
注解的类所在的包,即Application所在的包——myapplicatoin包下的文件。
- 如果扫描其他的包需要在
@ComponentScan
注解中添加scanBasePackages
属性
@SpringBootApplication(scanBasePackages = {"com.study.springboot.**"})
2)默认的包结构及其作用
- 主程序Application.java放在根包,在其他类之上。
@SpringBootApplication
注解卸载主程序上。
- Spring对类的扫描默认仅涵盖主程序所在的包及子包。
3. 零Spring配置文件
- SpringBoot中建议放弃通过XML定义Spring应用程序,推荐在代码类上通过
@Configuration
实现配置。
- 如有需要,还可以通过
@ImportResource
来导入xml配置文件。
注:要使@Configuration
生效,你需要将它写在SpringBoot入口程序类上面,或者使用@EnableAutoConfiguration
或@SpringBootApplication
这两个注解来开启自动加载功能。
4. 个性化加载配置
5. 外部参数配置信息加载
1)加载方式
Spring应用程序可以通过属性文件,YAML文件,环境变量和命令行参数等方式的外部化参数配置
- (常用)启动时命令行传参 java -jar app.jar --name=“test”
- 例如:
java -jar app.jar --spring.profiles.active="dev"
- SpringBoot配置信息中的特殊值:
--SPRING_APPLICATION_JSON='{"name":"test"}'
- 注意符号可能需要转义,
--SPRING_APPLICATION_JSON="{\"spring.profiles.active\":\"test\"}"
- 如果是web应用,可以读取ServletConfig init参数
- 如果是web应用,可以读取ServletConText init参数
- JNDI属性来自java:comp/env
- Java系统属性(System.getProperties())
- 操作系统环境变量
- (常用)配置文件application.properties、application.yml、application-{profile}.properties、application-{profile}.yml
- (常用)
@PropertySource
注解导入的配置:@PropertuSource(value={“person.properties”})
- 程序入口通过SpringApplication.setDefaultProperties方法设定的参数配置
2)不同环境的配置
- 同一套代码要在开发环境、测试环境、生产环境部署,参数配置需要有大量修改才能适配相应的环境。
- 这时可以用yml配置多套的配置文件。
- 在yml中指定配置文件可使相应的配置生效
spring:
profiles:
active: test
- 也可以在没有application.yml的情况下通过传参配置
- 启动时命令行传参 java -jar app.jar --name=“test”
java -jar app.jar --spring.profiles.active="dev"
3)使用properties文件导入配置
- 在需要导入配置的类中添加
@PropertySource
注解。
- 使用
@Value
注解导入对应的配置参数。
name = com.study
age = 18
@Component
@PropertySource(value = {"boy.properties"})
public class MyPropertiesBean{
private String userName;
@Value("${age}")
private String age;
@Value("${name}")
private String name;
...
}
6. 环境化配置-profile
1) profile是什么机制
- Spring配置文件提供的一种隔离应用程序配置的方法,使其仅在特定环境中可用。
- 可通过profile指定Bean的应用环境(如开发、测试、生产等环境)。
- 可通过profile指定不同环境的配置参数值。
2)如何指定profile
- 通过配置参数spring.profiles.active来指定应用启用的profiles。默认default。
- 在环境变量中指定:jvm参数、命令行程序参数、application.properties中都可以
- 代码中指定:springApplication.setAdditionalProfiles(“dev,test”);
3)如何在开发中使用
- Configuration类或者Bean定义方法上,都可以通过添加@Profile(“dev”)注解,实现指定环境下生效。
- 配置文件中:…
7. 配置文件
1)配置文件可以存放在哪些位置
- 当前项目运行的盘符/config文件夹下面:
file:./config/
- 当前项目运行的目录下面(命令执行的所在目录):
file:./
- classpath下面的config文件夹:
classpath:/config
- classpath的根目录(我们平常就是用这种):
classpath:/
- 上述配置文件按优先级排列,排在上面的位置会覆盖优先级较低的配置。
2)自定义配置名称和存储路径
- spring.config.name(spring_config_name)=properties-file-name
- spring.config.location(spring_config_location)=classpath:/config/,file:./config/ (注:从右到左反序搜索)
- 必须将他们定义为环境属性,通常是操作系统环境变量,JVM参数或命令行参数。
8. 配置文件格式
- SpringBoot支持两种配置文件的格式:.properties、.yml
1)yaml语法精简版说明
- 大小写敏感
- 使用空格缩进表示层级(不要用TAB),同一层级的左侧对齐
- map键值对通过“:”分隔
- list列表元素通过“-”表示
spring:
datasource:
username:test
list:
-one
-two
2)properties示例
spring.datasource.username=test
server.port=8080
9. 参数使用
1)方式一
- 通过@Value("${my.name}")注解,将指定的参数配置注入到属性。
2)方式二
@Autowired
Environment environment;
environment.getProperty("name");
3)方式三
- 通过注解
@ConfigurationProperties(prefix="my")
将注解加在指定的类上,Spring会为实例对象的属性进行赋值,属性需有getters和setters方法。
3.1.3 Starter快速集成机制详解
1. Starter介绍
1)作用
- 启动器(Starter)包含许多依赖项,这些依赖项是使项目快速启动和运行所需的依赖项。
- 例如:通过配置
spring-boot-starter-data-redis
,可以快捷的使用Spring对Redis进行数据访问。
2)命名规范
- 官方开发的starter遵循类似的命名模式:
spring-boot-starter-*
- 第三方starter命名应当遵循
thirdpartyproject-spring-boot-starter
3)常用starter
- spring-boot-starter-jdbc
- spring-boot-starter-data-redis
- spring-boot-starter-web
- spring-boot-starter-actuator
2. Web开发示例
- 引入
spring-boot-starter-web
实现快速引入和启动,无需再进行繁杂的xml配置。
- 默认基于Tomcat容器运行,可通过修改pom.xml指定运行的容器。
<dependency>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-starter-webartifactid>
<exclusions>
<exclusion>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-starter-tomcatartifactid>
exclusion>
exclusions>
dependency>
<dependency>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-starter-jettyartifactid>
dependency>
3. 自研starter的步骤
- 建工程
- 引入spring-boot-start、spring-boot-autoconfigure、第三方jar
- 如需要生成配置元信息,加入spring-boot-configuration-processor依赖
- 编写自动配置类
- 配置发现配置文件:META-INF/spring.factories
- 打包发布
3.1.4 使用Actuator管理你的Spring程序
1. Actuator介绍
- Spring Boot Actuator提供Http(或JMX)端点来实现对应用程序的监视和管理、收集运行状况等功能。
引入spring-boot-starter-actuator
可启用这些功能
- 默认情况下,通过访问/actuator可以看到所有启用的端点,也可以通过配置修改这个路径地址。
例如修改为:management.endpoints.web.base-path=/manage
<dependency>
<groupid>org.springframework.bootgroupid>
<artifactid>spring-boot-starter-actuatorartifactid>
dependency>
2. 端点配置
- Spring Boot包含许多内置端点,允许添加自己的端点,可以配置端点是否对外开放或关闭。
-
设置默认关闭所有端点(默认开放启用了“health”和“info”)
- management.endpoints.enabled-by-default=false
-
启动指定的端点
- management.endpoint.
info
.enabled=true
-
数据缓存
- 端点自动缓存对不带任何参数的读取操作的响应。要配置端点缓存响应的时间量
- management.endpoint..cache.time-to-live=10s
- 需要使用对应的端点名称来代替
3. http端点配置
1)http配置
- 通过HTTP公开除了env和beans端点之外的所有内容
- management.endpoints.web.exposure.include=*
- management.endpoints.web.exposure.exclude=env,beans
2)CORS跨域支持(默认情况下禁用CORS支持)
- management.endpoints.web.cors.allowed-origins=http://example.com
- management.endpoints.web.cors.allowed-methods=GET,POST
3)修改ManagerServer服务器配置
- management.server.port=8081(如果设置为-1代表禁用http端点)
- management.server.address=127.0.0.1
- 可以配置和web服务使用不同的端口,同时绑定指定IP。(不同端口,代表启动多个tomcat容器)
4. 端点讲解
1)Health健康检查
- 访问
/actuator/health
查看程序中组件检查项的运行状况信息,在出现故障时能及时发现。
- Spring Boot默认提供了对Redis、RabbitMQ、DataSource、MongoDB等组件的检查项。
- 展示更详细内容(默认never)
- management.endpoint.health.show-details=never(或者when-authoried | always)
- 返回结果
- 如果有检查项处于非检查状态,http状态码为503,返回值为DOWN或者OUT_OF_SERVICE
- 如果没有检查出问题,返回http状态码200,返回值UP或者UNKNOWN
- 自定义健康检查项
- 实现HealthIndicator接口,通过spring实例化一个对象,Spring Boot会自动触发健康检查,并归入health的结果。
2)日志配置
- Spring Boot日志配置
logging.level.root=WARN
logging.level.org.springframework.web=DEBUG
logging.level.org.hibernate=ERROR
- 通过/actuator/loggers查看日志配置
- 运行时修改配置
curl -X POST -H 'Content-Type:application/json' -i 'http://127.0.0.1:8081/manage/loggers/ROOT' --data'{
"configuredlevel":"DEBUG"
}'
3)metrics
- Metrics是产生应用中很重要功能,简单可理解为对运行时具体功能的监控。Spring Boot中集成micrometer实现。
i. 支持查看哪些数据
- 通过/actuator/metrics查看所有支持的信息,/metrics/{requiredMetricName}查看指定某一项指标JVM内存、线程、GC信息、类加载情况、CPU指标、HTTP请求统计、Tomcat信息…等等
ii. 与监控系统的集成
- 支持将数据导出到:AppOptics、Atlas、Datadog、Dynatrace、Elastic、Ganglia、Grphite、Humio、influx、JMX、KairosDB、New Relic、Prometheus、SignalFx、Simple(in-memory)、StatsD、Wavefront
iii. 自定义监控指标
- 代码中注入MeterRegistry对象,然后进行手动注册
4)自定义端点
- 可以理解为“概念上类似SpringMVC的controller写法,却又是完全不同的一套API”
- 端点定义:
@Endpoint
或@WebEndpoint
或JmxEndpoint
- 端点操作:
@ReadOperation
、@WriteOperation
、@DeleteOperation
- 参数接收:web环境下添加
@Selector
@Endpoint(id="myEndpoint")
@Component
public class MyEndPoint{
String name = "default";
@ReadOperation
public String getName(){
return "{\"name\":\""+name+"\"}";
}
}
5. 快速理解JMX机制
- Java Management Extensions(JMX)提供了一种监控和管理应用程序的标准机制。
- tomcat、kafka、druid都是用的JMX技术来实现对外暴露管理接口和监控信息。
- 如何Jconsole工具通过JMX技术实现对应用的监控和管理?
- 通过Spring框架快速增加自定义Mbean
- 默认情况下,Spring Boot将管理端点公开为org.springframework.boot域下的JMX MBean。
- 通过JMX公开所有端点并仅显示端点health和info端点
- management.endpoints.jmx.exposure.exclude=*
- management.endpoints.jmx.exposure.include=info,health
3.1.5 命令行工具SpringBoot-CLI
1. CLI安装
1)下载
https://repo.spring.io/release/org/springframework/boot/spring-boot-cli/2.1.3.RELEASE/spring-boot-cli-2.1.3.RELEASE-bin.zip
2)解压到指定文件夹
|——bin 这个文件夹包含一个可执行命令spring
|——legal
|——lib 这里放着具体实现相关功能的一个依赖包(这个命令本质就是一个spring提供的可执行jar工具包)
|——shell-completion
|——bash
|——zsh
3)添加环境变量
- 类似JDK的环境变量添加,将bin目录添加到环境变量
4)检查是否安装成功
- 在bin目录下运行
spring --version
,输出版本信息则代表安装成功
2. 作用
1)通过Groovy快速开发
- 通过Groovy快速构建一个Spring Boot Web应用,创建一个hello.groovy
- Groovy语言java开发不太用,Android开发会使用
@RestController
class WebApplication{
@RequestMapping("/")
String home(){
"Hello World!"
}
}
spring run hello.groovy -- --server.port=9000
spring jar my-app.jar *.groovy
--include 打包时加入其它文件夹,默认加入(public/**,resources/**,static/**,templates/**,META-INF/**,*)
--exclude 打包时排除指定文件夹内容。默认排除(.*,repository/**,build/**,target/**,**/*.jar,**/*.groovy)
2)spring命令说明
3)项目构建
- 通过Spring Boot CLI快速构建一个SpringBoot项目
- 示例:创建名为study-project的项目,添加spring-boot-starter-web和spring-boot-starter-data-redis的依赖
spring init --dependencies=web,data-redis study-project
spring init --list
- 常用参数说明
–build=maven 指定源码管理工具
–packaging=war 打包形式
–java-version=1.8 指定JAVA版本