菌子导航系统(持续开发中)
文章目錄
- 菌子導航
- 前言
- 項目架構
- spring-cloud 和 spring-boot 版本選擇
- 使用到的組件(依賴)
- 架構分層
- 項目基本功能
- 1 使用Nacos做配置中心
- 2 logback日志
- 3 mybatis-plus操作數據庫
- 4 Caffeine 緩存整合
- 5 LocalDateTime 序列化&反序列化
- 6 參數校驗快速失敗配置
- 7 集成日志鏈路
- 8 控制器參數切面
- 9 日志切面
- 10 集成 Swagger + knife4j
- 11 全局異常攔截
- 12 Nacos 增加監聽器
- 13 RestTemplate 集成 okhttp4
- 14 注冊服務到Nacos
- 15 集成自定義的redis starter
- 項目業務功能
- 1 集成有道文本翻譯接口
- 2 集成天行數據
- 3 枚舉生成器
- 4 網站錄入&分頁查看
- 5 天氣預報
- 項目部署與運行
- 1 Idea中運行
- 2 打包在windows的cmd中運行
- 3 在Linux后臺運行
- 4 使用Prometheus & Grafana 監控jvm
菌子導航
前言
本導航網站旨在對接多個三方接口,常用功能集成到導航系統中。目前已經在對接的是有道文本翻譯接口、天行數據、自定義枚舉生成器。
目前項目代碼托管在 :
https://gitee.com/fengsoshuai/junzi-navigation.git
最新分支是 dev 分支。
本項目主要是練習Java后端的技術。
隨后加了一個vue的前端界面。倉庫地址:https://gitee.com/fengsoshuai/vue-back-navigation.git
項目架構
參考并使用DDD領域模型思想,架構搭建使用了阿里的 COLA 項目。
https://gitee.com/fengsoshuai/COLA#
使用命令: mvn archetype:generate -DgroupId=org.feng.navigation -DartifactId=junzi-navigation -Dversion=1.0.0-SNAPSHOT
-Dpackage=org.feng.navigation -DarchetypeArtifactId=cola-framework-archetype-service -DarchetypeGroupId=com.alibaba.cola
-DarchetypeVersion=4.0.1
spring-cloud 和 spring-boot 版本選擇
參考:https://spring.io/projects/spring-cloud
spring-boot 選擇 2.7.8 ,cloud選擇 2021.0.5
使用到的組件(依賴)
| lombok | 1.18.16 |
| okhttp | 4.9.0 |
| mapstruct | 1.4.2.Final |
| mybatis-plus | 3.5.3.1 |
| druid | 1.2.15 |
| gson | 2.9.1 |
| hutool-core | 5.8.11 |
| caffeine | 2.9.3 |
| swagger | 3.0.0 |
| freemarker | 2.7.8 |
| thymeleaf | 2.7.8 |
| prometheus | 1.9.7 |
| pinyin4j | 2.6.1 |
架構分層
常規的COLA分層說明:https://blog.csdn.net/significantfrank/article/details/110934799
本項目的分層簡述:
項目基本功能
1 使用Nacos做配置中心
配置內容如下:
junzi:nav:url:youDao: https://openapi.youdao.com/apitianXing: https://apis.tianapi.comapp:youDao:appKey: 在有道注冊得到的keyappSecret: 在有道注冊得到的secrettianXing:appKey: 在天行注冊的key # 數據源 spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:13321/junzi-navigation?useUnicode=true&serverTimezone=UTCusername: rootpassword: 123456type: com.alibaba.druid.pool.DruidDataSource# 支持post、delete等請求mvc:hiddenmethod:filter:enabled: true # mybatis plus mybatis-plus:# xml掃描,多個目錄用逗號或者分號分隔(告訴mapper所對應的xml文件位置)mapper-locations: classpath*:mapper/**Mapper.xml# 以下配置均有默認值global-config:db-config:#主鍵類型 auto:"數據庫ID自增" 1:"用戶輸入ID",2:"全局唯一ID (數字類型唯一ID)", 3:"全局唯一ID UUID";id-type: auto#字段策略 IGNORED:"忽略判斷" NOT_NULL:"非 NULL 判斷") NOT_EMPTY:"非空判斷"field-strategy: NOT_EMPTY#數據庫類型db-type: MYSQLconfiguration:# 是否開啟自動駝峰命名規則映射:從數據庫列名到Java屬性駝峰命名的類似映射map-underscore-to-camel-case: true# 如果查詢結果中包含空值的列,則 MyBatis 在映射的時候,不會映射這個字段call-setters-on-nulls: true# 這個配置會將執行的sql打印出來,在開發或測試的時候可以用log-impl: org.apache.ibatis.logging.stdout.StdOutImpl# 掃描實體type-aliases-package: org.feng.navigation.database.entity2 logback日志
<configuration><include resource="org/springframework/boot/logging/logback/defaults.xml"/><appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender"><encoder><!--格式化輸出:%d表示日期,%thread表示線程名,%-5level:級別從左顯示5個字符寬度%msg:日志消息,%n是換行符 %F文件,%L行號--><pattern>%clr(%d{yyyy-MM-dd HH:mm:ss.SSS}){faint} %clr(${LOG_LEVEL_PATTERN:-%5p} ) %clr(${PID:- }){magenta} %clr(---){faint} %clr([%t]){faint} %clr(%logger{39}.%M\(%F:%L\)){cyan} %clr(:){faint} ![method=%X{method:-default},businessId=%X{businessId:-default}] %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}</pattern><charset>UTF-8</charset></encoder></appender><!--rootLogger是默認的logger--><root level="INFO"><appender-ref ref="CONSOLE"/></root><!--應用日志--><logger name="org.feng.navigation" level="DEBUG"/> </configuration>3 mybatis-plus操作數據庫
使用Mapper 和 ServiceImpl 作為常見的數據庫功能實現。
并實現了 SQL 攔截 InnerInterceptor,打印出執行到的SQL(這一操作需要謹慎,線上部署可以去除)
4 Caffeine 緩存整合
使用 Spring Cache 中的 CacheManager管理緩存。
5 LocalDateTime 序列化&反序列化
增加序列化、反序列化的配置,將時間格式統一為 yyyy-MM-dd HH:mm:ss
并支持配置更改。
6 參數校驗快速失敗配置
在使用 Valid 注解進行參數校驗時,默認會校驗全部參數后,將錯誤信息才返回。
增加此配置后,只要發生了錯誤,就會直接返回,增加了校驗效率與系統性能。
7 集成日志鏈路
使用攔截器 HandlerInterceptor 做了日志鏈路統一。
搭配著 MDC 和 logback 對關鍵詞 “businessId” 進行輸出。
使用效果是,同一請求的執行鏈路中,直接使用 lombok 打印日志,會將 businessId 打印出來。方便回溯和排查問題。
8 控制器參數切面
主要是在執行控制器的前、后打印數據。
執行前打印方法請求參數,執行后打印執行結果。
執行錯誤時,打印錯誤描述信息。
并且提供了 Check 接口的校驗,如果當前參數DTO對象,實現了Check 接口,則會自動調用該接口的 check方法,對參數進行校驗。
9 日志切面
搭配著MDC 和 lombok 將當前請求的接口對應的業務方法打印到日志中。
10 集成 Swagger + knife4j
集成了 3.0 版本的 Swagger 文檔。
方便開發接口時的調試,測試。
11 全局異常攔截
對校驗參數的異常進行捕獲,對未知異常進行捕獲并處理
12 Nacos 增加監聽器
具體說明見博客:https://blog.csdn.net/FBB360JAVA/article/details/128878761
13 RestTemplate 集成 okhttp4
已經將httpclient 更改成為 okhttp。效率上快很多。
14 注冊服務到Nacos
目標是另外新建項目后,可以用新建的項目 Feign 調用本項目。
目前新建項目已經搭建完畢:https://gitee.com/fengsoshuai/junzi-navigation-web.git
可以使用 junzi-navigation-web項目遠程調用本項目。
15 集成自定義的redis starter
參考博客SpringBoot 2.7.8 自定義 Starter &自動配置
參考博客Java 使用Reactive Redis
在Nacos增加如下配置內容:
junzi:redis:# 表示spring容器需要注入redis相關配置enable: true# 業務business:# 業務1,可以自由配置key值get:# 業務前綴businessPrefix: feng0-redis-# 業務過期時間businessExpireTime: 5# 時間單位expireTimeUnit: HOURS# 是否啟用當前業務enable: true# 業務2,可以自由配置key值cancel:businessPrefix: feng1-redis-businessExpireTime: 3expireTimeUnit: HOURSenable: true # 連接redis需要的配置參數 spring:redis:host: localhostport: 6379password: feng123項目業務功能
1 集成有道文本翻譯接口
目前已經對接完畢,支持中、英翻譯。
2 集成天行數據
在 https://www.tianapi.com/ 注冊賬號,并對接里邊的接口。
目前對接了:
- 天行數據新聞接口頻道ID
- 天行數據天氣預報
3 枚舉生成器
運行對應的前端項目 vue-back-navigation 中的 junzi-navigation-vue分支的代碼,可以得到一個前端頁面。
在本地選擇你自己的csv文件,指定類名、包名、枚舉key值對應的索引(索引從0開始計數)
比如測試時使用 demo.csv文件內容:
1,線下熱敏,線下熱敏是一種物流 5,淘寶,淘淘他 7,拼多多,品谷博的武器二帶我去最終生成的Demo.java 文件的內容是:
package org.feng;import lombok.AllArgsConstructor; import lombok.Getter;import java.util.Arrays;/*** TODO** @version V1.0* @author: junzi* @date: 2023年02月11日 14時00分*/ @Getter @AllArgsConstructor public enum Demo {/*** 線下熱敏:1*/XIAN_XIA_RE_MIN("1", "線下熱敏", "線下熱敏是一種物流"),/*** 淘寶:5*/TAO_BAO("5", "淘寶", "淘淘他"),/*** 拼多多:7*/PIN_DUO_DUO("7", "拼多多", "品谷博的武器二帶我去"),;/*** TODO 待完善*/private final Integer key;/*** TODO 待完善*/private final String desc;public static Demo of(Integer key) {if (key == null) {throw new IllegalArgumentException("key不能為空的啦");}return Arrays.stream(values()).filter(element -> element.key.equals(key)).findAny().orElseThrow(() -> new IllegalArgumentException("key不存在的啦"));} }4 網站錄入&分頁查看
增加了網站錄入,提供網站名,ico以及logo(logo后面增加上傳文件后,才實際用到),網站url等的錄入。
分頁查詢網站信息。(網站錄入后臺已完成,前端未寫)列出網站功能已經完成。
5 天氣預報
正在接入中。目前后臺已經完成,并測試通過,可以通過swagger調用,vue前端正在碼代碼。
項目部署與運行
1 Idea中運行
在下載項目源碼后,使用idea的maven插件功能,在圖中先 clean,再 install。
隨后運行 start 模塊中的啟動類即可。
注意 profile 的指定,目前使用的是dev環境。
2 打包在windows的cmd中運行
先打包,注意使用clean 和 package 插件。
等待打包成功后,在 start 模塊中找到新打好的包。
隨后在java11的運行環境中運行該jar包(注意要指定編碼格式,cmd默認會是gbk):
java -Dfile.encoding=utf-8 -jar start-1.0.0-SNAPSHOT.jar這里調整編碼的操作是因為第一次運行時,讀取到nacos中的配置內容,是帶亂碼的,導致程序啟動不起來。因為nacos默認是utf-8編碼的。
3 在Linux后臺運行
nohup java -jar start-1.0.0-SNAPSHOT.jar > /usr/software/junzi/junzi.log &并輸出日志到junzi.log中。
4 使用Prometheus & Grafana 監控jvm
首先是安裝好這倆軟件。
安裝步驟可以參考:Prometheus & Grafana 的安裝
在配置文件prometheus.yml中增加如下內容
- job_name: "junzi-navigation"metrics_path: "/junzi/actuator/prometheus"static_configs:- targets: ["localhost:18080"]隨后重啟prometheus。
登陸到Grafana中,打開配置增加數據源。選擇 prometheus類型的數據源。
隨后輸入你的 prometheus 的地址和端口,比如你安裝的路徑是 localhost:9090,就輸入它。隨后點擊保存
然后導入一個Jvm的監控面板,選擇你剛剛加上的數據源就可以啦。
比如我這里選擇了 4701 號的面板。效果如下:
總結
以上是生活随笔為你收集整理的菌子导航系统(持续开发中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GAMS的记录
- 下一篇: l298n电机驱动模块驱动直流电机(佛科