微服务架构 spring boot 那些最基础的知识点

1、建立SpringBoot项目

概念

Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员再也不须要定义样板化的配置。经过这种方式,Spring Boot致力于在蓬勃发展的快速应用开发领域(rapid application development)成为领导者。css

Spring Boot特色

  1. 建立独立的Spring应用程序
  2. 嵌入的Tomcat,无需部署WAR文件
  3. 简化Maven配置
  4. 自动配置Spring
  5. 提供生产就绪型功能,如指标,健康检查和外部配置
  6. 绝对没有代码生成和对XML没有要求配置

构建Spring Boot项目

(1)建立项目,选择Spring starter Project(需先在Eclipse安装Spring Tool Suite),按Next:
这里写图片描述html

(2)填写跟项目相关的各类信息,而后Next:
这里写图片描述java

(3)选择须要的Dependency,而后Next:
这里写图片描述
(4)最后”Finish”,就开始下载jar包了,这个过程须要的时间比较长。nginx

运行项目

项目结构介绍

这里写图片描述

如上图所示,Spring Boot的基础结构共三个文件:web

  1. src/main/java 程序开发以及主程序入口
  2. src/main/resources 配置文件
  3. src/test/java 测试程序

另外,spingboot建议的目录结果以下:
root package结构:com.example.myprojectspring

com
  +- example
    +- myproject
      +- Application.java
      | +- domain |  +- Customer.java
      | +- CustomerRepository.java |
      +- service
      | +- CustomerService.java |
      +- controller
      | +- CustomerController.java |复制代码

一、Application.java 建议放到根目录下面,主要用于作一些框架配置
二、domain目录主要用于实体(Entity)与数据访问层(Repository)
三、service 层主要是业务类代码
四、controller 负责页面访问控制apache

pom.xml

pom.xml文件中默认有两个模块:json

spring-boot-starter :核心模块,包括自动配置支持、日志和YAML;api

spring-boot-starter-test :测试模块,包括JUnit、Hamcrest、Mockito。浏览器

启动单个controller

1,建立controller

package com.ailianshuo.helloword.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }
}复制代码

@RestController 的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了

2,启动controller准备
按上面的代码还不能启动单个controller,须要添加下面代码才能够:
(1)@EnableAutoConfiguration :做用在于让 Spring Boot 根据应用所声明的依赖来对 Spring 框架进行自动配置,这就减小了开发人员的工做量。(也可使用@SpringBootApplication 等价于以默认属性使用 @Configuration , @EnableAutoConfiguration 和 @ComponentScan)
(2)启动程序:
public static void main(String[] args) throws Exception {
SpringApplication.run(**.class, args);
}
完整代码以下:

@EnableAutoConfiguration
@RestController
public class HelloWorldController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello World";
    }

    public static void main(String[] args) {  
           SpringApplication.run(HelloWorldController.class);  
    } 
}复制代码

3,启动单个controller
(1)右键HelloWorldController中的main方法,Run As -> Spring Boot App,项目就能够启动了。

这里写图片描述

