架构设计
- README
- 建设数据中台、业务中台、物联中台,三中台的必要性
- 关于xx实验室信息化系统建设的必要性
- 人人框架微服务版开发环境和安装部署
- 人人框架代码生成器安装部署
- 软件增加license管理
- 各应用平台注册地址
- 信息系统安全定级说明
- 运维支持考试题
- adobe全家桶
README
建设数据中台、业务中台、物联中台,三中台的必要性
在过去的时间里,我们建设了大量的软件信息化系统、硬件基础设施。在设计和建设时,信息化系统按使用部门的要求建设,重点解决使用部门的痛点,软、硬件协作、独立完成一项工作,软硬件系统作为一个重要工具存在。
随着时间的推移,信息化系统由不同的厂家、在不通的时间、采用不同技术构建,系统和系统之间存在数据不通、技术障碍等因素不能协作;功能存在重复,相同的数据在各信息化系统存在不一致的版本。
信息化系统犹如一个个高大的烟囱,可以独立处理业务功能,却无法组合和发挥更大价值,大量数据闲置,未形成数据资产。信息化停留在工具层面,未能对顶层决策带来有效的支撑,信息化系统呈孤岛态势。
在此背景下,在新的信息化建设规划中,我们提出,在有条件的情况下,优先建设数据中台、业务中台、物联中台,夯实基础,避免过去遇到的问题。 数据中台:通过多种技术手段,直接读取数据库、API采集、导入等多种方式,将同构、异构的数据孤岛,重新汇聚入湖(数据湖);通过对数据的比对、清洗、转换、标准化提炼,形成新的有价值数据;使用数据目录共享和对外发布数据,让其他系统可复用;通过对数据标准和源头的确定,使各系统的数据同源(口径一致)。通过对数据标准的制定,让数据交换共享更便利、不受时间、技术的限制。
因为有了全貌、全量的数据,使信息化系统从工具层面,升华到可决策、可视化、可经营、可管理层面。让信息化系统发挥更大的价值。
业务中台:通过对业务系统的共性功能提取,形成可复用的能力;对共性业务能力集中管理;对共性业务能力目录盘点,识别出既有能力,缺失能力,对信息能力查漏补缺;检索共性业务目录,在新的信息化系统规划阶段,既能有效控制建设范围,避免重新建设,降低新建信息化系统的范围,提高新建信息化的速度,最终达到降本增效的目的。
物联中台:通过对多种设备的抽象、模板、接入、管理,将物联设备产生的数据,抽象到数据中台,将物联能力抽象到业务中台。物联设备不再是独立的存在,将设备数字化后使其拥有更多的能力;根据多种策略,进行联动、告警、控制,实时反映设备状况,使设备也能成为生产经营决策的重要组成部分。
关于xx实验室信息化系统建设的必要性
当前xxx实验室弱电与智能设备已经初步安装完成。实验室做为一个特殊的区域,在有效持续运营方面还存在信息化管理手段缺失。
- 实验室运营方: 实验室的主要资产为实验设备,主要使用单位为科研机构,主要工作内容课题研究,主要输出成果为科研成果。对科研设备的管理,提高设备的利用率,科研过程中的规范管理,安全生产,提高实验室的运作效率、保护科研设备。 实验室管理系统:包括项目管理、实验室预约,安全管理、危化品管理,耗材管理、实验器材共享平台。 科研孵化平台:拉通科研机构与社会力量,将科研结果转换为商用成果,是实验室运营方持续经营的必要手段。 服务共享平台:将实验室的多家科研机构成果共享、协作,共同完成科研任务。
- 主管部门 掌握辖区科研进度,成果转换情况,实验室运作情况。及时根据运营情况调整科研政策。需要相关的数据决策与支撑。 数据中台:通过多种技术手段,直接读取数据库、API采集、导入等多种方式,将同构、异构的数据,从多个专业信息化系统,重新汇聚入湖(数据湖);通过对数据的比对、清洗、转换、标准化提炼,形成新的有价值数据;使用数据目录共享和对外发布数据,让其他系统(单位)可复用;通过对数据标准和源头的确定,使各系统的数据同源(口径一致)。通过对数据标准的制定,让数据交换共享更便利、不受时间、技术的限制。 因为有了全貌、全量的数据,使信息化系统从工具层面,升华到可决策、可视化、可经营、可管理层面。 领导驾驶舱:通过对关键数据指标、关键运营指标、关键设备指标等,进行图形化展示,通过对数字孪生叠加,使整个实验室运营情况可视化,掌握整个实验室的整体运作情况。通过多维度的指标分析,使实验室运行情况可决策、可经营。
- 物业管理方 作为楼宇、设备的维护方,为实验室提供运行保障。需要对物业服务过程优化、协调等。帮助物业管理公司提高工作效率,降低运营成本,提升服务质量,增强客户满意度。让物业管理变得更加智能化、高效化、便捷化。 物业的日常管理包括:人员管理、车辆管理、设备管理、巡更巡检、访客管理、安防告警、房租水电合同管理、保洁任务。通过标准化的管理模型,建立自身知识库,积累和整合自身的经验和优势,提升自身的核心竞争力。 清晰的业务流程明确各岗位职责,规范的业务操作提高各个业务环节的工作效率——软件系统的实施能最大限度的减少管理漏洞,减少人为因素的干预,并提高企业运营和管理效率,支持企业商业目标的实现,从而从根本上提高企业的行业竞争性
人人框架微服务版开发环境和安装部署
renren微服务框架需要jdk 17 ,nodejs 18+ 请注意版本选择
安装mysql数据库
先安mysql装数据库,并创建两个database,一个用于nacos,一个用于项目,初始化nacos数据结构和数据。
nacos-server-2.2.3 数据库初始化脚本:nacos-2.2.3-mysql-schema.sql
安装部署nacos
官方网址:https://nacos.io/zh-cn/docs/what-is-nacos.html
github地址:https://github.com/alibaba/nacos
github数据库初始化脚本:https://github.com/alibaba/nacos/blob/master/distribution/conf/mysql-schema.sql
# 镜像
# 根据需要,开放8848和9848端口
nacos/nacos-server:v2.2.3
# 设置环境变量
# 系统(集群)启动方式 ,cluster:集群,standalone:单机
MODE: standalone
# 数据库名称
MYSQL_SERVICE_DB_NAME = renren_cloud_nacos
# 数据地址
MYSQL_SERVICE_HOST = 192.168.0.10
# 数据库密码
MYSQL_SERVICE_PASSWORD = <your password>
# 数据库端口
MYSQL_SERVICE_PORT: 33306
# 数据用用户名
MYSQL_SERVICE_USER: root
# 主机模式,ip:ip地址,host:主机名
PREFER_HOST_MODE: ip
# 数据库类型
SPRING_DATASOURCE_PLATFORM: mysql
安装部署redis
version: "3"
services:
redis:
image: redis:6.2.6
restart: always # 自动重启
ports:
- 56301:6379
command: redis-server --appendonly yes --requirepass <your password>
编写Dockerfile
- java项目,包括:renren-admin-server,renren-gateway
FROM openjdk:17
EXPOSE 8080
# VOLUME /tmp
ADD target/renren-admin-server.jar /app.jar
CMD ["java","-jar","/app.jar"]
-
VUE前端项目,包括web-admin
-
nginx.conf
server {
listen 80;
#listen 443 ssl;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
#ssl_certificate /home/ssl/server.crt;
#ssl_certificate_key /home/ssl/server.key;
root /usr/share/nginx/html;
index index.html;
location / {
# 不缓存首页,解决VUE单页面发版后不生效
add_header Cache-Control "no-cache no-store must-revalidate proxy-revalidate,max-age=0";
add_header Last-Modified $date_gmt;
# 这个有顺序,需要加在后面
etag off;
}
}
- Dockerfile
FROM nginx:latest
EXPOSE 80
COPY ./dist /usr/share/nginx/html
COPY ./nginx/default.conf /etc/nginx/conf.d/default.conf
-
解决浏览器版本缓存不刷新
-
编写push.sh文件
#!/bin/bash
# 登录
docker login -u <your name> -p <your password> swr.cn-south-1.myhuaweicloud.com
# 打包
docker build -t swr.cn-south-1.myhuaweicloud.com/vp-park/park-baseline/<your image name>:v1.0 ./
# 推送
docker push swr.cn-south-1.myhuaweicloud.com/vp-park/park-baseline//<your image name>:v1.0
编写统一配置文件
在k8s新建ConfigMap,然后再java服务中引用配置:增加环境变量,选ConfigMap,选择需要的configMap名称
# 服务地址
nacos_host = nacos-server
# 名字空间
nacos_namespace = public
# 端口
nacos_port = 8848
进一操作请参考rancher使用手册
上传nacos配置文件
打开nacos管理界⾯(http://localhost:8848/nacos) ,初始⽤户名nacos,密码nacos,登录之后,如下所示:
导⼊nacos配置⽂件,配置⽂件在项⽬⾥,⽂件名为:【~/doc/nacos/nacos_config.zip】,如下所示:
在nacos⾥,还需要修改datasource.yaml,如:redis、MySQL信息,如下所示:
安装部署代码生成器
安装部署代码生成器:人人框架代码生成器安装部署
人人框架代码生成器安装部署
代码生成器能生成基础的单表、实体、列表、CURD,减少毫无意义的工作,还能保证基础代码的一致性,强制需要使用。
代码生成器生成的代码路径存放运本机磁盘,需要在本机同时运行基础项目、代码生成器项目、前端项目;后端开发人员不会运行前端项目,前端开发人员不会运行java项目。会造成一定的麻烦。
比较好的做法是将代码生成器部署到服务器给大家共享,再用web版本的vscode浏览、将代码复制回来粘贴到项目中。
安装部署代码生成器
源代码位置:/renren-module/renren-devtools
- 编写dockerfile
# vi Dockerfile
FROM openjdk:17
EXPOSE 8080
# VOLUME /tmp
ADD target/renren-devtools.jar /app.jar
CMD ["java","-jar","/app.jar"]
- 编写push.sh
#!/bin/bash
# 登录
docker login -u <your name> -p <your password> swr.cn-south-1.myhuaweicloud.com
# 打包
docker build -t swr.cn-south-1.myhuaweicloud.com/vp-park/park-weihai/renren-devtools-server:v1.0 ./
# 推送
docker push swr.cn-south-1.myhuaweicloud.com/vp-park/park-weihai/renren-devtools-server:v1.0
- 导入代码生成器初始化数据库脚本
源代码位置:/renren-module/renren-devtools/db/mysql.sql
设置代码生成器生
注意代码生成路径 ,如果是容器运行,请将 /data 目录挂载到磁盘或者NFS
- 导入模板
模板位置:/renren-module/renren-devtools/db/template 将模板粘贴到对应项
- 生成代码
- 设置代码包相关信息
注意代码生成路径 ,如果是容器运行,请将 /data 目录挂载到磁盘或者NFS
运行code-server
code-server具有极高的权限,开发完成后应该删除相关部署、设置复杂密码
version: "2.1"
services:
code-server:
image: swr.cn-south-1.myhuaweicloud.com/vp-whdev/all-in-devops/vscode-server:latest
container_name: code-server
environment:
- PUID=1000
- PGID=1000
- TZ=Etc/UTC
- PASSWORD=password # web gui password
- DEFAULT_WORKSPACE=/data # 打开 web gui 时默认打开文件夹
volumes:
- /path/to/appdata/config:/data # 将前面设置的代码生成器映射到 code-server
ports:
- 8443:8443
restart: unless-stopped
# 设置兖州后需要登录,登录页位于网站根目录,需要为 code-server 单独设置一个域名
浏览code-server将代码复制到项目
软件增加license管理
需要增加2个文件,建议目录放置在config目录
FilterConfig.java
全局过滤器配置 ,对需要拦截的路径进行配置
package cn.vppark.whdev.license_test.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* Filter配置
*
* @author Mark sunlightcs@gmail.com
*/
@Configuration
public class FilterConfig {
@Value("${app.license:}")
private String license;
@Bean
public FilterRegistrationBean licenseFilterRegistration() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setFilter(new LicenseFilter(license));
registration.addUrlPatterns("/*");
registration.setName("licenseFilter");
registration.setOrder(Integer.MAX_VALUE);
return registration;
}
}
LicenseFilter.java
package cn.vppark.whdev.license_test.config;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Value;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import javax.servlet.*;
import javax.servlet.http.HttpServletResponse;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.net.URI;
import java.net.URISyntaxException;
import java.net.URL;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.security.InvalidKeyException;
import java.security.KeyFactory;
import java.security.NoSuchAlgorithmException;
import java.security.spec.InvalidKeySpecException;
import java.security.spec.X509EncodedKeySpec;
import java.util.Base64;
import java.util.Date;
/**
* @Description: 证书校验
* @date: 2024年4月9日 下午12:39:48
* @Copyright:
*/
public class LicenseFilter implements Filter {
private String license;
/**
* 公钥
*/
private final String publicKey = "your public key";
public LicenseFilter(String license) {
this.license = license;
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
//设置返回参数
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
httpServletResponse.setStatus(HttpServletResponse.SC_BAD_REQUEST);
httpServletResponse.setCharacterEncoding("UTF-8");
httpServletResponse.setContentType("text/html; charset=UTF-8");
try {
if (this.license == null || license.isEmpty()) {
// 优先使用配置文件的证书,因为调试运行的时候,会清空target目录,导致证书文件丢失
this.license = IOUtils.toString(new FileInputStream(getLicensePath()), StandardCharsets.UTF_8);
}
//解密证书
String licenseContent = verifyLicense(this.license);
JSONObject json = JSONObject.parseObject(licenseContent);
//获取过期时间
Date expire = json.getDate("expire");
httpServletResponse.setHeader("license-expire", expire.toString());
//判断证书是否过期
if (expire.getTime() < System.currentTimeMillis()) {
httpServletResponse.getWriter().write("软件授权过期!");
return;
}
httpServletResponse.setStatus(HttpServletResponse.SC_OK);
} catch (FileNotFoundException e) {
httpServletResponse.getWriter().write("证书文件丢失,请联系管理员!");
e.printStackTrace();
return;
} catch (Exception e) {
httpServletResponse.getWriter().write("证书文件已损坏,请联系管理员!");
e.printStackTrace();
return;
}
chain.doFilter(request, response);
}
/**
* @throws
* @Description: 根据公钥解密字符串
* @param: licenseContent 证书内容
*/
public String verifyLicense(String licenseContent) throws NoSuchAlgorithmException, InvalidKeySpecException, InvalidKeyException, NoSuchPaddingException, IllegalBlockSizeException, BadPaddingException {
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, KeyFactory.getInstance("RSA").generatePublic(new X509EncodedKeySpec(Base64.getDecoder().decode(publicKey))));
byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(licenseContent));
String decryptedString = new String(decryptedBytes);
// 打印解密后的证书内容
System.out.println("licenseContent: " + decryptedString);
return decryptedString;
}
/**
* @throws
* @Description: 获取license完整路径
*/
private String getLicensePath() throws URISyntaxException {
URL classUrl = this.getClass().getProtectionDomain().getCodeSource().getLocation();
URI uri = classUrl.toURI();
Path path;
if (uri.getScheme().equals("jar")) {
// 如果是一个JAR URL,我们需要找到JAR文件本身
String jarPath = uri.getSchemeSpecificPart();
jarPath = jarPath.substring(0, jarPath.indexOf('!'));
path = Paths.get(new URI(jarPath)).getParent();
} else {
// 如果不是JAR URL,则可能是直接从文件系统加载的类
path = Paths.get(uri);
}
String licensePath = path.resolve("license/license").toString();
// 打印证书路径
System.out.println("licensePath: " + licensePath);
return licensePath;
}
}
各应用平台注册地址
信息系统安全定级说明
一、确定安全保护等级
依据《信息安全等级保护管理办法》(公通字 [2007] 43 号)《关于开展全国重要信息系统安全等级保护定级工作的通知》 (公信安[2007]861 号)、《信息安全技术网络安全等级保护定级指南》(GB/T22240-2020) 等文件规定和国家政务外网的统一要求,所建设的需要信息系统的安全保护等级。
二、安全等级保护等级确定流程
确定信息系统安全保护等级的一般流程如下:
- 第一、确定作为定级对象的信息系统;
- 第二、确定业务信息安全受到破坏时所侵害的客体;
- 第三、根据不同的受侵害客体,从多个方面综合评定业务信息安全被破坏对客体的侵害程度;
- 第四、得到业务信息安全保护等级;
- 第五、确定系统服务安全受到破坏时所侵害的客体;
- 第六、根据不同的受侵害客体,从多个方面综合评定系统服务安全被破坏对客体的侵害程度;
- 第七、得到系统服务安全保护等级;
- 第八、将业务信息安全保护等级和系统服务安全保护等级的较高者确定为定级对象的安全保护等级。
信息安全保护等级矩阵表如下所示:
三、定级对象受侵害客体
定级对象受到破坏时所侵害的客体包括国家安全、社会秩序、公众利益以及公民、法人和其他组织的合法权益。
-
1、受侵害的客体及对客体的侵害程度
- (1) 侵害国家安全主要是指影响国家政权稳固和国防实力、民族团结和社会安定、重要的安全保卫工作、经济竞争力和科技实力等。
- (2) 侵害社会秩序主要是指影响国家机关社会管理和公共服务的工作秩序、各种类型的经济活动秩序等。
- (3) 影响公共利益主要是指影响公共设施、公开信息资源、公共服务等方面。
- (4) 影响公民、法人和其他组织的合法权益是指由法律确认的并受法律保护的公民、法人和其他组织所享有的一定的社会权利和利。
-
2、不同危害后果的三种危害程度
- (1)一般损害:工作职能受到局部影响,业务能力有所降低但不影响主要功能的执行,出现较轻的法律问题,较低的财产损失,有限的社会不良影响,对其他组织和个人造成较低损害。
- (2) 严重损害:工作职能受到严重影响,业务能力显著下降目严重影响主要功能执行,出现较严重的法律问题,较高的财产损失,较大范围的社会不良影响,对其他组织和个人造成较严重损害。
- (3) 特别严重损害: 工作职能受到特别严重影响或丧失行使能力,业务能力严重下降且或功能无法执行,出现极其严重的法律问题.极高的财产损失,大范围的社会不良影响,对其他组织和个人造成非常严重损害。
运维支持考试题
运维知识考试题
- 1.如何打包docker镜像;
- 2.如何启动一组docker镜像;
- 3.如何查看docker容器的日志;
- 4.Docker默认会将容器镜像下载到/var/lib/docker目录,随着版本的发布、获取新版本镜像,会导致系统磁盘空间不足,如何有效避免这一必现的主机存储不足问题。
- 5.docker容器启动的时候,会自动创建一个docker桥接网络,根据每台主机的性能不同,docker桥接网络的数量可能超过主机限制而无法继续创建容器,在超过限制后如何继续创建docker容器;
- 6.使用docker后,每次重新启动docker容器,其内部数据会被重置,如何实现docker容器内应用数据的持久化放置业务数据丢失;
- 7.当前K8S集群有一台节点坏了,如何合理的退出节点和加入节点;
- 8.解释一下k8s中的deploy,pod,server,configmap,secrets;
- 9.K8s部署容器的时候,使用的镜像是私有镜像仓库、仓库有密码有认证时,如何正确拉取到镜像;
- 10.某些容器需要调用更多的系统能力,在K8S网络该如何设置;
- 11.某个应用因为管理要求,仅能在某个主机节点调度,请问在K8S网络如何调度;
- 12.K8s默认采用http访问后端,当前有一个后端必须要用https访问,请问能正确访问到后端,当前k8s集群使用nginx-ingress;
- 13.在K8S部署好的应用上传文件的时候,时提示文件太大,当前使用nginx-ingress;
- 14.如何统一设置k8s网络的https的证书,而不是在每个ingress单独设置https证书,当前使用nginx-ingress;
- 15.K8s集群内部各组件使用https证书通讯,k8s内置的https证书默认为一年,请问如何续期k8s集群组件的https证书
- 16.我们通常使用ping来确定主机是否在线,但是linux的ping会持续,主机监控系统因为ping没有返回,而无法确定主机是否在线,请问应该如何让监控系统正确得到ping的返回结果;
- 17.如何确定k8s集群是否正常;
- 18.如何批量查询、删除K8S集群中的不正常pod;
- 19.如何测试磁盘写入、读取速度;
- 20.在某些自建机房中,禁止了网络环路,而导致不能直接在内部使用服务公布的域名访问,而内部服务发现与调用又仅支持域名访问,请问要如何访问;
- 21.某个正常访问的服务,突然发生了外部网络不可达错误,请简要描述排查步骤;
- 22.当前有一个k8s 部署运行不起来,连pod都没有创建,请问如何排除容器运行不起来的原因;
- 23.如何对容器做jvm限制;
- 24.当前有一个Java开发的项目,根据前面的容器打包方式已经打包为docker镜像并部署到了k8s网络,研发人员告知,当前项目下需要使用prod配置文件,请问如何在不更改docker镜像的情况下指定当前应用程序的运行环境配置文件。
- 25.K8s内有两个项目,如何在这两个项目之间进行服务调用,而不是通过对外公布的服务又从外网接入损失流量和性能。
- 26.K8s容器网络ping不通;
- 27.Nginx的local或proxy_pass有带有 反斜杠(/)和不带反斜杠(/)二者之间有什么区别;
- 28.有一个后端服务,后端没有做身份认证,现找不到服务厂商维护、没有源代码,现在因为管理要求,需要对这个服务做身份认证,请问如何管理;
- 29.当前在linux排除问题,但是后端服务限制了近能使用域名访问,该如何排查;
- 30.linux常用的主机性能查看命令例如、磁盘、内存、CPU、网络等命令;
- 31.如何设置linux服务器密码过期策略(180天);
- 32.如何查看mysql的主要性能指标参数;
- 33.如何确定和使用mysql的慢日志;
- 34.如何确定和使用mysql的性能分析模式分析mysql优化项;
- 35.如何设置mysql的密码过期策略(180天);
- 36.如何备份和恢复mysql数据库,并只做一个定时任务来定期备份数据库;
- 37.解释一下华为云的elb的实例、监听器、转发器、后端组分别代表的什么意思;
adobe全家桶
https://www.yuque.com/doolook/xvdbng/nkm8p1ws5dmf1ksc?singleDoc