微服务开发框架之Spring Boot

Spring Boot简介及使用

目录

1.Spring Boot是什么

  • Spring Boot的由来
  • Spring Boot的特性
  • Spring Boot相关插件
  • Spring Boot应用场景

2.如何使用Spring Boot框架

  • 搭建Spring Boot开发框架
  • 开发一个简单的Spring Boot应用程序
  • 运行Spring Boot应用程序

3.SpringBoot生产级特性

  • 端点
  • 健康检查
  • 应用基本信息
  • 跨域
  • 外部配置
  • 远程监控

4.小结

Spring Boot是什么

Spring Boot是为生产及Spring应用而生的,他使得开发Spring应用程序更加高效、简介。那么、Spring
Boot具备哪些生产级特性呢?我们不妨从他的由来开始讲起。

Spring Boot的由来

在Spring1.0时代我们习惯于用XML来配置Bean,在XML文件中可以轻松的进行依赖注入,但当Bean的数量越来越多时,XML的配置也会越来越复杂,少者上百行,多则上千行。没人愿意维护一大段XML配置,紧接着Spring2.0很快来了,他在XML命名空间上做了一定的优化,让配置看起来尽可能的简单,但仍然没有彻底地解决配置上的问题。直到Spring3.0的出现,我们可以使用Spring提供的java注解来取代曾经的XML配置了,似乎我们都忘记了曾经发生过什么,Spring变得前所未有的简单。当Spring4.0出现后,我们甚至连XML配置文件安都不再需要了,完全使用java源码级别的配置与Spring提供的注解就能快速地开发出Spring应用程序。
尽管Spring4.0已经非常优秀了但仍然无法改变java Web应用程序的运行模式,也就是说我们仍然要将war包部署到Web Server上,才能对外提供服务,能否运行一个简单的main()方法就能启动一个Web Server呢?Spring Boot满足了我们的需求,我们下面就来全面了解Spring Boot的所有特性。

Spring Boot的特性

(1).可创建独立的Spring应用程序
使用Spring Boot所创建的应用程序都是一个个独立的jar包,而并非war包,即使是web应用也是jar包,这方面似乎带有一点颠覆性的味道,我们可以直接运行@SpringBootApplication注解的类的main()方法就能运行一个Spring应用程序,实际上是在Spring Boot应用程序内部嵌入了一个Web Server而已。当这些并不能说明Spring Boot就不能以war包的形式部署到Web Server中了,我们同样可以使用Spring Boot开发传统的Java Web应用。

(2)提供嵌入式Web Server(无须部署war包)
我们不再需要将war包部署到Web Server中,而是启动Spring Boot应用程序后,会在默认端口号8080下启动一个嵌入式Tomcat,也可以在Spring Boot提供的application.properties文件中配置具体的端口号。当然,除了Tomcat,Spring Boot还提供了Jetty,Undertow等嵌入式Web Server,我们可根据实际情况,自行在Maven配置文件中添加相关的Web Server的插件,Spring Boot的插件体系十分广泛。

(3).无任何代码生成技术也无任何XML配置
在某些开源框架中,会使用字节码生成技术(例如CGLib,Javassist,ASM等),在程序运行时动态地生成class文件并将其加载到JVM中,我们称这类行为叫做“代码生成技术”,在Spring Boot中没有任何的代码生成技术。此外,Spring Boot也不像传统Spring应用那样配置大量的XML文件,除了使用一个application.properties配置文件,SpringBoot再无其他配置文件了,而且所有插件的相关配置也在这个唯一的配置文件中。

(4).自动化配置
Spring Boot的配置都在 application.properties文件中,但并不意味在Spring Boot应用就必须包含该文件。实际上,该配置文件中包含了大量的配置项,而许多配置项都有其默认值,很多配置项我们其实都不用去修改,使用其默认值就行,这类行文叫作“自动化配置”,我们只需要使用Spring Boot提供的相关注解就能启动具体特性。这一特性实际上是由Spring Boot提供的一系列@ConditionalOnXxx条件注解来实现的,而底层使用了Spring4.0的Condition接口。

