日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》

發布時間:2025/3/12 javascript 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

編寫第一個 REST 接口

讀取配置文件

profiles 多環境配置

熱部署

actuator 監控

自定義 actuator 端點

統一異常處理

異步執行

隨機端口

編譯打包

在 Spring Tools 4 for Eclipse 中選擇 File->New->Maven?Project,
?

在 pom.xml 中添加 Spring Boot 的依賴,

<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.0.6.RELEASE</version> </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency> </dependencies>

編寫啟動類,代碼如下。

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

?啟動類使用了 @SpringBootApplication 注解,這個注解表示該類是一個 Spring Boot 應用。直接運行 App 類即可啟動,啟動成功后在控制臺輸出信息,默認端口是 8080


?Spring Boot啟動成功


我們只在 pom.xml 中引入了一個 Web 的 Starter,然后創建一個普通的 Java?類,一個 Main 方法就可以啟動一個 Web 項目。

與之前的使用方式相比,這種方式簡單很多。以前需要配置各種 Spring 相關的包,還需要配置 web.xml 文件,還需要將項目放入 Tomcat 中去執行,搭建項目的過程還特別容易出錯,會出現各種 jar 包沖突。有了 Spring Boot 后這些問題都解決了。

我們之所以能夠通過一個 Main 方法啟動一個 Web 服務,是因為 Sprig Boot 中內嵌了 Tomcat,然后通過內嵌的 Tomcat 來提供服務。當然,我們也可以使用別的容器來替換 Tomcat,比如 Undertow 或 Jetty。
?

編寫第一個 REST 接口

創建一個控制器,編寫第一個 REST 接口,訪問地址使用 /hello,代碼如下。

@RestController public class HelloController {@GetMapping("/hello")public String hello() {return "hello";} }

@RestController 是 @Controller 和 @ResponseBody 的組合注解,可以直接返回 Json 格式數據。


? 運行結果

讀取配置文件

在以前的項目中我們主要在 XML 文件中進行框架配置,業務的相關配置會放在屬性文件中,然后通過一個屬性讀取的工具類來讀取配置信息。
Spring Boot 中的配置通常放在 application.properties 中,讀取配置信息非常方便,總共分為 3 種方式。

1)Environment

可以通過 Environment 的 getProperty 方法來獲取想要的配置信息,代碼如下所示。

@RestController public class HelloController {// 注入對象@Autowiredprivate Environment env;@GetMapping("/hello")public String hello() {// 讀取配置String port = env.getProperty("server.port");return port;} }

2)@Value

可以注入具體的配置信息,代碼如下。

@RestController public class HelloController {// 注入配置@Value("${server.port}")private String port;@GetMapping("/hello")public String hello() {return port;} }

3)自定義配置類

prefix 定義配置的前綴,代碼如下。

@ConfigurationProperties(prefix = "net.biancheng") @Component public class MyConfig {private String name;public String getName() {return name;}public void setName(String name) {this.name = name;} }

讀取配置的方法代碼如下。

@RestController public class HelloController {@Autowiredprivate MyConfig myConfig;@GetMapping("/hello")public String hello() {return myConfig.getName();} }

定義配置 application.properties 的方法如下:

net.biancheng.name=zhangsan

profiles 多環境配置

在平時的開發中,項目會被部署到測試環境、生產環境,但是每個環境的數據庫地址等配置信息都是不一樣的。通過 profile 來激活不同環境下的配置文件就能解決配置信息不一樣的問題。在 Spring Boot 中可以通過 spring.profiles.active=dev 來激活不同環境下的配置。

可以定義多個配置文件,每個配置文件對應一個環境,格式為 application-環境.properties,如表 1 所示。

在開發環境中,可以通過修改 application.properties 中的 spring.profiles.active 的值來激活對應環境的配置,在部署的時候可以通過 java–jar xxx.jar--spring.profiles.active=dev 來指定使用對應的配置。

熱部署

開發過程中經常會改動代碼,此時若想看下效果,就不得不停掉項目然后重啟。
對于 Spring Boot 項目來說,啟動時間是非常快的,在微服務的架構下,每個服務只關注自己的業務,代碼量也非常小,這個啟動時間是可以容忍的。

通過 spring-boot-devtools 就可以實現熱部署。

只需要添加 spring-boot-devtools 的依賴即可實現熱部署功能,代碼如下所示。

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