(2) 编译器显示以下内容,即为启动成功。
2017-08-19 11:12:49.814 INFO 4164 — [ main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8080 (http)
2017-08-19 11:12:49.819 INFO 4164 — [ main] c.a.h.controller.HelloWorldController : Started HelloWorldController in 3.351 seconds (JVM running for 4.573)

(3)在浏览器访问http://localhost:8080/hello ,就能够看到效果了。

在此我向你们推荐一个架构学习交流群。交流学习群号:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

2、RESTfull API简单项目的快速搭建

编辑pom.xml

[html] view plain copy

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  4. <modelVersion>4.0.0</modelVersion>
  5. <groupId>com.lyw</groupId>
  6. <artifactId>springboot02</artifactId>
  7. <version>0.0.1-SNAPSHOT</version>
  8. <packaging>jar</packaging>
  9. <name>springboot02</name>
  10. <parent>
  11. <groupId>org.springframework.boot</groupId>
  12. <artifactId>spring-boot-starter-parent</artifactId>
  13. <version>1.4.0.RELEASE</version>
  14. <relativePath/> <!-- lookup parent from repository -->
  15. </parent>
  16. <properties>
  17. <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  18. <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  19. <java.version>1.8</java.version>
  20. </properties>
  21. <dependencies>
  22. <dependency>
  23. <groupId>org.springframework.boot</groupId>
  24. <artifactId>spring-boot-starter-web</artifactId>
  25. </dependency>
  26. <dependency>
  27. <groupId>org.springframework.boot</groupId>
  28. <artifactId>spring-boot-starter-test</artifactId>
  29. <scope>test</scope>
  30. </dependency>
  31. <dependency>
  32. <groupId>org.springframework.boot</groupId>
  33. <artifactId>spring-boot-devtools</artifactId>
  34. </dependency>
  35. </dependencies>
  36. <build>
  37. <plugins>
  38. <plugin>
  39. <groupId>org.springframework.boot</groupId>
  40. <artifactId>spring-boot-maven-plugin</artifactId>
  41. </plugin>
  42. </plugins>
  43. </build>
  44. </project>

简单解释一下上面的配置

首先看看Spring-boot-start-web包的依赖

能够看到 其实这个包就是一些 日志包 还有内置Tomcat JSON包 SpringMVC/Web包 这也就差很少解释了为何直接跑起来了

其实这个就是能够理解为简单封装了一下Spring 使得咱们配置更加便捷。

spring-boot-devtools的引入,其依赖包的学习

这个包 包含一些Spring的核心包。。。

spring-boot-maven-plugin 最后还加入了 一个SpringBoot的Maven插件

开始写代码。。。

Springboot2Application.java

[java] view plain copy

  1. package com.lyw;
  2. import org.springframework.boot.SpringApplication;
  3. import org.springframework.boot.autoconfigure.SpringBootApplication;
  4. @SpringBootApplication
  5. public class Springboot02Application {
  6. public static void main(String[] args) {
  7. SpringApplication.run(Springboot02Application.class, args);
  8. }
  9. }

User.java

[java] view plain copy

  1. package com.lyw.bean;
  2. import java.util.Date;
  3. /**
  4. * Title: User Description: 实体类 Company: blog.csdn.net/lu1005287365/
  5. *
  6. * @author L lulu
  7. */
  8. public class User {
  9. private Integer id;
  10. private String name;
  11. private Date date;
  12. private char sex;
  13. public Integer getId() {
  14. return id;
  15. }
  16. public void setId(Integer id) {
  17. this.id = id;
  18. }
  19. public String getName() {
  20. return name;
  21. }
  22. public void setName(String name) {
  23. this.name = name;
  24. }
  25. public Date getDate() {
  26. return date;
  27. }
  28. public void setDate(Date date) {
  29. this.date = date;
  30. }
  31. public char getSex() {
  32. return sex;
  33. }
  34. public void setSex(char sex) {
  35. this.sex = sex;
  36. }
  37. }



UserControoler.java

[java] view plain copy

  1. package com.lyw.controller;
  2. import java.util.Date;
  3. import java.util.HashMap;
  4. import java.util.Map;
  5. import org.springframework.web.bind.annotation.PathVariable;
  6. import org.springframework.web.bind.annotation.RequestMapping;
  7. import org.springframework.web.bind.annotation.RestController;
  8. import com.lyw.bean.User;
  9. @RestController
  10. @RequestMapping(value = "/user")
  11. public class UserController {
  12. @RequestMapping
  13. public String index() {
  14. return "Hello BeiJing";
  15. }
  16. @RequestMapping(value = "/getMap")
  17. public Map<String, Object> getThisMap(String msg) {
  18. Map<String, Object> map = new HashMap<>();
  19. map.put("Name", "LYW");
  20. map.put("Sex", "大老爷们");
  21. map.put("Message", msg);
  22. return map;
  23. }
  24. @RequestMapping(value = "/getUser/{name}/{sex}")
  25. public User getUser(@PathVariable String name, @PathVariable char sex) {
  26. User user = new User();
  27. user.setId(12);
  28. user.setName(name);
  29. user.setDate(new Date());
  30. user.setSex(sex);
  31. return user;
  32. }
  33. }

运行项目:

直接运行main方法或者使用maven命令: spring-boot:run


上面就是运行的结果。。

解释

@RestController注解:看看源码 其实就是 又封装了一层 将@Controller和@RsponseBody两个注解合在一块儿

这样一来应该对SpringBoot 也有了初步的认识。。。而且会简单的使用

3、Spring Boot 实现多环境配置

在实际项目中,咱们通常会放置一些配置文件,这些配置文件是区分环境的,通常环境有dev,test,prep,prod,分别对应开发,测试,预发布,生产。那么在spring boot项目中如何实现不一样环境,使用不一样的配置文件呢。

第一步:定义好不一样环境的application.properties

image.png

application.properties 存放公用的一些配置。
以及最重要的配置 spring.profiles.active=@profiles.active@
application-dev.properties 对应开发环境
application-test.properties 对应测试环境
application-prep.properties 对应预生产环境
application-prod.properties 对应生产环境

第二步:pom中定义profile
image.png

第三步:maven命令打包
package -Dmaven.test.skip=true -Pdev

那么此时就会将application-dev.properties 和application.properties 的配置都打入包中了。

在此我向你们推荐一个架构学习交流群。交流学习群号:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

4、Spring Boot应用监控

入门使用:Actuator插件

Actuator插件是SpringBoot原生提供的一个服务,能够经过暴露端点路由,用来输出应用中的诸多 端点信息。实战一下!

  • pom.xml中添加依赖:
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>复制代码

启动Spring Boot应用程序以后,只要在浏览器中输入端点信息就能得到应用的一些状态信息。

经常使用端点列举以下,能够一个个详细试一下:

固然此时只能使用/health/info端点,其余由于权限问题没法访问。想访问指定端点的话能够在yml配置中添加相关的配置项,好比/metrics端点则须要配置:

endpoints:
 metrics:
 sensitive: false复制代码

此时浏览器访问/metrics端点就能获得诸以下面所示的信息:

固然也能够开启所有端点权限,只需以下配置便可:

endpoints:
 sensitive: false复制代码

于Actuator插件提供的监控能力毕竟有限,并且UI比较简陋,所以须要一个更加成熟一点的工具

Spring Boot Admin监控系统

SBA则是基于Actuator更加进化了一步,其是一个针对Actuator接口进行UI美化封装的监控工具。咱们来实验一下。

  • 首先来建立一个Spring Boot Admin Server工程做为服务端

pom.xml中加入以下依赖:

而后在应用主类上经过加注解来启用Spring Boot Admin

启动程序,浏览器打开 localhost:8081 查看Spring Boot Admin主页面:

Spring Boot Admin主页面

此时Application一栏空空如也,等待待监控的应用加入

  • 建立要监控的Spring Boot应用

pom.xml中加入如下依赖

而后在yml配置中添加以下配置,将应用注册到Admin服务端去:

Client应用一启动,Admin服务立马推送来了消息,告诉你AdminTest上线了:

应用上线推送消息

此时去Admin主界面上查看,发现Client应用确实已经注册上来了:

Client应用已注册上来

  • 查看Detail

Detail信息

  • 查看 Metrics

Metrics信息

  • 查看 Enviroment

Enviroment信息

  • 查看JMX

JMX信息

  • 查看Threads

Threads信息

  • 查看Trace与详情

Trace信息

点击最上方JOURNAL,会看到被监控应用程序的事件变化:

应用程序的事件变化信息

图中能够清晰地看到,应用从 REGISTRATION → UNKNOWN → UP 的状态跳转。

这样就将Actuator插件提供的全部端点信息在SBA中所有尝试了一遍。

在此我向你们推荐一个架构学习交流群。交流学习群号:575745314 里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
图片描述

5、Spring Boot的日志管理

默认状况下,Spring Boot的日志是输出到控制台的,不写入任何日志文件。

要让Spring Boot输出日志文件,最简单的方式是在application.properties配置文件中配置logging.path键值,以下:(日志文件为spring.log)

logging.path=/var/log
复制代码

二种方法是在application.properties配置文件中配置logging.file键值,以下:

logging.file=/var/log/myapp.log
复制代码

两种配置方法适用于开发阶段,对于部署则存在必定的问题。好比部署到不一样的环境,可能就存在须要修改application.properties文件的状况,这就意味着须要从新打包,再次部署,显得不便捷。

有鉴于此,Spring Boot提供了一种覆写application.properties配置文件中键值的方法,在命令行经过指定参数来实现覆写——在运行时把命令行参数看成标准的系统属性,以下:

java -jar -Dlogging.path=/tmp myapp.jar
复制代码

后,还能够在命令行调用Spring Boot的Maven插件时覆写这个值。可是,直接使用系统属性对于插件方式是无效的。须要使用run.jvmArguments参数来指定系统属性,设置想要的值:

mvn spring-boot:run -Drun.jvmArguments="-Dlogging.path=/tmp"复制代码
相关文章
相关标签/搜索