前言
本次对公司自研DevOps平台做了一个相对概括的讲解,没有像上一次写网关那样贴很多代码,本次都是很直白的去展示和讲解功能。因为这部分功能都是引入K8S、GitLab之类提供的Java-client调API即可,代码上没啥好说的,都是强业务代码,没必要贴出来。写出来也是总结一下,分享给同事和读者一种设计思路,同时想了解下大家有没有新的或者改进的建议。
主体功能展示
首页
首页没什么好说的,整个平台只有最简单的两级关系,系统-->后端、前端,每个地方都做了权限管控,不用担心越权的问题。同时上一篇网关也提到过,修改了nacos的源码,组之间不允许服务发现,这里的组对应开发服务平台的系统概念。也就是说,在同一个系统的不同微服务之间是允许服务发现,直接RPC调用不用走网关。
创建系统时就是做一个简单的信息收集,具体到项目主页中进行详细的配置。值得注意的是,这里的系统编码对应nacos中的group。
项目主页
下面系统设置没什么可说的,就是以RBAC模型建立的权限管控,没有很复杂。这里前端和服务两个菜单是对前后端进行管控的地方,基础服务是通用的服务,流水线和应用部署是CI/CD的具体实现。sysId是每个项目的唯一ID,AccessKeySecret是生成权限令牌的密钥。绑定服务功能是为了兼容历史项目特别提供的。
前后端微服务创建的方式相同,名称是中文标识,编码会自动填充到spring.application.name。模板类型必选,最重要的是模板内置的.gitlab-ci.yml文件,它是用来定义 CI/CD 流水线的配置,指导 GitLab 在项目中运行持续集成和持续交付流程。.gitlab-ci.yml为了避免修改,只有一个链接指向真正的内容。
基础服务
基础服务是公司提供的通用基础功能,文档就是使用说明,详情内根据不同的模块跳转不同的位置。消息通知内部是提供邮件、飞书、短信的授权以及通知记录查询。认证会话服务提供部门内部所有服务的认证、授权和鉴权,也算是单点登录,详情里提供模拟身份功能的后台管理。文件服务详情中是一个文件列表,可以搜索和下载,不提供上传功能。
中间件
现在中间件受到管控,目前支持MySQL、Redis、Elastic Search、Kafka、Mongo、RabbitMQ和ZooKeeper种常用中间件。部署类型其实就是调优参数后的配置区别,因为是容器部署,提前准好配置文件就可以即时创建,比如MySQL会进行常见的配置调优,详见口语化讲解数据库优化。
服务部署
一个很普通的部署页面,这里的部署类型同样会针对不同的类型,提供不同的JVM参数配置和容器配置。
注册中心主要是提供一个手动注册功能,同时能看到当前有多少个节点和一些基础信息。
监控
点进具体的服务后,内嵌了一个Grafana看板,这里有对应该服务类型的监控。这个监控就是利用Prometheus+Grafana监控K8S的各类容器,具体指标就不详细展示了。
中间件的这里要复杂一些,监控就不说了,逻辑一样的。连接分为内部调用连接和外部调用连接,外部连接是需要申请的,且有有效期,超时链接无效拒绝访问。账号则是提供了多种权限类型的账号,这样双管齐下有效提升了权限管控的力度,生产上最近新增了堡垒机,是基于开源魔改的,测试中。
日志
从查看日志进去后是两种,实时日志是K8S的控制台日志,但是这是单点的,有局限性。历史日志是模仿kibana看板写的一个查询页面,查询ES中的数据,这个数据来源于EFK日志监控平台。
代码分析
对外接口
- FileServiceAPI--对象文件服务器,提供新增和查询的功能
- NacosSyncAPI--对接私有化部署的Nacos集群,推送Nacos接口修改数据
- NoticeAPI--对接消息服务,通知信息记录的查询
- OAUserApi--对接HR服务,获取用户等OA信息
申请外部链接资源配置
- 定时任务--30s一次删除过期的外部链接,具体两步,一是逻辑删除数据库的记录,二是调用K8S关闭外部连接
- 启动后运行--implements ApplicationRunner,立刻获取数据库里应该删除的外部连接进行处理
消息队列推送路由变更信息
这个逻辑详见上一篇部门自研网关服务分析,
- RabbitMQ配置类--定义队列和交换机并创建绑定关系
- 事件注解+触发切面--注解有主题、id和内容三个参数,其注解放在开发平台进行路由修改相关操作的接口上,切面解析参数包装后直接推送RabbitMQ。
GitLab相关接口
js
<dependency>
<groupId>org.gitlab4j</groupId>
<artifactId>gitlab4j-api</artifactId>
</dependency>
- 监听类extends EventListener--根据监听的事件进行处理,会操作开发服务平台本身的数据库以及向GitLab推送数据
-
- 系统创建--创建GitLab项目以及初始化团队成员
- 后端服务创建--从数据库获取系统的基本信息、模板的信息,组装gitlab-ci.yaml文件中的链接进行文本替换。GitLab初始化项目的逻辑是,先调用接口拉取模板项目文件到本地,然后替换模板文件中的参数,比如gitlab-ci.yaml,再初始化Git信息,接着推送到远程仓库,最后调接口创建gitlab项目的webhook
- 前端创建--与后端类似
- 发布类ApplicationEventPublisher publisher--负责组装数据进行发布
前后端服务、中间件等资源创建
js
<dependency>
<groupId>io.kubernetes</groupId>
<artifactId>client-java</artifactId>
</dependency>
常规流程是基础信息的CURD再调用K8S的接口创建,分为几种资源的CURD操作
- Deployment:
-
- 定义: 用于描述应用程序的部署,指定应用程序的副本数、容器镜像、存储卷等。
- 用途: 适用于无状态应用,提供了应用的水平扩展和滚动更新。
- StatefulSet:
-
- 定义: 用于管理有状态应用的部署,为每个 Pod 分配唯一的标识符。
- 用途: 适用于有状态应用,如数据库,要求每个 Pod 有稳定的标识符。
- ConfigMap:
-
- 定义: 存储配置数据的对象,可以在 Pod 中被挂载为卷或作为环境变量。
- 用途: 用于将配置信息与容器镜像分离,方便配置的管理和更新。
- Secret:
-
- 定义: 存储敏感信息,如密码、API 密钥等。
- 用途: 用于安全地存储和传递敏感数据,可以在 Pod 中使用。
- NetworkPolicies:
-
- 定义: 用于定义 Pod 之间和与外部网络通信的规则。
- 用途: 用于控制网络流量,实现网络隔离和安全策略。
- Ingress:
-
- 定义: 允许定义外部到集群内 Services 的映射规则。
- 用途: 用于将外部流量路由到集群内的服务,支持 HTTP 和 HTTPS。
- Custom Resources:
-
- 定义: 允许用户定义自己的资源类型,扩展 Kubernetes 的 API。
- 用途: 用于自定义资源对象,例如 Istio 中的 VirtualService。
- Service:
-
- 定义: 提供一种抽象,定义一组 Pod 如何访问。
- 用途: 用于将一组 Pod 暴露为一个网络服务,可以是 ClusterIP、NodePort、LoadBalancer 或 ExternalName。
- Job:
-
- 定义: 用于运行一次性任务或批处理作业。
- 用途: 适用于需要完成的任务,确保任务成功完成或者失败后自动重试。
创建流程是首先获取K8S的集群信息,接着检查命名空间是否创建,没有的话即时创建一个。根据当前的资源类型创建对应的资源,如果当前批次的资源有一个创建失败则手动删除历史成功的资源进行回滚。
中间件的信息初始化统统继承一个接口,里面有四个方法需要重写,分别是资源文件、内部外部链接、账号初始化。在资源创建的时候会调用对应中间件比如MySQL的实现类去初始化信息。
技术栈
注册中心--现在是用Nacos,以前用的consul
配置中心--Apollo,历史原因未迁移Nacos
数据存储--MySQL、Oracle、TiDB、MongoDB、Redis、ElasticSearch
日志收集--FileBeat、Kafka、Logstash、ElasticSearch、Kibana
性能监控、链路追踪--pinpoint主用、部分项目用了skywalking
消息队列--Kafka、RabbitMQ
对象存储--FastFDS,准备升级为Minio
任务调度--elasticjob
网关--SpringGateway
代码管理--Git、GitLab
监控告警--Prometheus、Grafana
写在最后
最近会继续精进一下大数据和网关的东西,文章可能出得比较慢,在学一些东西。后面会出一些文章,计划是口语化大数据、系统设计整理、网关优化。