菌子导航系统(持续开发中)

文章目录

  • 菌子导航
    • 前言
      • 项目架构
      • 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

使用到的组件(依赖)

组件版本
lombok1.18.16
okhttp4.9.0
mapstruct1.4.2.Final
mybatis-plus3.5.3.1
druid1.2.15
gson2.9.1
hutool-core5.8.11
caffeine2.9.3
swagger3.0.0
freemarker2.7.8
thymeleaf2.7.8
prometheus1.9.7
pinyin4j2.6.1

架构分层

常规的COLA分层说明:https://blog.csdn.net/significantfrank/article/details/110934799

本项目的分层简述:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tKksUezq-1676096556002)(docs\架构.png)]

项目基本功能

1 使用Nacos做配置中心

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-G7BcUq3X-1676096556003)(docs\20230119142832.png)]

配置内容如下:

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.entity

2 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 集成有道文本翻译接口

目前已经对接完毕,支持中、英翻译。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ASFdDMHy-1676096556003)(docs\20230119145459.png)]

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环境。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x6SQsdIA-1676096556004)(docs\20230129211940.png)]

2 打包在windows的cmd中运行

先打包,注意使用clean 和 package 插件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eTWrJ4hL-1676096556004)(docs\20230129213414.png)]

等待打包成功后,在 start 模块中找到新打好的包。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NmI803SP-1676096556005)(docs\20230129213602.png)]

随后在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类型的数据源。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UYFJE5PB-1678803385416)(docs\20230314220303.png)]

随后输入你的 prometheus 的地址和端口,比如你安装的路径是 localhost:9090,就输入它。随后点击保存

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NCLJfVJ6-1678803385416)(docs\20230314220614.png)]

然后导入一个Jvm的监控面板,选择你刚刚加上的数据源就可以啦。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rXhAx5ZW-1678803385416)(docs\20230314221029.png)]

比如我这里选择了 4701 号的面板。效果如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2QRV8kk4-1678803385417)(docs\20230314221240.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LE8EXfVH-1678803385417)(docs\20230314221356.png)]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/351517.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

狂神Javaweb完整版基础入门(IDEA版)值得学习的JavaWeb教程

Java web Java web 1、基本概念 web开发&#xff1a; web&#xff0c;网页的意思&#xff0c;www.baidu.com静态web html&#xff0c;css提供给所有人看的数据始终不会发生变化&#xff01; 动态web 淘宝&#xff0c;几乎是所有的网站提供给所有的人看的数据始终会变化&…

阿里腾讯“双向奔赴”新进展:互联互通再提速

《中智观察》第1636篇推送 作者&#xff1a;雨涵 编辑&#xff1a;小瑞瑞 头图来源&#xff1a;摄图网 “冬天来了&#xff0c;春天还会远吗”&#xff1f;当推倒了“篱笆墙”&#xff0c;大厂互联互通的“脚步”就在持续向前迈进。 近日&#xff0c;有消息称淘宝开始内测使用微…

