前言

本章我们主要从以下几个方面夯实我们的基础:

  1. 微框架 Spring Boot 的基本认识
  2. 实战学习 Spring Boot 的基本使用
  3. 多种方式获取 Spring Boot 配置
  4. 如何自定义一个 Starter
  5. 如何搭建一个 Spring Boot 的监控系统

什么是 Spring Boot

Spring Boot 简介

  1. 微框架,与 Spring 4 一起诞生,比如 RestController
  2. 可以快速上手,整合了一些子项目(开源框架或者第三方开源库)
  3. 可以依赖很少的配置就可以十分快速的搭建并且运行项目
  4. 基于 Spring,使开发者快速入门,门槛很低,(Spring 全家桶里面的一员)
  5. Spring Boot 可以创建独立运行的应用而不依赖于容器
  6. 不需要打包成 war 包,可以放到 Tomcat 中直接运行
  7. 提供 Maven 的极简配置,缺点就是会引入很多你不需要的包
  8. 根据项目来依赖,从而配置 Spring,需要什么配什么
  9. 提供可视化的相关功能,方便监控,比如性能、应用的健康程度等
  10. 简化配置,不用再看过多的 XML,通过去 XML 化,来引入注解化
  11. 为微服务 Spring Cloud 铺路,Spring Boot 可以整合很多格式各样的框架来构建微服务,比如 Dubbo、Thrift 等

Spring Boot 的亮点

我们知道,在 Spring Boot 中并没有新增什么新的技术。Spring Boot 是服务于 Spring 框架的框架,它有着 4 个亮点我们应该知道。

1. 自动装配

Spring Boot 会根据某些规则对所有配置的 Bean 进行初始化。可以减少了很多重复性的工作。比如使用 MongoDB 时,只需要在 pom.xml 中加入 MongoDB 的 Starter 包,然后配置 MongoDB 的连接信息,就可以直接使用 MongoTemplate 自动装配来操作数据库了。

2. 内嵌容器

Spring Boot 应用程序可以不用部署到外部容器中,比如 Tomcat。Spring Boot 应用程序可以直接通过 Maven 命令编译成可执行的 jar 包,通过 java-jar 命令启动即可,非常方便。

3. 应用监控

Spring Boot 中自带监控功能 Actuator,可以实现对程序内部运行情况进行监控,比如 Bean 加载情况、环境变量、日志信息、线程信息等。当然也可以自定义跟业务相关的监控,通过 Actuator 的端点信息进行暴露。

4. Starter 包简化框架集成难度

将 Bean 的自动装配逻辑封装在 Starter 包内部,同时也简化了 Maven Jar 包的依赖,对框架的集成只需要加入一个 Starter 包的配置,降低了烦琐配置的出错几率。

Spring Boot 的基本使用

创建 Spring Boot 项目

第一种方式:https://start.spring.io/。

第二种方式:通过 IDEA 创建 Spring Boot 项目。

1. 创建新项目:

2. 选择构建方式和 JDK 版本:

3. 填写项目相关信息:

4. 选择依赖:

5. 点击 NEXT,点击 FINISH 后,我们得到项目结构如下:

第一步,我们打开 pom.xml 文件:

我们可以看到此时我们使用的 Spring Boot 的版本是 2.3.0.RELEASE。

第二步,我们需要对项目进行配置,我们添加一个 application.properties 文件,我们首先来配置一下 Tomcat 的端口号,当然端口号我们也可以不配置,默认为 8080。

application.properties

server.port=8888

第三步,我们创建一个简单的 Controller,老规矩,HelloWorld 走起。

最后一步,我们只需要运行 Spring Boot 的启动类即可。

启动类 SpringcloudstudyApplication:

启动日志:

我们看到 端口号为:8888。

然后我们在地址栏中输入 localhost:8888/hello

至此,一个简单的 Spring Boot 项目已经创建成功。

如何获取 Spring Boot 项目配置文件中配置的属性值

配置启动属性

我们在实际的项目中,经常会有多个配置文件,比如我们在本地开发的时候,我们需要连接本地数据库。上传到测试服务器上的时候,需要连接测试服务器的数据库。部署到正式服务器上的时候,我们又会连接正式库。

