微服务项目代码说明
这个项目中基本完成了微服务所需的大部分组件。
代码地址:https://gitee.com/fzh-oschina/tinem
环境依赖
- docker [19+]
- jdk [1.8+]
- redis [5.0+] [单机/cluster]
- mysql [5.7+] [单机]
- jaeger [1.18+]
- nacos [1.2.1+][单机/cluster]
- sentinel [1.6.3+]
- maven [3.5.0+]
- seata [1.4.2+]
数据库
- 微服务默认数据文件
platform-doc/数据库文档/platform.chnr.json
此文件需要使用第三方工具打开:http://www.pdmaner.com/
打开后导出sql即可
- 分布式事务数据库脚本
platform-doc/数据库文档/seata.sql
- 唯一id数据库脚本
platform-doc/数据库文档/uid.sql
启动环境变量配置
export JAEGER_HOST=10.20.10.21
export JAEGER_HTTP_URL="http://10.20.10.21:14268/api/traces"
export LOG_ELASTICSEARCH_HOST="http://elasticsearch.xxx.com/_bulk"
export NACOS_CONFIG_SERVERS="10.20.10.21:8848,10.20.10.22:8848,10.20.10.23:8848"
export NACOS_DISCOVERY_SERVERS="10.20.10.21:8848,10.20.10.22:8848,10.20.10.23:8848"
export SEATA_SERVICE="10.20.10.26:8091"
export SENTINEL_CLIENT_IP=${本机IP}
export SENTINEL_DASHBOARD="10.20.10.26:8858"
export PLATFORM_MYSQL_SERVER_HOST=10.20.10.21
export PLATFORM_MYSQL_SERVER_PASSWORD="password"
export UID_MYSQL_SERVER_HOST=10.20.10.21
export UID_MYSQL_SERVER_PASSWORD="password"
export REDIS_SERVER_HOST_1=10.20.10.21
export REDIS_SERVER_HOST_2=10.20.10.22
export REDIS_SERVER_HOST_3=10.20.10.23
export REDIS_SERVER_HOST_4=10.20.10.24
export REDIS_SERVER_HOST_5=10.20.10.25
export REDIS_SERVER_HOST_6=10.20.10.26
多模块
在实际的公司中往往有不止一个项目的开发和运营。而大部分的项目可能业务方面完全没有联系。通过多模块化的结构。我们将此微服务项目拆分成了微服务主体结构和业务项目。在微服务主体结构中我们将与业务无关的功能再次拆分成了单独的模块。例如网络模块,安全模块,数据模块等通用服务。为我们的业务开发提供基础支持。而通过标准化的模块方式我们所有的项目入口统一由gateway负责。
统一配置
多模块导致我们的项目有很多共同的配置文件如nacos地址,redis地址等。如果每个项目单独管理这些配置会导致我们的配置文件冗余,难以维护等。所以我们通过maven插件将统一的配置文件放到一个项目中,在maven编译期通过项目配置信息生成不同的配置文件。
目前通过统一配置的数据有
- jpa配置
- redis
- springboot banner信息
- 项目配置信息
- sentinel
- nacos
- jaeger
- logback
- ribbon
- feign
- docker
例如我们的短连接服务。在项目中仅配置部分数据但在maven编译后会将全局配置文件生成出来。
在项目中使用统一配置文件
<plugin> <!-- 共享配置文件 -->
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-remote-resources-plugin</artifactId>
<version>1.7.0</version>
<executions>
<execution>
<id>process-remote-resources</id>
<goals>
<goal>process</goal>
</goals>
<configuration>
<encoding>UTF-8</encoding>
<resourceBundles>
<resourceBundle>com.tinem:platform-config:${project.version}</resourceBundle>
</resourceBundles>
</configuration>
</execution>
</executions>
</plugin>
容器化
maven的容器化插件:com.spotify:dockerfile-maven-plugin:1.4.13
pom.xml
docker配置文件:
platform-config/src/main/resources/Dockerfile.vm
这个容器使用了alibaba的jdk17,默认设置的时区为上海,内存大小为512。开启jvm异常退出时内存dump文件。
唯一id生成器
采用了百度的唯一id生成器并进行了一些改动。支持id映射防止数据被爬取。
分布式事务
alibaba seata
官网:https://seata.io/zh-cn/index.html
注册中心&配置中心
alibaba nacos
官网:https://nacos.io/zh-cn/
流量治理
alibaba Sentinel
官网:https://sentinelguard.io/zh-cn/docs/introduction.html
安装:K8S搭建微服务灵魂组件sentinel并通过Nacos动态配置
调用链追踪
jaeger
官网:https://www.jaegertracing.io/
日志管理
日志是通过logback管理。将日志分为两部分同时记录。
- 文件存储
将日志文件按照每天每个文件最大100M的规则保留30天内的日志文件策略。
platform-config/src/main/resources/logback-boot.xml.vm
- Elasticsearch存储
es存储使用了logback的插件:logback-elasticsearch-appender
此方案有部分问题。会占用内存。可能会丢失日志。如果丢失日志的话需要通过本地日志文件来查找丢失的日志
# pom.xml
<!-- 日志 -->
<dependency>
<groupId>com.internetitem</groupId>
<artifactId>logback-elasticsearch-appender</artifactId>
<version>${logback-elasticsearch-appender}</version>
</dependency>
Elasticsearch kibana
官网:https://www.elastic.co/cn/
安装:Kubernetes 中搭建Elasticsearch集群
模块介绍 platform-cloud-web-auth
这是微服务中的授权模块。通过spring-security-oauth2模块完成。微服务的所有调用从这里开始。获取jwt后传入网关调用服务。并且对接了第三方登录如企业微信。微信等等。
模块介绍 platform-cloud-web-file
文件上传服务。通过jwt找到对应渠道将文件存储到服务器并返回url。
模块介绍 platform-cloud-web-gateway
使用spring cloud gateway 做的微服务网关。实现了:jwt鉴权,流量控制,参数验证,日志记录,防重复,统一状态码,报文加签加密等。
模块介绍 platform-cloud-web-link
短连接服务
模块介绍 platform-cloud-web-tool
一些工具类,生成唯一id,解析jwt,ip定位等。
模块介绍 platform-cloud-service-channel
渠道服务
模块介绍 platform-cloud-service-data
数据服务如行政区域,星座列表,翻译等
模块介绍 platform-cloud-service-graphql
graphql
模块介绍 platform-cloud-service-link
短连接服务,生成短连接,短连接事件监控。
模块介绍 platform-cloud-service-message
消息服务。邮件,mqtt消息推送等
模块介绍 platform-cloud-service-network
网络服务。ip定位,翻译等
模块介绍 platform-cloud-service-security
安全服务,图片验证码,邮箱,手机验证码。数据加密服务
模块介绍 platform-cloud-service-task
定时任务。清理es数据,清理数据库数据等
模块介绍 platform-cloud-service-user
用户服务