You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

104 lines
6.1 KiB
Markdown

<h1><div style="text-align: center; color: cornflowerblue">百业代码规范及一些标准化过程示例 v0.1.1</div></h1>
## 0. 项目说明
对后端java代码进行一些标准化的过程说明,帮助整个技术团队提升自己的技术规范及水平
## 1. 项目内容说明
dev-protocol-test
- SpringBoot项目Test的编写规范及使用标准
- 参考: https://mp.weixin.qq.com/s/W5v8zOCHbc2_NvobMGaU8w
dev-protocol-log
- 分布式日志系统的设计及实现,主要涉及kafka Springboot ELK
dev-protocol-gateway
- 智能网关设计
dev-protocol-devops
- DevOps 相关的最佳实现
### 1.1 基本命令(dev-protocol-log)
- Kafka
查看topic列表命令(连接其中一个就好了)
【旧版】kafka-topics.sh --zookeeper 172.16.26.183:2181 --list
【新版】kafka-topics.sh --bootstrap-server 172.16.26.183:9092 --list
zookeeper is not a recognized option主要原因是 Kafka 版本过高,命令不存在)
创建topic主题
kafka-topics.sh --bootstrap-server 172.16.26.183:9092 --create --topic topic1 --partitions 1 --replication-factor 3
--create 命令后 --topic 为创建topic 并指定 topic name
--partitions 为指定分区数量
--replication-factor 为指定副本集数量
向kafka集群发送数据
【无key型消息】kafka-console-producer.sh --bootstrap-server 172.16.26.183:9092 --topic topic1
【有key型消息】 kafka-console-producer.sh --bootstrap-server 172.16.26.183:9092 --topic topic1 --property parse.key=true
默认消息键与消息值间使用“Tab键”进行分隔切勿使用转义字符(\t)
kafka命令接受数据
kafka-console-consumer.sh --bootstrap-server 172.16.26.183:9092 --topic topic1 --from-beginning
kafka查看消费进度当我们需要查看一个消费者组的消费进度时则使用下面的命令(启动Consumer的时候才会真的生效)【这条命令对查询消费特别重要】
kafka-consumer-groups.sh --bootstrap-server 172.16.26.183:9092 --describe --group group1
### 1.2 注意事项(dev-protocol-log)
一致性确定
命令中的 --bootstrap-server 和配置文件中的要一致
# 允许外部端口连接
listeners=PLAINTEXT://0.0.0.0:9092
# 外部代理地址
advertised.listeners=PLAINTEXT://121.201.64.12:9092
https://blog.csdn.net/pbrlovejava/article/details/103451302
国内下载镜像加速
https://www.newbe.pro/
### 1.3 海量日志收集架构设计(dev-protocol-log)
- 海量日志收集架构示意图
![avatar](dev-protocol-log/pic/海量日志收集架构示意图.png)
---
- 标准架构(海量): Beats(日志收集) -> kafka(日志堆积) -> Logstash(日志过滤) -> ElasticSearch(日志查询) -> Kibana(效果展示)
- 简化收集方案1: 直接使用Log4j的插件和Logstash集成 -> ElasticSearch(日志查询) -> Kibana(效果展示)
- 简化收集方案2: 使用Log4j自己封装一个appender -> ElasticSearch(日志查询) -> Kibana(效果展示)
- 简化收集方案3: 直接使用kafka的appender(log4j提供的),直接实现 -> kafka(日志堆积) -> ElasticSearch(日志查询) -> Kibana(效果展示)
- 先进技术: SkyWalking 的 Netty或者Agent的方式,直接传到另外一个Agent端
---
- 实际落地架构图
![avatar](dev-protocol-log/pic/实际落地架构图.png)
---
- 全域日志收集架构落地图
![avatar](dev-protocol-log/pic/全域日志收集架构落地图.png)
### 1.4 日志输出设计
- 1. 使用 Log4j2 的相关技术进行日志定义
![avatar](dev-protocol-log/pic/日志输出功能详情.png)
- 2. 使用 filebeat 进行日志的收集
![avatar](dev-protocol-log/pic/FIleBeat日志收集.png)
启动前先进行检查 ./filebeat -c 配置文件.yml -configtest
启动顺序 kafka -> 自己的应用程序 -> filebeat
- 3.
### 3.1 智能网关
#### JWT 在微服务架构下的认证过程
- A> 服务器自主验签方式
![avatar](dev-protocol-gateway/pic/服务器自主验签方式.png)
- 第一步,认证中心微服务负责用户认证任务,在启动时从 Nacos 配置中心抽取 JWT 加密用私钥
- 第二步,用户在登录页输入用户名密码,客户端向认证中心服务发起认证请求
- 第三步认证中心服务根据输入在用户数据库中进行认证校验如果校验成功则返回认证中心将生成用户的JSON数据并创建对应的 JWT 返回给客户端
- 第四步,在收到 JSON 数据后,客户端将其中 token 数据保存在 cookie 或者本地缓存中
- 第五步,随后客户端向具体某个微服务发起新地请求,这个 JWT 都会附加在请求头或者 cookie 中发往 API 网关网关根据路由规则将请求与jwt数据转发至具体的微服务。中间过程网关不对 JWT 做任何处理
- 第六步,微服务接收到请求后,发现请求附带 JWT 数据,于是将 JWT 再次转发给用户认证服务,此时用户认证服务对 JWT 进行验签,验签成功提取其中用户编号,查询用户认证与授权的详细数据
- 第七步,具体的微服务收到上述 JSON 后,对当前执行的操作进行判断,检查是否拥有执行权限,权限检查通过执行业务代码,权限检查失败返回错误响应
- B> API 网关统一验签方案
![avatar](dev-protocol-gateway/pic/API网关统一验签方案.png)
API 网关统一验签与服务端验签最大的区别是在 API 网关层面就发起 JWT 的验签请求,之后路由过程中附加的是从认证中心返回的用户与权限数据,其他的操作步骤与方案一是完全相同的
## TODO-List
1. 使用 切面+注解 的方式对同一类的请求带上相对应的验证信息
2. 注意在调用请求的时候要对内部鉴权方式和外部鉴权方式进行区分,然后知道在使用JWT方案的时候要进行JWT防止伪造鉴定
3. Nginx相关的配置