如果我们只有一个配置文件,那么我们每次发布的时候都要手动修改配置文件,实在是太麻烦了,而且很容易出错。

如何解决呢?

在 Spring Boot 中,我们可以为本地,测试服,正式服,都定义一个单独的配置文件,然后在 application.properties 中配置 spring.profiles.active 来确定我们应该使用哪一个配置文件。

我们来创建两个配置文件 application-test.properties、application-dev.properties。

application-test.properties

server.port=8888

application-dev.properties

server.port=6666

application.properties

spring.profiles.active=dev

此时我们来运行 Spring Boot 启动类:

我们发现此时的端口号已经变成 6666,也就是说我们的配置生效了。

代码中获取配置的属性值

那么我们如何在代码中获取到配置的属性值呢?在 Spring Boot 中获取配置属性值的方式有三种:

  1. @value 注解
  2. @ConfigurationProperties
  3. Environment

@value 注解

@Value 是比较常见的注入方式,功能强大但一般可读性较差。

我们创建一个 ConfigurationController,代码如下:

在 ConfigurationController 中定义一个 port 字段,在 port 上使用 @Value 注入当前项目的端口值,冒号后面是在无值的情况下给的默认值,避免没配置值的报错问题。

首先,我们配置文件中配置 spring.name=ToBeTopJavaer 时,我们来启动项目,运行 localhost:9999/config

然后我们将配置文件中的 spring.name=ToBeTopJavaer 去掉,我们来启动项目,运行 localhost:9999/config

我们发现值已经变成了注解中的默认值了。

Environment

通过注入获取 Environment 对象,然后再获取定义在配置文件的属性值。

代码如下:

@ConfigurationProperties

@ConfigurationProperties 作用在类上,用于注入 Bean 属性,然后再通过当前 Bean 获取注入值。

首先我们定义一个 Person 类:

配置文件:

Controller:

然后我们来启动项目,运行 localhost:9999/config:

我们看到,我们已经将 java.name 的值读了出来。

如何自定义一个 Starter

Starter 可以说是 Spring Boot 的一个核心功能。

我们知道,当我们搭建一个项目的时候,我们需要依赖很多的 jar 包,即使使用的 Maven 我们也还是需要在 pom.xml 中写入很多的 XML 来引入 jar 包。

Starter 的出现,改变了现状,我们只要在 xml 中引入相关的 Starter 就行。但是并非说我们不需要引入别的 jar 包,只是我们通过了 Starter 自动配置我们需要的相关 jar 包,Starter 相当于个开关或是启动器,当我们引入的时候,就相当于打开或者启动了跟我们引入的 Starter 相关 jar 包的自动配置,而不需要我们在一个个的自己去写引入。

那么如果我们想将我们自己写的某个功能模块变成 Starter,当我们在别的功能模块需要引用的时候,只需要引入这个 Starter 就行,我们改如何操作呢?

首先我自己总结了下自定义个 Starter 的步骤,分为以下几步:

  1. 创建一个 MyStarter 的工程
  2. 创建一个配置类
  3. 创建一个自动配置类,实现 bean 的自动装配
  4. 创建 spring.factories,在 Spring Boot 启动时会根据此文件来加载项目的自动化配置类
  5. (非必须)创建一个配置提示文件 spring-configuration-metadata.json,可以在我们启动项目时,在控制台中提示我们该 Starter 的作用

下面我们开始动手实现我们自己的 Starter。

首先我们按照上述创建 Spring Boot 项目的步骤新建一个 MyStarter 工程,创建好后,工程结构如下:

Pom.xml

第二步,编写一个实体类映射信息 OrderProperties 类,使用@ConfigurationProperties 来注入配置信息,然后定义一个 OrderService 类。

OrderProperties

第三步,编写一个配置类,用于装配 OrderService,将 OrderService 类托管到 IOC 容器中。

第四步,最重要的一步,开启自动装配功能。

最后一步,也是最重要的一步,新建 META-INF 文件夹,然后创建 spring.factories 文件,里面指定需要被装配的类。

spring.factories

最后在 mystarter 工程中执行 mvn clean install 即可。

