天天看点

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

一、概述

Spring Boot Actuator是Spring Boot的子项目。使用它无需特别配置,即可为应用增加一些生产级别的服务。本教程展示使用Eclipse + Maven来从零开始构建一个RESTful的应用。

该应用作用是访问http://localhost:8080/fuck?name=xxx,会返回json字符串,并且访问http://localhost:8080/metrics 可以看到应用堆的一些信息。

什么是Spring Boot Actuator?

Actuator是个机器术语,目前没有统一的翻译,可以直译为促动器,Actuator通过微小的改变就可产生很大的移动。

Spring Boot Actuator为你的应用提供一些生产环境很需要的特性,如审计,健康和数据采集等。使你可以在部署应用到生产环境后,通过HTTP(需要SpringMVC),JMX甚至remote shell(SSH, Telnet)等来管理和监视应用。例如,HTTP环境下,访问 contextUrl/health 路径即可查询当前环境的磁盘空间,应用和数据库的状态等;访问contextUrl/metrics路径即可查询当前jvm的内存使用情况,线程池的状态等。

二、环境准备

1. 安装jdk8(Eclipse Neon要求jdk1.8)

https://java.com/zh_CN/download/

2. 安装eclipse,推荐安装Mars或者最新版的Neon

http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/marsr

or

http://www.eclipse.org/downloads/packages/eclipse-ide-java-ee-developers/neonr

3. 安装maven,必须要3.0之后的版本,推荐安装3.3.9

https://maven.apache.org/download.cgi

4. 在eclipse中配置好jdk和maven

5. 安装spring ide插件到Eclipse中:

https://marketplace.eclipse.org/content/spring-ide

或Eclipse Marketplace上直接搜索spring ide

※ 如果无法安装,请不要使用Eclipse Marketplace,而使用Install New software,并输入下面地址,安装时选择select all。

■ Neon:

http://dist.springsource.com/release/TOOLS/update/e4.6/

■Mars:

http://dist.springsource.com/release/TOOLS/update/e4.5/

如果此插件装不上,请直接看下文“四、操作指南2 - 使用Eclipse + maven插件构建”

三、操作指南1 - 使用Eclipse + SpringIDE插件构建

1. Eclipse中新建Spring Starter Project

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

并命名为restdemo

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

选择Boot版本为1.3.6,依赖选择Actuator和Web

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

然后点finish完成创建。

2. 查看项目结构

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

3. 创建类文件

3.1 查看Spring插件自动为我们生成的主类文件RestdemoApplication.java:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class RestdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(RestdemoApplication.class, args);
    }
}
           

※ @SpringBootApplication注解根据classpath中的内容为项目提供自动配置。在本应用中,它相当于:@Configuration,

@EnableAutoConfiguration, @ComponentScan三者联合。

3.2 在com.example包下创建form文件Fuck.java,内容如下:

package com.example;

/** 
* @ClassName: Fuck 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author LIUYUEFENG559 
* @date 2016年7月11日 下午2:38:22  
*/
public class Fuck {
    private final long id;
    private final String content;

    public Fuck(long id, String content) {
        this.id = id;
        this.content = content;
    }

    public long getId() {
        return id;
    }

    public String getContent() {
        return content;
    }
}
           

3.3 在com.example包下创建controller:FuckController.java,内容如下:

package com.example;

import java.util.concurrent.atomic.AtomicLong;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

/** 
* @ClassName: FuckController 
* @Description: TODO(这里用一句话描述这个类的作用) 
* @author LIUYUEFENG559 
* @date 2016年7月11日 下午2:40:12  
*/
@Controller
@RequestMapping("/fuck")
public class FuckController {
    private static final String template = "Hi, %s! Let's fuck the GFW, the government and damn 狗日的方滨兴! ";
    private final AtomicLong counter = new AtomicLong();

    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody Fuck sayFuck(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name) {
        return new Fuck(counter.incrementAndGet(),
                String.format(template, name));
    }
}
           

4. 运行项目:右键->Run as -> Spring Boot App,控制台显示内容如下时表示成功运行。

.   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v1.3.6.RELEASE)
 ...
 2016-07-11 14:46:36.700  INFO 11648 --- [           main] com.example.RestdemoApplication          : Started RestdemoApplication in 7.7 seconds (JVM running for 8.844)
           

※ 等同于使用mvn -Dmaven.test.skip=true package spring-boot:repackage 命令编译成可独立运行的jar包,然后使用jar -jar xxx.jar来启动应用。

使用 mvn clean package打包的jar是无法运行的。

5. 在浏览器上访问http://localhost:8080/fuck查看输出:

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

6. 外部化属性文件

Spring Boot按照如下顺序加载属性:

(一) 命令行参数。如:java -jar app.jar –name=”Spring”

(二) SPRING_APPLICATION_JSON。如java -Dspring.application.json=’{“foo”:”bar”}’ -jar myapp.jar

(三) 来自于java:comp/env的JNDI属性

(四) Java System properties (System.getProperties()).

(五) OS环境变量

(六) 只有在random.*里包含的属性会产生一个RandomValuePropertySource

(七) jar包外部的,由profile指定的application properties文件(application-{profile}.properties或YAML文件)

(八) jar包内部的,由profile指定的application properties文件(application-{profile}.properties或YAML文件)

(九) jar包外部的application properties(application.properties和YAML)。

(十) jar包内部的application properties(application.properties和YAML)。

(十一) @Configuration注解类内部的@PropertySource注解

(十二) 由SpringApplication.setDefaultProperties设置的默认属性

什么是YAML?

YAML是JSON的超集,比XML文件更易读,非常适合定义层级化配置数据。YAML文件后缀为yml或者ymal,Eclipse中可以安装YEdit插件来编辑YAML文件。

典型的YAML文件内容格式如下:

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考
引入SnakeYAML库会使SpringApplication类自动支持YAML。使用spring-boot-starter会自动引入YAML。

因此在本例子中,可以将template字符串配置到属性文件中。修改application.properties如下:

server.port=
fuck.sentence=Hi, %s! Let's fuck the GFW, the government and damn \u72D7\u65E5\u7684\u65B9\u6EE8\u5174! 
           

修改FuckController如下:

@Controller
@RequestMapping("/fuck")
public class FuckController {
    // private static final String template = "Hi, %s! Let's fuck the GFW, the
    // government and damn 狗日的方滨兴! ";
    private final AtomicLong counter = new AtomicLong();

    @Value("${fuck.sentence}")
    private String template;

    @RequestMapping(method = RequestMethod.GET)
    public @ResponseBody Fuck sayFuck(
            @RequestParam(value = "name", required = false, defaultValue = "Stranger") String name) {
        return new Fuck(counter.incrementAndGet(),
                String.format(template, name));
    }
}
           

再次运行后结果同第5步。

7.将项目打包成可部署的war包,而非可运行的jar包

7.1 提供一个SpringBootServletInitializer的实现类并覆盖configure方法

这样将得到Spring框架的Servlet3.0支持,并且可以在应用被servlet容器启动前进行一些配置。典型的实现方法是让应用的主类集成SpringBootServletInitializer 。

本例修改RestdemoApplication类如下:

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.context.web.SpringBootServletInitializer;

@SpringBootApplication
public class RestdemoApplication extends SpringBootServletInitializer {

    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        return builder.sources(RestdemoApplication.class);
    }

    public static void main(String[] args) {
        SpringApplication.run(RestdemoApplication.class, args);
    }
}
           
※ 若使用3.0以前的servlet,容器并不支持ServletContextInitializer。这时需要增加web.xml,并在web.xml中配置DispatcherServlet来加载ApplicationContext。

7.2 修改pom文件,将打包格式改为war,并且将嵌入式servlet容器的依赖范围改为provided

这样可以防止嵌入式servlet容器与war包要被部署到的servlet容器相互干扰。

本例中修改pom如下:

<packaging>war</packaging>
...
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <scope>provided</scope>
</dependency>
           

7.3 打包war包,并部署到tomcat中

mvn clean package打包成war后放到tomcat的webapps文件夹下即可。

四、操作指南2 - 使用Eclipse + maven插件构建

1. Eclipse中新建maven项目

新建 -> Maven -> Maven Project -> Create a simple project

Spring Boot示例 - 1. 使用Spring Boot Actuator构建RESTful web service四、操作指南2 - 使用Eclipse + maven插件构建五、参考

2. 修改pom文件

修改pom文件加入以下内容:

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.6.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
           

3. 创建类文件

将步骤三中所示的三个java文件(Fuck.java, FuckController.java, RestdemoApplication.java)及对应的package拷贝到src/main/java下

4. 创建属性文件

将步骤三中所示的application.properties文件拷贝到src/main/resources目录下。

5. Alt + F5 更新restdemo2项目的依赖

6. maven编译项目

项目名右键 -> run as -> Maven build… , 在goal中填入”spring-boot:run”,点击运行。

还可以这样运行:

可以在命令行使用 mvn spring-boot:run 来编译运行应用。

也可以使用mvn clean package将应用打包成fat jar包后,使用java jar xxx.jar包来运行应用。

五、参考

链接

https://spring.io/guides/gs/actuator-service/

https://spring.io/blog/2015/03/18/spring-boot-support-in-spring-tool-suite-3-6-4

http://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/

继续阅读