微服務架構 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"複製代碼
相關文章
相關標籤/搜索