【转载】JAVA知识点集锦(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

B站---【狂神说Java】JavaWeb入门到实战---笔记

该笔记大部分搬运B站遇见狂神说的javaWeb&#xff0c;顺便把图文合并记录&#xff0c;便于回顾 视频地址&#xff1a;https://www.bilibili.com/video/BV12J411M7Sj 记得三连 文章目录 1、基本概念1.1、前言1.2、web应用程序web应用程序&#xff1a;1.3、静态web1.4、 动态web …

关于NoSQL与SQL的区别

转载自&#xff1a;http://blog.csdn.net/xlgen157387/article/details/47908797 云计算背后的秘密&#xff1a;NoSQL诞生的原因和优缺点 我本来一直觉得NoSQL其实很容易理解的&#xff0c;我本身也已经对NoSQL有了非常深入的研究&#xff0c;但是在最近准备YunTable的Chart的时…

Java面试题全集(中)

这部分主要是与Java Web和Web Service相关的面试题。 96、阐述Servlet和CGI的区别? 答&#xff1a;Servlet与CGI的区别在于Servlet处于服务器进程中&#xff0c;它通过多线程方式运行其service()方法&#xff0c;一个实例可以服务于多个请求&#xff0c;并且其实例一般不会销…

Node.js(一)——(Node.js安装及使用,通过Node.js搭建服务器,模块化及自定义模块,npm/yarn/nvm,内置模块fs的使用,buffer及stream,新闻列表案例)

目录 1.Node.js介绍 2.安装Node.js 3.使用Node.js实现第一个服务器 3.1初步感受Node.js 3.2Google Chrome 默认非安全端口列表&#xff0c;尽量避免以下端口。 3.3nodemon自动监控服务端更改 4.模块化——Node.js使用commonjs规范 4.1创建自定义模块&#xff08;引入文…

限期解除!要跟乱七八糟的口令说拜拜了

大家好&#xff0c;欢迎来到编程教室~我是Crossin。 这两天有个事关很多人的新闻&#xff1a; 转自 澎湃新闻 https://m.thepaper.cn/baijiahao_14480198 为什么说事关很多人&#xff1f;因为以下这两个场景&#xff0c;想必大家都遇到过&#xff1a; 出现这种情况&#xff0c;…

数据分析与爬虫实战视频——学习笔记(一)(python基础、urllib、超时设置、自动模拟HTTP请求、异常处理、浏览器伪装、代理服务器、新闻爬虫、淘宝登陆和图片爬取)

未经允许&#xff0c;请勿转载。 连载未完成状态 网址&#xff1a; 【数据挖掘】2019年最新python3 数据分析与爬虫实战_哔哩哔哩 (゜-゜)つロ 干杯~-bilibili https://www.bilibili.com/video/av22571713/?p1 目标&#xff1a; 网络爬虫工程师 数据分析&#xff08;数据挖…

从零开始使用深度学习训练一个新闻分类器(干货)

https://mp.weixin.qq.com/s/qR-d9Zay-7NJZgmYYlwn0A?utm_sourcetuicool&utm_mediumreferral 我们在浏览新闻的时候&#xff0c;通常会看到新闻网站对每个新闻都进行了分类&#xff1a; 新闻分类的应用相当广泛。对于网站来说&#xff0c;可以根据你看得较多的新闻类别给你…

跑实验_word2vector词向量实现_基于搜狗新闻预料+维基百科

这篇博客只是记录一下如何解决 跑别人的代码没通的过程。 文章目录 1 运行代码0设备环境1.获取语料库2.语料库预处理3.训练4.开动&#xff01;使用词向量近义词获取某个词语的词向量计算句子相似度词向量加减运算选出集合中不同类的词语 2总结一下经验3补充 1 运行代码 最经在…

web编程项目--新闻网站搭建

文章目录 一、新闻爬取1.爬虫原理2.分析网站链接格式和网页信息格式cheerio爬取新浪新闻爬取人民网新闻央视新闻爬取网易新闻 3.数据库设计4.爬虫具体代码实现5.存储结果展示 二、 网站搭建1.用express构建网站访问mysql2.显示查询结果后端实现前端实现 3.对查询结果进行分页4.…

彻底解决网络爬虫遇到的中文乱码问题

你是否遇到过下面的情况&#xff1a; 作为爬虫新手好不容易写了一个爬虫结果爬出来的数据中文数据乱码导致不能使用 如图&#xff1a; 其实很好解决&#xff1a; 如果你是使用的request模块得到的相应对象则可以如下设置&#xff1a; 主要由两种情况&#xff0c;这是根据网页所…

解析网页出现中文乱码问题的解决方案

最近在解析淘宝中商品的信息&#xff0c;结果出现乱码&#xff0c;如&#xff1a; 原因就是中文字符格式出现冲突&#xff0c;ASP.NET MVC 默认采用utf-8,但是淘宝网页采用gbk。 在网上找了一下&#xff0c;最常用的解决方法就是修改web.config: < system.web> ......…

java并发编程:重排序与happens-before介绍

文章目录 什么是重排序&#xff1f;顺序一致性模型与JMM的保证数据竞争与顺序一致性顺序一致性模型JMM中同步程序的顺序一致性效果JMM中未同步程序的顺序一致性效果 happens-before什么是happens-before?天然的happens-before关系 什么是重排序&#xff1f; 计算机在执行程序…

burpsuite工具的使用(详细讲解)

一&#xff09;前言 我已经在之前详细的说明了burpsuite的安装过程&#xff0c;如果不了解的可以看 burpsuite安装教程 &#xff1a;http://t.csdn.cn/uVx9X 在这了补充说明一下&#xff0c;在安装完burpsuite并设置完代理后&#xff0c;会出现如果访问的url是使用http协议的…

Boilsoft Video Splitter(无损视频分割器)官方正式版V8.2.0 | 无损视频分割软件下载 | 视频分割软件哪个好用?

Boilsoft Video Splitter 是一款优秀且快速的专业无损视频分割软件&#xff0c;支持大于2GB以上的视频分割和直接拖放功能&#xff0c;无需重新编码就能帮助大家直接将完整的AVI、MPEG、RM、ASF、WMV、3GP、MKV、FLV 或 MP4等主流视频文件按时间、大小或关键帧等条件拆分、剪切…

视频怎么分割片段?快速分割视频小技巧

如何快速分割视频&#xff0c;处理视频时&#xff0c;一些视频时长可能会比较长&#xff0c;需要进行分割处理&#xff0c;如何快速将多个视频进行分割&#xff0c;分割后自动每个视频分类保存。下面来试试批量剪辑分割的技巧&#xff0c;一起来试试。 准备工具&#xff1a; 媒…

分割视频的方法有哪些?

现在网络上的剪辑方法有很多&#xff0c;比如视频合并、视频分割等等&#xff0c;而其中的视频分割大概就是指将一段很长的视频分割成一段一段的&#xff0c;有些人为了取视频中重要的一个片段会采取视频分割的方法&#xff0c;下面给大家介绍一下操作方法。 教程之前&#xf…

一款简单实用的视频分割软件,快速将一段视频分割成两段

视频太多、太长&#xff0c;怎么统一分割&#xff0c;比如按段分割呢&#xff1f;今天小编给大家分享一个新的剪辑技巧&#xff0c;下面一起来试试。 所需工具 视频素材若干 操作步骤 运行【好简单批量智剪】&#xff0c;“分割视频”中导入视频素材&#xff0c;支持多种导入…