打开上面我们创建的 springcloudstudy 工程,在 pom 文件中引入刚刚自定义的 Starter,即可。

Spring Boot 监控

Spring Boot Admin 是一个开源的 Web 项目,用于管理和监控 Spring Boot 应用程序的运行状态。在 Spring Boot 项目中可以通过集成 Spring Boot Admin Client 向 Spring Boot Admin Server 进行注册,这样我们就可以在 Spring Boot Admin Server 统一管理 Spring Boot 应用。

Spring Boot Admin 的主要功能点:

  • 显示健康状况
  • 显示细节
  • 显示生成信息号
  • 跟踪并下载日志文件
  • 查看 JVM 系统 & 环境属性
  • 查看 Spring Boot 配置属性
  • 支持 Spring Cloud 的 postable/env-&/ 刷新端点
  • 简单的日志级管理
  • 与 jmx-bean 交互
  • 查看线程转储
  • 查看 HTTP 跟踪
  • 查看审计事件
  • 查看 HTTP 端点
  • 查看计划任务
  • 查看和删除活动会话(使用 Spring 会话)
  • 查看天桥/Liquibase 数据库迁移
  • 下载堆转储
  • 关于状态更改的通知(通过电子邮件、Sack、Hipchat)
  • 状态更改事件日志(非持久性)

下面我们就来搭建一下 Spring Boot Admin。

第一步,我们先建一个 Admin-Server 的项目,用来启动 Spring-Boot-Admin 服务,我们需要在 pom.xml 文件中引用 spring-boot-admin-starter-server 的依赖。然后我们需要在启动类上增加 @EnableAdminServer 的注解,最后启用 Spring Boot Admin Server。

pom.xml

配置文件 application.yml:

启动类 AdminServerApplication:

启动成功后,我们登陆 localhost:9999:

此时我们发现应用数,实例数都为 0。

接下来我们创建一个 Admin-Client 项目,用来向 Spring-Boot-Admin 注册服务或者实例,我们需要在 pom.xml 文件中引用 spring-boot-admin-starter-client 的依赖。然后我们需要在启配置文件指定 Spring-Boot-Admin 的服务地址,最后启用 Admin-Client。

pom.xml

配置文件 application.yml:

我们启动成功后去刷新之前的界面:

现在我们的 Admin-Client 服务实例已经注册到了 Admin-Server 上了。

我们点击 Wallboard 进去查看详细信息,界面如下:

里面的指标很多,就不一一介绍,希望同学们能在日后的工作中,慢慢的了解和学习。

总结

本文主要是带领大家回顾一下日常工作中经常使用的 Spring Boot 常规知识点,从对 Spring Boot 的基本认识到基本使用,以及如何自定义一个自己的 Starter,最后还帮助大家搭建了一个 Spring Boot Admin 项目用来监控项目的基本健康情况。

学无止境,大家再接再厉,努力学习,早日成为大牛。

本文首发于公众号【ToBeTopJavaer】,《深入SpringCloud微服务》系列正在激情连载中,大家一起努力!!!

深入SpringCloud微服务

原创不易,如果大家喜欢,赏个三连吧。和大家一起成为这世界上最优秀的人。