(5).提供一系列生产级特性
Spring Boot是为生产级Spring应用而生的,提供了大量的生产级特性,例如核心指标,健康检查,外部配置等,这类技术对微服务架构相当有价值。例如,核心指标指的是我们可以随时给Spring Boot应用发送/metrics请求,随后可获取一个JSON数据,包括内存,Java堆,类加载,处理器,线程池等信息。我们还能在Java命令行上直接运行Spring Boot应用,并带上外部配置参数,这些参数将覆盖已有的默认配置参数。甚至我们还能通过发送一个URL请求去关闭Spring Boot应用,在自动化技术中会有一定的帮助。

(6).提供开箱即用的Spring插件
Spring Boot提供了大量“开箱即用”的插件,我们只需添加一段Maven依赖配置即可开始使用。这些插件在Spring Boot的世界里有一个优雅的名字,叫作Starter。每个Starter可能都会有自己的配置项,而这些配置项都可在application.properties文件中进行统一配置。
Spring Boot是一个典型的“核心+插件”的系统架构,核心包含Spring最基础的功能,其他更多的功能都通过插件的方式来扩展。那么,Spring Boot拥有哪些方面的插件呢?

Spring Boot相关插件

Spring Boot官方提供了大量插件,涉及的面非常广,包括Web,SQL,NoSQL,安全,验证,缓存,消息队列,分布式事务,模板引擎,工作流程等,还提供了Cloud,Social,Ops方面的支持。此外,Spring Boot对某项技术提供了多种选型,比如:

  • SQLAPI——JDBC,JPA,JOOQ等;
  • 关系型数据库——MySql,PostgreSql等;
  • 内存数据库——H2,HSQLDB,Derby等;
  • NoSQL数据库——Redis,MongoDB,Cassandra等;
  • 消息列队——RabbitMQ,Artemis,HornetQ等;
  • 分布式事务——Atomikos,Bitronix等;
  • 模板引擎——Velocity,Freemarker,Mustache等;
    Spring官方还提供了一个名为“Spring Initialzr”的在线代码生成器,我们只需要选择自己想要的插件,就能一键下载相应的代码框架,如图:
    在这里插入图片描述
    IDEA也是支持Spring Initialzr的,如图:
    在这里插入图片描述
    Spring Boot拥有非常强大的插件体系,如此之多的插件,让我们在开发应用程序时如虎添翼,我们可以优先从这个强大的“插件库”中选择插件,如果现有的插件不够用或者不合适,我们还可以实现加入自己想要的插件。
    Spring Boot所提供的功能强大且实用,但Spring Boot并非适合开发任何应用场景。那么,那些应用场景比较适合使用Spring Boot呢?

Spring Boot的应用场景

(1),传统Web MVC架构
传统Web MVC架构比较适合用Spring Boot来开发,View层可使用JSP或其他模板引擎(例如Velocity),从View层发送请求到Spring的Controller,通过操纵数据库并将获取的数据封装进Model,最后将Model返回到View中。总之,SpringMVC能做到的,Spring Boot都能做到,因为Spring Boot在更高层面上对Spring MVC进行封装。

(2),前后端分离架构
在前后端分离架构中,后端可基于Spring Boot开发REST API,前端通过调用REST API来获取JSON数据,从而进行视图渲染,生成最终的HTML界面。实际上,移动端H5应用我们也可以采用类似的方法来实现。在前后端分离架构中,可能会遇到“跨域问题”,Spring Boot对跨域问题也做了非常好的支持。

(3),微服务架构
微服务架构要求我们对产品功能进行细粒度切分,且每个微服务之间需要使用轻量级技术进行通信,因此每个微服务需要对外提供轻量级API接口(例如REST API),使用Spring Boto发布REST API是最方便的。此外,Spring Boot还拥有一系列的生产级特性,它与微服务是天作之合,下面我们再通过几个简单的示例来展示一下Spring Boot的基本用法,让大家快速上手。

如何使用Spring Boot框架

不仅针对Spring Boot框架,其实学习任何框架的第一步都是搭建开发环境,然后尝试写一个“HelloWorld”应用程序并试图让他跑起来,最后才去探讨他的若干特性。我们现在就一起来搭建一个Spring Boot开发框架,充分体验一下Spring Boot给我们的开发带来快乐。

搭建Spring Boot开发框架

