基于SpringBoot的微服务架构与K8S容器部署实践( 二 )

使用logback日志组件
采用logback日志框架,可以在logback配置文件中指定针对不同的Spring profile在不同的环境中采用不同的日志级别,并采用不同的appender 。同时引入spring-cloud-starter-sleuth依赖,通过设置traceId,使整个请求全链路上的所有日志打印出一致的traceId,大大方便了各系统间生产问题的协同排查 。另外,采用异步方式记录日志,也有利于降低IO阻塞 。
<springProfile name="stg"><root level="error"><appender-ref ref="STDOUT"/><appender-ref ref="SAVE-ERROR-TO-FILE-STG"/></root><logger name="org.xxx" level="error" additivity="false"><appender-ref ref="STDOUT"/><appender-ref ref="ASYNC-SAVE-TO-FILE-STG"/></logger></springProfile><springProfile name="prod"><root level="error"><appender-ref ref="STDOUT"/><appender-ref ref="SAVE-ERROR-TO-FILE-PROD"/></root><logger name="org.xxx" level="error" additivity="false"><appender-ref ref="ASYNC-SAVE-TO-FILE-PROD"/></logger></springProfile>复制代码SSL加密及密码安全
全链路传输加密已成为企业安全中必不可少的措施 。通过在classpath中引入CA颁发(也可以使用自签)的jks证书,并在application配置文件中进行简单配置,便可实现SpringBoot应用的SSL加密 。
ssl:enabled: truekey-store: classpath:xxx.net.jkskey-store-type: JKSkey-store-password: RUIEIoUDkey-password: RUIEIoUDrequire-ssl: true复制代码密码以明文形式存放在配置文件中,也是不安全的 。你可以jasypt加密配置文件中使用到的密码,或者直接使用Key-Vault方案,比如本案例中会分别在微软云环境中使用Azure Key Vault或本地IDC中使用Cyberark Conjur方案 。
###同步与异步服务 我们并没有使用Spring Webflux来支持reactive特性,因为,这会增加开发复杂度,并且Webflux虽然改善了Web容器阻塞机制,但并不能从根本上解决高并发请求到来时的阻塞问题 。
在这个案例中,通过搭建了3个节点的RabbitMq镜像集群,作为消息中间件,并通过应用框架的支持,实现了服务的同步异步切换功能 。我们将对外提供的服务注册到数据库中,在应用启动时,读入redis缓存 。当请求到来时,通过API code判断该请求的响应模式:同步或异步 。如果是同步请求则直接处理,而如果是异步请求,则发送到RabbitMq中,再由经过封装的消费者组件进行异步消费,最终达到削峰的目的 。

基于SpringBoot的微服务架构与K8S容器部署实践

文章插图
 
?
对于开发人员来说,他们只需要关注服务的业务逻辑开发,由应用框架统一处理服务的同步,异步切换,消息发送或失败时的异常处理,以及死信队列的维护等工作 。
Dockerfile
案例中的四个组件需要实现容器化部署,分别为SpringBoot应用与Vue应用创建Dockerfile 。
典型的SpringBoot应用Dockerfile如下,一般情况下大型组织会构建私有镜像仓库,通过私有仓库拉取镜像的速度更快,能够节省CICD的时间 。
FROM openjdk:11-jre#FROM cargo.xxx.net/library/openjdk:11-jreARG JAR_FILE=console-service/build/libs/*.jarCOPY ${JAR_FILE} app.jarEXPOSE 9002EXPOSE 9003ENTRYPOINT [ "java", "-jar", "/app.jar" ]复制代码vue应用的Dockerfile如下,同样添加了SSL证书,进行传输加密:
FROM cargo.xxx.net/library/nginx:stable-alpineCOPY /dist /usr/share/nginx/html/consoleCOPY nginx.conf /etc/nginx/nginx.confARG KEY_FILE=stg.xxx.net.keyARG PEM_FILE=stg.xxx.net.pemCOPY ${KEY_FILE} /etc/ssl/certs/cert.keyCOPY ${PEM_FILE} /etc/ssl/certs/cert.pemEXPOSE 80CMD [ "nginx", "-c", "/etc/nginx/nginx.conf", "-g", "daemon off;" ]复制代码编写dockerfile时有以下一些注意事项:
  • 基础镜像:尽可能推荐选择官方镜像
  • 选择大小适中的版本:如果选择的基础镜像过大,启动后需要消耗更多的资源,影响系统性能 。如果太小,则可能缺失关键功能 。
  • 利用缓存:将dockerfile中不易变动的内容写在dockerfile最前 。
##数据库架构 在账户数据上亿,交易数据几百亿的系统,需要采用分库分表方案 。本案例中,采用了MyCat+MySQL的数据库架构方案 。采用mycat代理Master与Slave,可灵活进行主从切换 。Slave可作为Master热备,也同时可作为读库,实现读写分离 。备库除作为准实时的备份外,也可作为运维库或提供大数据平台数据抽取 。


推荐阅读