hget如何获取多个value_《深入微服务》之 如何给老婆解释什么是微服务的基础框架SpringBoot?...相关推荐

  1. .metadata是什么项目文件_《深入微服务》之 如何给老婆解释什么是微服务的基础框架SpringBoot?

    前言 本章我们主要从以下几个方面夯实我们的基础: 微框架 Spring Boot 的基本认识 实战学习 Spring Boot 的基本使用 多种方式获取 Spring Boot 配置 如何自定义一个 ...

  2. 获取网关_阿里二面问了这道题:如何设计一个微服务网关系统

    有一天隔壁组的小王灰头土脸的跑过来,问我说:"李哥,你会设计微服务网关系统吗?".我一愣,小王怎么突然问这么抽象的问题,关键是我们最近也没有这样的需求.吃午饭的时候,在我旁敲侧击的 ...

  3. java深入微服务原理改造房产销售平台,Java深入微服务原理改造房产销售平台

    端午大礼包,等你来拿 今天推送的教程是:Java深入微服务原理改造房产销售平台 Java深入微服务原理改造房产销售平台 微服务是近年来非常流行的架构,是后端资深开发工程师必备技能.本课程将基于房产销售 ...

  4. 深入微服务 API 网关之架构实践篇

    以下文章来源方志朋的博客,回复"666"获面试宝典 随着这些年微服务的流行,API网关已经成为微服务架构中不可或缺的一环.一方面它承担着服务对外的唯一门户,一方面它提取了许多应用的 ...

  5. 技术分享|“单身”还是“入微”?一起聊聊微服务的二三事

    云原生技术分享系列内容第三篇之--微服务架构篇. 感兴趣的朋友也可以去看行云创新关于云原生技术介绍的其它文章: <关于容器最通俗的解释,人人都能三分钟搞懂> <技术分享|关于K8S的 ...

  6. 微服务架构(二):融入微服务的企业集成架构

    上一篇文章介绍了微服务架构的起源.定义.通用特性.常见概念误区.微服务架构与SOA架构比较.微服务架构收益以及企业引入微服务架构的策略. 本文将介绍融入微服务的企业集成架构的演进,并描述交互式系统的微 ...

  7. 前沿对话 | 深育大讲堂之深入云原生时代微服务架构

    傅先全:深信服云计算认证专家,产业教育中心资深讲师,曾任职于中国电信集团.华晟经世教育集团,分别担任云平台资深架构师.IT课程总监及名师团金牌讲师.多所高校特聘专家讲师:十余年云计算.大数据行业从业经 ...

  8. 获取颜色的更深级和更浅级颜色

    获取颜色的更深级和更浅级颜色 预览效果: .content div{height: 100px;width: 100px;margin: 10px;float: left;text-align: ce ...

  9. 微服务实战(三):深入微服务架构的进程间通信

    http://dockone.io/article/549 简介 在单体式应用中,各个模块之间的调用是通过编程语言级别的方法或者函数来实现的.但是一个基于微服务的分布式应用是运行在多台机器上的.一般来 ...

最新文章

  1. cookie、session总结
  2. 【新产品发布】EVC9001 USB 隔离器
  3. c++中的void指针和const指针
  4. MATLAB可视化实战系列(二十八)-贪心算法求快速平方根倒数算法中的“魔术数字”【含matlab源代码】
  5. 为什么WebUI里新建任务的状态字段下拉框里没有released选项
  6. Golang实践录:静态资源文件整合:web服务
  7. 主成份分析(PCA)——原理、实现步骤
  8. 业务测试用例模版与大数据测试用例模板
  9. 关于idea导入项目不能运行的原因
  10. 编程必备基础知识-计算机组成原理-概述篇
  11. SCDM学习笔记(6)
  12. 【39】给定一个无重的数组 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的数字可以无限制重复
  13. miui9免解锁root,Miui解锁
  14. Java的环境变量在哪个文件夹_Java设置环境变量
  15. http://level3.tasteless.eu/ 获得服务器目录及其内部文件信息
  16. 黑产和灰产的区别在于那里
  17. 收藏!转型AI工程师必读
  18. C#WinForm 程序退出后,托盘区的图标不能及时消失
  19. MQ(二)RabbitMQ快速入门
  20. 蓝牙麦克风 android,带有蓝牙麦克风的Android语音识别器

热门文章

  1. c mysql清理日志文件_MySQL 一般查询日志或者慢查询日志历史数据的清理
  2. c++读取.dat文件_Python之旅,Day5 - 文件操作
  3. python下载安装-Python下载安装
  4. python编程入门视频-Python编程入门电子书及视频教程-非常详细『强烈推荐』
  5. 零基础适合学python吗-零基础更适合学习Java还是python?
  6. python和c语言的区别-python和c语言的区别是什么
  7. python必背代码-Python高手必修课:如何让 Python 代码更易读,推荐收藏
  8. python是什么课程-python课程体系是怎么样的?
  9. 如何系统的自学python-如何系统学习python
  10. 【百度贾磊】汉语语音识别技术重大突破:LSTM+CTC详解(22PPT)