步骤1.使用IDEA搭建一个Maven项目,如图:
在这里插入图片描述
> 步骤2.填写相关信息,如图:
在这里插入图片描述
步骤3.选择相关插件,我只选了我需要的插件,Spring Boot还有很多优秀的插件,需要的可以自由选择。
.
Web的插件,如图:
在这里插入图片描述
模板插件,如图:
在这里插入图片描述
SQL插件,如图:
在这里插入图片描述
基本上就是以上5个插件
.
步骤4.把application.properties改为application.yml 如图:

#连接数据库
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/text?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 111111
    driver-class-name: com.mysql.jdbc.Driver

PS:Spring Boot会有一个时区报错建议在连接数据库这里添加如下代码:

//这是之前的代码
url: jdbc:mysql://localhost:3306/text?useUnicode=true&characterEncoding=utf-8
//这个是修改之后的代码
url: jdbc:mysql://localhost:3306/text?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8

这样就不会报错了

在这里插入图片描述
解决时间差问题,打开SQLyog:
SET GLOBAL time_zone=’+8:00’在这里插入图片描述
步骤5.创建控制层,运行测试,如图: 在这里插入图片描述

@Controller
public class ProductsController {

@RequestMapping("hello")
@ResponseBody
    public String hello(){
    return "hello";
}
}