actuator 監控

Spring Boot 提供了一個用于監控和管理自身應用信息的模塊,它就是 spring-boot-starter-actuator。該模塊使用起來非常簡單,只需要加入依賴即可,代碼如下。

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

啟動項目我們會發現在控制臺輸出的內容中增加了?所示的信息。

比如,我們訪問 /actuator/health 可以得到下面的信息:

{"status": "UP" }


Spring Boot啟動控制臺輸出

?Actuator端點信息

UP 表示當前應用處于健康狀態,如果是 DOWN 就表示當前應用不健康。增加下面的配置可以讓一些健康信息的詳情也顯示出來:

management.endpoint.health.show-details=ALWAYS

再次訪問 /actuator/health,就可以得到健康狀態的詳細信息數據:

{"status": "UP","diskSpace": {"status": "UP","total": 491270434816,"free": 383870214144,"threshold": 10485760} }

大部分端點默認都不暴露出來,我們可以手動配置需要暴露的端點。如果需要暴露多個端點,可以用逗號分隔,如下所示:

management.endpoints.web.exposure.include=configprops,beans

如果想全部端點都暴露的話直接配置成下面的方式:

management.endpoints.web.exposure.include=*

后面我們會介紹如何使用 Spring Boot Admin在頁面上更加直觀地展示這些信息,目前都是 Json 格式的數據,不方便查看。

自定義 actuator 端點

我們需要自定義一些規則來判斷應用的狀態是否健康,可以采用自定義端點的方式來滿足多樣性的需求。如果我們只是需要對應用的健康狀態增加一些其他維度的數據,可以通過繼承 AbstractHealthIndicator 來實現自己的業務邏輯。代碼如下。

