Spring Cloud微服务解决方案之Spring Boot

文章目录

第三章 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>
  	<!-- 从SpringBoot导入依赖关系管理 -->
  	<groupid>org.springframework.boot</groupid>
  	<artifactid>spring-boot-dependencies</artifactid>
  	<version>2.1.3.RELEASE</version>
  	<type>pom</type>
  	<scope>import</scope>
  </dependency>		
  </dependencies>
</dependencyManagement>
  • 示例:引入Web开发相关的依赖(无需再指定版本,有spring-boot-dependencies定义)
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
</dependency>
2)打包运行
  1. 通过IDEA运行main方法
  2. maven插件运行:mvn spring-boot:run ,需要添加spring-boot-maven-plugin到pom.xml文件中
  3. 创建可执行的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.boot</groupid>
      <artifactid>spring-boot-maven-plugin</artifactid>
    </plugin>
  </plugins>
</build>
3)编写自己的程序代码
  • 程序入口:Main方法
@SpringBootApplication
public class Example{
    public static void main(String[] args){
        SpringApplication.run(Example.class,args);
    }
}
  • SpringBoot中通用的约定:
    1. 注解扫描的包目录basePackage为启动类Main函数入口所在的宝路径;
    2. 配置文件约定classpath目录下的application.yml或者application.properties
    3. web开发的静态文件放在classpath,访问顺序依次是:
      /META-INF/resources -> resources -> static -> public
    4. 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  //same as @Configuration @EnableAutoConfiguration @ComponentScan
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)默认的包结构及其作用
  1. 主程序Application.java放在根包,在其他类之上。
  2. @SpringBootApplication注解卸载主程序上。
  3. 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注解导入对应的配置参数。
# boy.properties

name = com.study
age = 18
//java

@Component
@PropertySource(value = {"boy.properties"})
public class MyPropertiesBean{
    private String userName;
    
    @Value("${age}")
    private String age;
    
    @Value("${name}")
    private String name;
    
    ...
    //定义getter,setter方法
}
6. 环境化配置-profile
1) profile是什么机制
  1. Spring配置文件提供的一种隔离应用程序配置的方法,使其仅在特定环境中可用。
  2. 可通过profile指定Bean的应用环境(如开发、测试、生产等环境)。
  3. 可通过profile指定不同环境的配置参数值。
2)如何指定profile
  • 通过配置参数spring.profiles.active来指定应用启用的profiles。默认default。
    1. 在环境变量中指定:jvm参数、命令行程序参数、application.properties中都可以
    2. 代码中指定:springApplication.setAdditionalProfiles(“dev,test”);
3)如何在开发中使用
  1. Configuration类或者Bean定义方法上,都可以通过添加@Profile(“dev”)注解,实现指定环境下生效。
  2. 配置文件中:<bean…>…
7. 配置文件
1)配置文件可以存放在哪些位置
  1. 当前项目运行的盘符/config文件夹下面:file:./config/
  2. 当前项目运行的目录下面(命令执行的所在目录):file:./
  3. classpath下面的config文件夹:classpath:/config
  4. 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)方式二
  • 注入Environment对象。
//伪代码-注入env对象。
@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.boot</groupid>
  <artifactid>spring-boot-starter-web</artifactid>
  <exclusions>
  	<exclusion>
	  <groupid>org.springframework.boot</groupid>
      <artifactid>spring-boot-starter-tomcat</artifactid>
  	</exclusion>
  </exclusions>
</dependency>
<dependency>
  <groupid>org.springframework.boot</groupid>
  <artifactid>spring-boot-starter-jetty</artifactid>
</dependency>
3. 自研starter的步骤
  1. 建工程
  2. 引入spring-boot-start、spring-boot-autoconfigure、第三方jar
  3. 如需要生成配置元信息,加入spring-boot-configuration-processor依赖
  4. 编写自动配置类
  5. 配置发现配置文件:META-INF/spring.factories
  6. 打包发布
  • 看视频中的例子

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.boot</groupid>
  <artifactid>spring-boot-starter-actuator</artifactid>
</dependency>
2. 端点配置
  • Spring Boot包含许多内置端点,允许添加自己的端点,可以配置端点是否对外开放或关闭。
  1. 设置默认关闭所有端点(默认开放启用了“health”和“info”)

    • management.endpoints.enabled-by-default=false
  2. 启动指定的端点

    • management.endpoint.info.enabled=true
  3. 数据缓存

    • 端点自动缓存对不带任何参数的读取操作的响应。要配置端点缓存响应的时间量
    • 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@WebEndpointJmxEndpoint
  • 端点操作:@ReadOperation@WriteOperation@DeleteOperation
  • 参数接收:web环境下添加@Selector
@Endpoint(id="myEndpoint")
@Component
public class MyEndPoint{
	String name = "default";

	@ReadOperation
	public String getName(){
		//spring http端点的json格式
		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版本
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值