运行结果如下:
在这里插入图片描述
步骤6.我们加入数据库和Web
在这里插入图片描述下面是代码快
`

控制层

@Controller
public class ProductsController {
    @Resource
    ProductsService productsService;
    @RequestMapping("productsList")
    public Object productsList(int pid){
        ModelAndView mav = new ModelAndView();
        mav.addObject("Products",productsService.queryProducts(pid));
        mav.setViewName("index");
        return mav;
    }
}

dao层

public interface ProductsDao {
    List<Products> queryProducts(@Param("pid")int pid);
   
    int iddProducts(Products products);
}

entity

public class Products {
    private Integer pid;
    private String name;
    private float price;
    private String description;

    public Integer getPid() {
        return pid;
    }

    public void setPid(Integer pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}


impl层

@Service
public class ProductsServiceImpl implements ProductsService {
    @Resource
    ProductsDao productsDao;
    @Override
    public List<Products> queryProducts(int pid) {
        return productsDao.queryProducts(pid);
    }
    /*@Transactional*/
}

index.html

<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table border="1">
    <tr>
        <td>id</td>
        <td>名称</td>
        <td>价格</td>
        <td>描述</td>
    </tr>
    <tr th:each="prd:${Products}">
        <td th:text="${prd.pid}"></td>
        <td th:text="${prd.name}"></td>
        <td th:text="${prd.price}"></td>
        <td th:text="${prd.description}"></td>
    </tr>
</table>
</body>
</html>

products.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.sb.springbootdemo1.dao.ProductsDao">
    <select id="queryProducts" resultType="Products">
        select * from products
        where pid = #{pid}
    </select>
</mapper>

application.yml

#连接数据库
spring:
  datasource:
    url: jdbc:mysql://localhost:3306/text?useUnicode=true&characterEncoding=utf-8
    username: root
    password: 111111
    driver-class-name: com.mysql.jdbc.Driver

#配置端口号,默认8080,配不配都行
server:
  port: 8080

#映射xml文件
#取别名
mybatis:
  mapper-locations: classpath:xml/*.xml
  type-aliases-package: com.sb.springbootdemo1.entity

数据库

CREATE TABLE `products` (
  `pid` INT(11) NOT NULL AUTO_INCREMENT,
  `name` VARCHAR(20) DEFAULT NULL,
  `price` FLOAT DEFAULT NULL,
  `description` VARCHAR(50) DEFAULT NULL,
  PRIMARY KEY (`pid`)
) ENGINE=INNODB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;

/*Data for the table `products` */

INSERT  INTO `products`(`pid`,`name`,`price`,`description`) VALUES (1,'烧饼',22,'阿斯顿发生'),(2,'长皮',2,'的说法地方');

运行结果如下:
在这里插入图片描述

Spring Boot生产级特性

Spring Boot提供了大量的开箱即用的插件,其中有一个名为Actuator的插件提供了大量的生产级特性、可以通过Maven配置使用该插件:

<!--Spring Boot开箱即用插件配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
            <scope>actuator</scope>
        </dependency>

在这里插入图片描述

添加以上Maven依赖后,我们重启Spring Boot应用程序,就能开启端点生产级特性了,那么什么是端点呢?我们下面就来探索一下。

端点
Spring Boot的Actuator插件提供了一系列HTTP请求,我们可以发送相应的请求,来获取Spring Boot应用程序的相关信息,这些HTTP请求都是GET类型的,而且不带任何请求参数,他们就是所谓的“端点”,也许他的英文名“Endpoint”更容易理解,Spring Boot的Actuator插件默认提供了以下端点。

端点描述
autoconfig获取自动配置信息
beans获取Spring Boot基本信息
configprops获取配置项信息
dump获取当前线程基本信息
env获取环境变量信息
health获取健康检查信息
info获取应用基本信息
metrics获取性能指标信息
mappings获取请求映射信息
trace获取请求调用信息

例如,我们在地址栏输入/metrics请求时,会看到如下结果:
上面包含了大量性能指标信息,包括内存、cpujava堆、线程、java类、JVM垃圾回收、HTTP会话等。
默认情况下以上端点都是开启的,我们可以随时访问,根据实际情况我们可以自由控制哪些端点需要启用,那些端点需要停用、也可以全部停用,仅启用某几个对我们有价值的端点。甚至还可以修改默认端点的名称,这有我们就可以通过自定义的HTTP请求路径来访问来访问这些端点了,这些开关都在application.properties文件中配置,下面我们给出几个有代表性的示例,描述端点的具体配置方法。

示例1:关闭metrics端点:

endponts.metrics.enabled-false
在浏览器上访问metrics端点时,将不会看到任何信息,只是一个“WEP”错误页面信息,对应的HTTP状态码为404。

示例2:关闭所有的端点仅开启metrics端点:

endponts.enabled=false endponts.metrics.enabled=true
现在只有metrics端点是启用的,访问其他端点会报错

示例3:修改metrics端点的请求路径:

endponts.metrics.id=porformance
这样我们就可以通过/porformance请求来访问以前的/metrics端点,此时在访问/metrics就会看到报错信息

示例4:修改metrics端点的请求路径:

endponts.metrics.path=/endponts/metrics
通过以上配置,我们需要再发送/endponts/metrics请求后才能访问metrics端点,如果我们想知道Spring
Boot为我们提供了那些端点,应该怎么做呢?

Spring Boot的HATEOAS插件为我们提供了帮助,实际上,HAEOAS超媒体(Hypermedia)技术,他也是REST应用程序架构的一种约束,通过它可以汇总端点信息,包括各个端点的名称与链接,开启HAEOTEOAS插件,只需要添加一下Maven依赖;

       <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-hateoas</artifactId>
        </dependency>

此后我们将拥有actuator端点,当我们在发送请/actuator求后,将看到所有的端点及其访问链接。
当然我们也可以配置actuator端点,例如:

#禁用actuator端点

endpoints.actuator.enabled=false

#设置actuator端点路径

endpoints.actuator.path=/endpoints/actuator

此外,Spring Boot还提供了一个名为“HAL Browser的图形化工具,用于更好的查看端点信息,只需要添加以下Maven依赖即可启用。

       <dependency>
            <groupId>org.webjars</groupId>
            <artifactId>hal-borowser</artifactId>
        </dependency>

当我们再次发送/actuator请求时,此时显示的将不是一段JSON数据,而是一个非常漂亮的图形化界面,如图:
我们可以在节面上访问任何端点,使用起来非常简单。
如果我们想进一步了解Actuator,可以开启Actuator文档插件,只需配置如下Maven依赖即可:

      <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-actuator-docs</artifactId>
        </dependency>

我们可以发送/docs请求,在浏览器中查看Actuator端点文档,如图:

健康检查

在Spring Boot提供的端点中,有一个名为“health的端点,用于查看应用当前运行状态,即应用的健康情况,检查应用的健康情况,我们简称为“健康检查”。有哪些与健康相关的指标需要进行检查呢?我们下面就来学习一下Spring Boot提供的健康检查功能,当我们在浏览器上发送/health请求后,将看到如图数据:

未待完续。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值