@Component public class UserHealthIndicator extends AbstractHealthIndicator {@Overrideprotected void doHealthCheck(Builder builder) throws Exception {builder.up().withDetail("status", true);// builder.down().withDetail("status", false);} }

通過 up 方法指定應用的狀態為健康,down 方法指定應用的狀態為不健康。withDetail 方法用于添加一些詳細信息。訪問 /actuator/health,可以得到我們自定義的健康狀態的詳細信息:

{"status": "UP","details": {"user": {"status": "UP","details": {"status": true}},"diskSpace": {"status": "UP","details": {"total":249795969024,"free": 7575375872,"threshold": 10485760}}} }

上面我們是在框架自帶的 health 端點中進行擴展,還有一種需求是完全開發一個全新的端點,比如查看當前登錄的用戶信息的端點。自定義全新的端點很簡單,通過 @Endpoint 注解就可以實現。代碼如下所示。

@Component @Endpoint(id = "user") public class UserEndpoint {@ReadOperationpublic List<Map<String, Object>> health() {List<Map<String, Object>> list = new ArrayList<>();Map<String, Object> map = new HashMap<>();map.put("userId", 1001);map.put("userName", "zhangsan");list.add(map);return list;} }

?訪問 /actuator/user 可以看到返回的用戶信息如下:

[{"userName": "zhangsan","userId": 1001} ]

統一異常處理

對于接口的定義,我們通常會有一個固定的格式

{"status": true,"code": 200,"message": null,"data": [{"id": "101","name": "jack"},{"id": "102","name": "jason"}] }

?如果調用方在請求我們的 API 時把接口地址寫錯了,就會得到一個 404 錯誤:

{"timestamp": 1492063521109,"status": 404,"error": "Not Found","message": "No message available","path": "/rest11/auth" }

后端服務會告訴我們哪個地址沒找到,其實也挺友好。但是因為我們上面自定義的數據格式跟下面的不一致,所以當用戶拿到這個返回的時候是無法識別的,其中最明顯的是 status 字段。

我們自定義的是 boolean 類型,用來表示請求是否成功,這里返回的就是 Http 的狀態碼,所以我們需要在發生這種系統錯誤時也能返回我們自定義的那種格式,那就要定義一個異常處理類(代碼如下所示),通過這個類既可以返回統一的格式,也可以統一記錄異常日志。

@ControllerAdvice public class GlobalExceptionHandler {private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);@ExceptionHandler(value = Exception.class)@ResponseBodypublic ResponseData defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception {logger.error("", e);ResponseData r = new ResponseData();r.setMessage(e.getMessage());if (e instanceof org.springframework.web.servlet.NoHandlerFoundException) {r.setCode(404);} else {r.setCode(500);}r.setData(null);r.setStatus(false);return r;} }

?ResponseData 是我們返回格式的實體類,其發生錯誤時也會被捕獲到,然后封裝好返回格式并返回給調用方。在 Spring Boot 的配置文件中加上如下代碼所示配置。

# 出現錯誤時, 直接拋出異常 spring.mvc.throw-exception-if-no-handler-found=true # 不要為我們工程中的資源文件建立映射 spring.resources.add-mappings=false

?當我們調用一個不存在的接口時,返回的錯誤信息就是我們自定義的那種格式:

{"status": false, "code": 404,"message": "No handler found for GET /rest11/auth", "data": null }

最后貼上 ResponseData 的定義,代碼如下。

public class ResponseData {private Boolean status = true;private int code = 200;private String message;private Object data;// get set ... }

異步執行

異步調用就是不用等待結果的返回就執行后面的邏輯;同步調用則需要等待結果再執行后面的邏輯。
通常我們使用異步操作時都會創建一個線程執行一段邏輯,然后把這個線程丟到線程池中去執行,代碼如下所示。?

ExecutorService executorService = Executors.newFixedThreadPool(10); executorService.execute(() -> {try {// 業務邏輯} catch (Exception e) {e.printStackTrace();} finally {} });

這種方式盡管使用了 Java 的 Lambda,但看起來沒那么優雅。在 Spring 中有一種更簡單的方式來執行異步操作,只需要一個 @Async 注解即可,代碼如下所示。

@Async public void saveLog() {System.err.println(Thread.currentThread().getName()); }

我們可以直接在 Controller 中調用這個業務方法,它就是異步執行的,會在默認的線程池中去執行。需要注意的是,一定要在外部的類中去調用這個方法,如果在本類調用則不起作用,比如 this.saveLog()。最后在啟動類上開啟異步任務的執行,添加 @EnableAsync 即可。
?

@Configuration @ConfigurationProperties(prefix = "spring.task.pool") public class TaskThreadPoolConfig {// 核心線程數private int corePoolSize = 5;// 最大線程數private int maxPoolSize = 50;// 線程池維護線程所允許的空閑時間private int keepAliveSeconds = 60;// 隊列長度private int queueCapacity = 10000;// 線程名稱前綴private String threadNamePrefix = "FSH-AsyncTask-";// get set ... }

?然后我們重新定義線程池的配置,代碼如下所示。

@Configuration public class AsyncTaskExecutePool implements AsyncConfigurer {private Logger logger = LoggerFactory.getLogger(AsyncTaskExecutePool.class);@Autowiredprivate TaskThreadPoolConfig config;@Overridepublic Executor getAsyncExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(config.getCorePoolSize());executor.setMaxPoolSize(config.getMaxPoolSize());executor.setQueueCapacity(config.getQueueCapacity());executor.setKeepAliveSeconds(config.getKeepAliveSeconds());executor.setThreadNamePrefix(config.getThreadNamePrefix());executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());executor.initia lize();return executor;}@Overridepublic AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {// 異步任務中異常處理return new AsyncUncaughtExceptionHandler() {@Overridepublic void handleUncaughtException(Throwable arg0, Method arg1, Object... arg2) {logger.error("==========================" + arg0.getMessage() + "=======================", arg0);logger.error("exception method:" + arg1.getName());}};} }

配置完之后我們的異步任務執行的線程池就是我們自定義的了,我們可以在屬性文件里面配置線程池的大小等信息,也可以使用默認的配置:

spring.task.pool.maxPoolSize=100

最后講一下線程池配置的拒絕策略。當我們的線程數量高于線程池的處理速度時,任務會被緩存到本地的隊列中。隊列也是有大小的,如果超過了這個大小,就需要有拒絕的策略,不然就會出現內存溢出。目前支持兩種拒絕策略:

  • AbortPolicy:直接拋出 java.util.concurrent.RejectedExecutionException 異常。
  • CallerRunsPolicy:主線程直接執行該任務,執行完之后嘗試添加下一個任務到線程池中,這樣可以有效降低向線程池內添加任務的速度。


建議大家用 CallerRunsPolicy 策略,因為當隊列中的任務滿了之后,如果直接拋異常,那么這個任務就會被丟棄。

隨機端口

在實際的開發過程中,每個項目的端口都是定好的,通過 server.port 可以指定端口。
當一個服務想要啟動多個實例時,就需要改變端口,特別是在我們后面進行 Spring Cloud習的時候,服務都會注冊到注冊中心里去,為了能夠讓服務隨時都可以擴容,在服務啟動的時候能隨機生成一個可以使用的端口是最好不過的。

在 Spring Boot 中,可以通過 ${random} 來生成隨機數字,我們可以這樣使用:

server.port=${random.int[2000,8000]}

?通過 random.int 方法,指定隨機數的訪問,生成一個在 2000 到 8000 之間的數字,

編寫一個啟動參數設置類,代碼如下所示。

public class StartCommand {private Logger logger = LoggerFactory.getLogger(StartCommand.class);public StartCommand(String[] args) {Boolean isServerPort = false;String serverPort = "";if (args != null) {for (String arg : args) {if (StringUtils.hasText(arg) && arg.startsWith("--server.port")) {isServerPort = true;serverPort = arg;break;}}}// 沒有指定端口, 則隨機生成一個可用的端口if (!isServerPort) {int port = ServerPortUtils.getAvailablePort();logger.info("current server.port=" + port);System.setProperty("server.port", String.valueOf(port));} else {logger.info("current server.port=" + serverPort.split("=")[1]);System.setProperty("server.port", serverPort.split("=")[1]);}} }

通過對啟動參數進行遍歷判斷,如果有指定啟動端口,后續就不自動生成了;如果沒有指定,就通過 ServerPortUtils 獲取一個可以使用的端口,然后設置到環境變量中。在 application.properties 中通過下面的方式獲取端口:

server.port=${server.port}

關于獲取可用端口的代碼如下所示。

public static int getAvailablePort() {int max = 65535;int min = 2000;Random random = new Random();int port = random.nextInt(max)%(max-min+1) + min;boolean using = NetUtils.isLoclePortUsing(port);if (using) {return getAvailablePort();} else {return port;} }

獲取可用端口的主要邏輯是指定一個范圍,然后生成隨機數字,最后通過 NetUtils 來檢查端口是否可用。如果獲取到可用的端口則直接返回,沒有獲取到可用的端口則執行回調邏輯,重新獲取。檢測端口是否可用主要是用 Socket 來判斷這個端口是否可以被鏈接。

最后在啟動類中調用端口即可使用,代碼如下所示。

public class FshHouseServiceApplication {public static void main(String[] args) {// 啟動參數設置, 比如自動生成端口new StartCommand(args);SpringApplication.run(FshHouseServiceApplication.class, args);} }

編譯打包

傳統的 Web 項目在部署的時候,是編譯出一個 war 包放到 Tomcat 的 webapps 目錄下。而在 Spring Boot 構建的 Web 項目中則打破了這一傳統部署的方式,它采用更加簡單的內置容器方式來部署應用程序,只需要將應用編譯打包成一個 jar 包,直接可以通過 java–jar 命令啟動應用。

在項目的 pom.xml 中增加打包的 Maven 插件,代碼如下所示。

<build><plugins><!-- 打包插件 --><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration><executable>true</executable><mainClass>net.biancheng.spring_boot_example.App</mainClass></configuration></plugin><!-- 編譯插件, 指定JDK版本 --><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins> </build>

mainClass 配置的是我們的啟動入口類,配置完成后可以通過 Maven 的 mvn clean package 命令進行編譯打包操作。編譯完成后在 target 目錄下會生成對應的 jar 包,部署的時候直接調用 java–jar xx.jar 即可啟動應用。

相關springboot實戰項目推薦

基于java ssm springboot+VUE疫情防疫系統系統前后端分離設計和實現

基于java springboot+mybatis電影售票網站管理系統前臺+后臺設計和實現

基于java ssm springboot+mybatis酒莊內部管理系統設計和實現

基于JAVA springboot+mybatis智慧生活分享平臺設計和實現

基于Java springboot+vue+redis前后端分離家具商城平臺系統設計和實現

基于JAVA SSM springboot實現的抗疫物質信息管理系統設計和實現

查看更多首頁實戰項目 >>>

好了,今天就到這兒吧,小伙伴們點贊、收藏、評論,一鍵三連走起呀,下期見~~


創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎

總結

以上是生活随笔為你收集整理的《SpringCloud超级入门》Spring Boot项目搭建步骤(超详细)《六》的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。