IT总结:

IT总结(图片去看本地个人笔记文件夹):

JAVA扩展知识

现网BUG处理流程:
	1,先确认是不是bug
	2,确认是之后,先看看在测试环境是否可以复现问题
	3,可以复现的,直接查测试的日志和代码,修复完成后,打包更新后通知给测试进行回归测试
	4,测试环境不可以复现的,需要什么东西,先找运维,现网的东西尽量让运维童鞋操作。必要情况下,再自己去现网操作
Collection转List的方法
Collection<T>  collection  =  map.values();

List<T>   list   =    new  ArrayList<T>(collection);
@Autowired 在某个方法自动注入为空

原因:

是因为有一些方法的初始化优先级会高于@Autowired运行,所以造成bean还没有创建即为:null,方法就调用了,

解决办法: SpringContextUtil.getBean(xxService.class)

把
@Autowired 
private BlackAshProductionHotWordService blackAshProductionHotWordService;


改为:
private BlackAshProductionHotWordService blackAshProductionHotWordService = SpringContextUtil.getBean(BlackAshProductionHotWordService.class);
Java将本地图片转为二进制流,将二进制流转化为图片
public static void main(String[] args) {
      //图片转化为二进制
        byte[] imageBytes = null; 
        try (FileInputStream fileInputStream = new FileInputStream(new File("C:/4.jpg"));) {
            imageBytes = new byte[fileInputStream.available()];
            fileInputStream.read(imageBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(imageBytes);
 
     //二进制转化为图片
        try (FileOutputStream fileOutputStream = new FileOutputStream(new File("C:/Users/2.jpg"));) {
            fileOutputStream.write(imageBytes);
        } catch (IOException e) {
            e.printStackTrace();
        }
    } 
文件路径的斜杠分割符(避免系统区分是window/Linux):
File.separatorChar
如:
path+ File.separatorChar +"wordCount.png";
MeterRegistry—>度量统计数据收集的一个抽象类,由子类去实现收集数据

MeterRegistry在Micrometer是一个抽象类,主要实现包括:

  • SimpleMeterRegistry:每个Meter的最新数据可以收集到SimpleMeterRegistry实例中,但是这些数据不会发布到其他系统,也就是数据是位于应用的内存中的。
  • CompositeMeterRegistry:多个MeterRegistry聚合,内部维护了一个MeterRegistry的列表。
  • 全局的MeterRegistry:工厂类io.micrometer.core.instrument.Metrics中持有一个静态final的CompositeMeterRegistry实例globalRegistry。

当然,使用者也可以自行继承MeterRegistry去实现自定义的MeterRegistry。SimpleMeterRegistry适合做调试的时候使用,它的简单使用方式如下

什么是 HDFS?

HDFS 是一种分布式文件系统,用于处理在商业硬件上运行的大型数据集。 它用于将单个 Apache Hadoop 集群扩展到数百 (甚至数千)个节点。 HDFS 是 Apache Hadoop 的主要组件之一,其他组件包括 MapReduce 和 YARN。 HDFS 不应与 Apache HBase 混淆或被 Apache HBase 取代,Apache HBase 是一个面向列的非关系数据库管理系统,它位于 HDFS 之上,可以通过其内存处理引擎更好地支持实时数据需求。

记得填写每周工作内容和日报。日报需要新建标签页,见模板
本周任务-BMS合规验收文档学习&BMS能力API优化 一共9个合规文档安全能力的文档 2~3 9~14

合规弱口令需求文档–>详细设计的验收 看他们提供的需求文档–>是否能通过 “详细设计的文档” 实现此功能 如果详细设计文档有不明白的 就得搞清楚
1

卓望项目生产环境服务器
1-都是需要认证的
2-会有运维角色去处理,日志拉取找他们就可以


现网BUG处理流程:
1-先分析确定好是不是真的BUG,
2-确认是BUG后,先看是否能够复现问题,不能的话,就通过日志,查找相关接口分析代码,结合debug去看代码逻辑和执行流程 看是哪里出现了问题
3-处理问题,要谨慎,不可以对线上出现影响,修复完成后择日更新包

svn:

垃圾短信大数据识别 svn文档拉取:
https://10.12.5.33:8443/svn/SpamVoice_PROJECT/trunk

泰岳验收:

自研平不需要对接CMG 只需要对接Agent的接口即可 下周看一下agent还需要对接什么接口

BMS(合规平台) 我们是中间代理(安全管理平台定制) —> AMG安全管理平台 --> 智慧中台能力运营平台(中心) <—租户

BMS(合规平台) 我们是中间代理(安全管理平台定制) —> Agent —> CMG数据采集然后数据上报 —> pushgateway -->中台

租户使用能力的过程:
一:先发起组件入库请求
1-租户请求安全能力管理平台(AMG)进行安全组件入库,就是告诉AMG我要用这个安全能力,
2-AMG对安全能力提供方(安全服务实例)所提供的能力,进行健康安全检测
3-能力提供方返回健康探测后的结果,:如成功
4-则AMG就会反馈给租户,租户就可以安全组件入库成功

	二:能力订购
		5-租户再向AMG进行此能力订购,
		6-AMG 去查询能力提供者 此用户是否存在,存在直接返回,AMG,AMG反馈回租户,租户 能力订购成功,如果查询完  返回用户不存在,AMG会对能力提供者 发起实力用户创建 然后进行关联此租户,并返回成功 
		7-AMG接收能力提供者的反馈,并转发给租户,租户订购成功
	
	三:能力退订
		8-租户发起退订请求给AMG,AMG向服务提供者发起 安全服务实例用户删除接口,实例用户删除此关联的租户-->AMG-->租户退订成功



6.2.3.1. 登录认证接口
6.2.3.2. 实时指标上报接口
6.2.3.5. 周期性指标数据上报接口

2022.10.26
对接中台接口,实现实时数据采集接口开发
① 指标上报接口baseURL =
https://{cmg-pushgateway-ipordomain}:{port}/metrics 上报指标 timestamp为Long类型 数据库存为vachar类型 目前是没有

		②	登录认证接口baseURL =
		https://{cmg-pushgateway-domain}:{port}/login
		③	指标规格元数据查询接口baseURL =
		https://{cmg-pushgateway-ipordomain}:{port}/api/v1.1/metrics/metadata
		④	指标授权数据查询接口baseURL =
		https://{cmg-pushgateway-ipordomain}:{port}/api/v1.1/metrics/app_authorization
		⑤	周期性指标数据上报接口baseURL =
		https://{cmg-pushgateway-ipordomain}:{port}/api/v1.1/metrics/repush

1-

总结:
多重文件的的创建,
文件的解压,
sftp服务器,文件的下载,
json对象的操作(如果给的JSON中,要转对象,但是给的属性数量不全,会转换失败报错:java com.alibaba.fastjson.JSONException: syntax error, pos 1, line 1, column 2)

网元由一个或多个机盘或机框组成, 能够独立完成一定的传输功能。
网管系统中的网元其实和这个差不多,简单理解就是网络中的元素,网络中的设备。总之,网元是网络管理中可以监视和管理的最小单位 就如公司的购买的服务器 就是公司的网元

ctrl + F12 找出这个类的所有方法
ftpClient.retrieveFile(remoteFile, os);
从服务器下载此文件的副本
EventBus

​ 顾名思义,事件总线,是一个轻量级的发布/订阅模式的应用模式。相比于MQ更加简洁,轻量,它可以在一个小系统模块内部使用
​ 1、事件(Event)
​ 2、事件发布者(Publisher) 事件发布者调用Post()方法,将事件发给EventBus。
​ 3、事件订阅者(Subscriber) 添加@Subscribe注解声明自己为事件订阅者

使用场景:
	在工作中,经常会遇见使用异步的方式来发送事件,或者触发另外一个动作:经常用到的框架是MQ(分布式方式通知)。如果是同一个jvm里面通知的话,就可以使用EventBus。由于EventBus使用起来简单、便捷,因此,工作中会经常用到。
servlet项目 需要使用tomcat启动

1-IDEA企业版需要下载插件 smart tomcat
2-在Run->Edit Configurations…->点击+号 选择Smart Tomcat 并命名(哪个模块就命名为哪个模块)
3-配置Configurations

Tomcat server: (配置Tomcat安装目录)
Deployment directory: D:\IDE-SP\MMAP\CM-master\protal\src\main\webapp (你要启动的servlet项目的webapp文件夹的路径)
Context path:/cm-prota (URL,启动成功后可通过IP+端口+URL访问你启动的)
Server port:8080
Admin port:8005
VM options:-Duser.dir=D: IDE-SP\MMAP\CM-master protal -Dfile.encoding=UTF-8	(这里的dir一定会是你项目模块此时的地址)
HTTPS可以单项认证,也可以双向认证

一、什么是Flume?. Flume是由Cloudera软件公司提供的一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统,后与2009年被捐赠了apache软件基金会,为hadoop相关组件之一

jvm

JVM的Xms和Xmx参数设置为什么要设置为相同值
当堆内存使用情况变化时,并不是单纯的扩大和缩小堆内存就完事了。在扩大或者缩小之前还会执行GC(垃圾回收)操作。如果-Xms起初值设置的比较小,那么就频繁触发GC操作。当GC操作无法释放更多内存时,才会进行内存的扩充。为了避免在生产环境由于heap内存扩大或缩小导致应用停顿,降低延迟,同时避免每次垃圾回收完成后JVM 重新分配内存。所以,-Xmx和-Xms一般都是设置相等的。

equals

在Java中,可以使用equals()方法判断字符串的内容是否相同
string str1 = "abcde "; -->放常量池,编译时产生
string str3 = new string ( “abcde”); -->放堆中,在堆中创建对象,地址值和常量池不一样
str1.equals(str3); l/ str1和str3的值相同,结果是true
str1 == str3; l/ str1和str3指向不同的对象,结果是false

字符串常用转换

字符串转换为List

1- 先转成 JSONArray
JSONArray lableList = JSONObject.parseArray(c.getLabels());
JSONArray lableNameList = JSONObject.parseArray(c.getLabelNames());
2-JSONArray 就相当于List了 就可以直接set了

对象转JSON数组
JSON.toJSONString(Object);

项目打包部署

IDEA设置maven打包的jar包名称(建议使用方法2)

方法1:

spring:
application:
name: service

方法2:

${project.artifactId}
IPv4和IPv6的区别

一个IPv6地址由128位组成,而一个IPv4地址仅由32位组成。 与IPv4相比,IPv6有更多的可用地址。 与IPv4相比,IPv6使路由器的任务更加简单。 与IPv4相比,IPv6更适合于移动网络。 IPv6地址用十六进制、冒号分隔的符号表示,而IPv4地址使用点-十进制符号

字符串分割

##将字符串每隔2个分割并用空格隔开存入数组
String str = “abcdefchakdjfkdjfks”;//字符串
int m=str.length()/2;
if(m*2<str.length()){
m++;
}
String[] strs=new String[m];
int j=0;
for(int i=0;i<str.length();i++){
if(i%2==0){//每隔两个
strs[j]=“”+str.charAt(i);
}else{
strs[j]=strs[j]+" "+str.charAt(i);//将字符加上两个空格
j++;
}
}
System.out.println(Arrays.toString(strs));
}

精准分词

=====精准分词-ToAnalysis (这个速度快,但是不能区别大小写)

@Test
public  void test02(){
    long startTime = System.currentTimeMillis();
    String text = "20个左边的卡罗拉倒车镜! ";
    String analysisedText = ToAnalysis.parse(text).toStringWithOutNature();
    long endTime = System.currentTimeMillis();
    long time = endTime - startTime;
    System.out.println("精准分词: " + analysisedText + "(" + time + "ms)");

}

map 可以用作字典
hashMap.putAll(hashMap2);//交集
hashMap.containsValue(3) 判断是否所有的valus中 存在一个以上的 3 (value) 存在 返回true
hashMap.entrySet( )
返回此映射中包含的映射关系的 Set 视图。
hashMap.keySet( )
返回此映射中包含的键的 Set 视图。
hashMap.values( )
返回此映射中包含的值的 Collection 视图。

判断list是否为空(null–>,判断List是否存在,isEmpty–>List存在在判断里面是否有元素)
xxxList
null||xxxList.isEmpty()

密码学知识:

1-公钥
2-密钥
3-算法
4-签名

加密到解密的过程:
1-封装好公钥加密,私钥解密,根据公钥密文和私钥获取签名,什么类型的签名:如RAS签名
2-先随机生成密钥对
3-发送方,将字符串数据用公钥加密后,根据加密后的数据,和私钥获取签名,之后进行RAS签名 最后进行传输,私钥单独发给数据接收方
4-接收方,先验签(防止发送的信息被串改) 签名正确说明传输过程信息没有被修改,然后拿着私钥进行解密即可

john

john 是一款大受欢迎的、免费的开源软件、基于字典的密码破解工具

RMI (Remote Method Invocation) 模型是一种分布式对象应用,使用 RMI 技术可以使一个 JVM 中的对象,调用另一个 JVM 中的对象方法并获取调用结果。这里的另一个 JVM 可以在同一台计算机也可以是远程计算机。因此,RMI 意味着需要一个 Server 端和一个 Client 端。

syslog协议属于一种主从式协议:syslog发送端会发送出一个小的文字消息(小于1024位组)到syslog接收端。接收端通常名为“syslogd”、“syslog daemon”或syslog服务器。系统日志消息可以被以UDP协议及╱或TCP协议来发送。这些数据是以明码类型被发送。

特殊字符 java \t,\n,\r,\b,\f 的作用
\t 相当于tab键

\b 退格(Backspace)

\f 控制台输出相当于如图

\n 换行

\r回车

回车 \r 本义是光标重新回到本行开头。r 的英文return,控制字符可以写成CR,即Carriage Return

换行 \n 本义是光标往下一行(不一定到下一行行首)。n 的英文newline,控制字符可以写成LF,即Line Feed

拦截器注入的类为空,这是因为拦截器的运行是在springcontext前运行的,也就意味着在拦截先运行,context再运行,context在后面,即bean还没有注入,所以拦截器的bean为空
解决办法:1-重写ApplicationContext

文件夹共享权限与NTFS权限

1.共享权限

共享权限有三种:完全控制、更改、读取
任务:了解共享权限
步骤:打开一共享文件夹,查看其共享权限
注意:共享权限只对从网络访问该文件夹的用户起作用,而对于本机登录的用户不起作用。
2.NTFS权限
NTFS权限是NT和Win2000中的文件系统,它支持本地安全性。换句话说,他在同一台计算机上以不同用户名登录,对硬盘上同一文件夹可以有不同的访问权限。
注意:NTFS权限对从网络访问和本机登录的用户都起作用。
3.共享权限和NTFS权限的联系和区别
(1)共享权限是基于文件夹的,也就是说你只能够在文件夹上设置共享权限,不可能在文件上设置共享权限;NTFS权限是基于文件的,你既可以在文件夹上设置也可以在文件上设置.
(2)共享权限只有当用户通过网络访问共享文件夹时才起作用,如果用户是本地登录计算机则共享权限不起作用;NTFS权限无论用户是通过网络还是本地登录使用文件都会起作用,只不过当用户通过网络访问文件时它会与共享权限联合起作用,规则是取最严格的权限设置. 比如:共享权限为只读,NTFS权限是写入,那么最终权限是完全拒绝。这是因为这两个权限的组合权限是两个权限的交集。
(3)共享权限与文件操作系统无关,只要设置共享就能够应用共享权限;NTFS权限必须是NTFS文件系统,否则不起作用.
共享权限只有几种:读取,更改和完全控制;NTFS权限有许多种,如读,写,执行,改变,完全控制等…我们可以进行非常细致的设置.

时间/时间戳的转换

获取当前时间戳

//方法 一
long time1 = System.currentTimeMillis()
//方法 二
long time2 = Calendar.getInstance().getTimeInMillis();
//方法 三
long time3 = new Date().getTime();

获取当前时间
SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);//设置日期格式
String date = df.format(new Date());
System.out.println(“当前时间:”+date);

时间对齐到小时/分钟/年/月(就是不如对齐到分钟,后面的秒就会变会0)
Calendar c = Calendar.getInstance();
c.set(Calendar.HOUR_OF_DAY, 0); 对齐到日
c.set(Calendar.MINUTE, 0); 对齐到分
c.set(Calendar.SECOND, 0); 对齐到秒
c.set(Calendar.MILLISECOND, 0); 对齐到毫秒
Long today=c.getTimeInMillis()/1000;

		 c.setTime(new Date(时间戳));时间戳可以自定义,或者不传就代表是当前时间
		 Date startDate=c.getTime();;-->获取当前时间

时间戳转换为时间
//date是yyyy-MM-dd HH:mm:ss格式的String类型的时间
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Date time= simpleDateFormat.parse(date);
long timeStamp= time.getTime();
System.out.println(timeStamp);

某个时间戳转化为时间

Date date = new Date(时间戳(Long类型));


java实现获得时间戳:

LocalDateTime.now().toInstant(ZoneOffset.of(“+8”)).toEpochMilli();

时间戳转换成LocalDateTime

Long timestamp = LocalDateTime.now().toInstant(ZoneOffset.of(“+8”)).toEpochMilli();
LocalDateTime time2 =LocalDateTime.ofEpochSecond(timestamp/1000,0,ZoneOffset.ofHours(8));

时间转换为时间戳
//s是String类型的时间戳
SimpleDateFormat simpleDateFormat = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
long timeStamp= new Long(s);
Date date = new Date(timeStamp);
String time= simpleDateFormat.format(date);
System.out.println(time);

//获得当前时间和当前时间前30秒时间

SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss”);
Calendar c = new GregorianCalendar();
Date date = new Date();
System.out.println(“系统当前时间 :”+df.format(date));
c.setTime(date);//设置参数时间
c.add(Calendar.SECOND,-30);//把日期往后增加SECOND 秒.整数往后推,负数往前移动
date=c.getTime(); //这个时间就是日期往后推一天的结果
String str = df.format(date);
System.out.println(“系统前30秒时间:”+str);
/*
输出结果:
系统当前时间 :2015-09-18 10:03:00
系统前30秒时间:2015-09-18 10:02:30
*/

一.在Java 8中将Date转换为LocalDateTime
Date date = new Date();
Instant instant = date.toInstant();
ZoneId zoneId = ZoneId.systemDefault();

    LocalDateTime localDateTime = instant.atZone(zoneId).toLocalDateTime();
    System.out.println("Date = " + date);
    System.out.println("LocalDateTime = " + localDateTime);

二.在Java 8中将LocalDateTime转换为Date
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = LocalDateTime.now();
ZonedDateTime zdt = localDateTime.atZone(zoneId);

    Date date = Date.from(zdt.toInstant());

    System.out.println("LocalDateTime = " + localDateTime);
    System.out.println("Date = " + date);

————————————————
版权声明:本文为CSDN博主「insping」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/hspingcc/article/details/73332380

社区版手动创建springboot项目

​ 1 new 一个maven项目,直接next即可,一直next直到出现.pom文件
​ 2 在.pom文件中编辑

​ org.springframework.boot
​ spring-boot-starter-parent
​ 1.5.1.RELEASE



​ org.springframework.boot
​ spring-boot-starter-web


​ 3 新建一个controller下:
​ /**
​ * 官方示例
​ */
​ @Controller
​ @EnableAutoConfiguration
​ public class SampleController{
​ @RequestMapping(“/”)
​ @ResponseBody
​ String home(){
​ return “Hello world”;
​ }
​ public static void main(String[] args){
​ SpringApplication.run(SampleController.class,args);
​ }
​ }

4 以上未配置前端和数据库	
	server.port=8080
	server.tomcat.uri-encoding=utf-8


或者 去官网 点击生成 :https://start.spring.io/

mybatis-plus配置控制台打印完整带参数SQL语句
mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
前端需要后端的某个字段的下拉列表,

1-后端xml中写一个SQL查询这个字段,然后再controller层使用:new HashSet( ) 去重

    /**
     * 商品标签列表
     */
    @GetMapping("/goodsTagList")
    public ResultData goodsTagList() {
        List<String> classNameList = new ArrayList(new HashSet(blackAshProductionDataSourceService.goodsTagList()));
        return ResultData.success(classNameList);
    }

部署问题

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Db6VVq6b-1673488555585)(D:\desktop\个人笔记\IT总结.assets\image-20230109173340770.png)]

报错xxxjar中没有主清单属性


数据库

MySQL的主要优点:

​ 1-速度,
​ 2-流行,
​ 3-window下稳定:Windows环境下运行更稳定
​ 4-多线程:虽然并发不高时,My处理速度快,
​ 5-事务:MySQL4.0.2-alpha开始支持事务的概念,因此事务对于MySQL不再成为劣势

PostgreSQL 的主要优点:
​ 1-协议:BSD协议,完全开源免费且不会被任何商业公司控制
​ 2-规范:源代码堪称C语言的规范,易读性比MySQL强很多
​ 3-可靠:完全支持ACID特性的
​ 4-多进程:发高时,PG的总体性更好(原因是My的线程无法充分利用CPU的能力)
​ 5-查询:强大的查询优化器,支持很复杂的查询处

导出数据库结构和表数据

DBeaver 导出数据库结构和数据导出表结构
1、选择需要导出的表(可多选),右键“生成 SQL”——“DDL”
2.复制SQL到某个文件上

lambda型的QueryWrapper创建: 注意()
new QueryWrapper<泛型>().lambda().eq(实体类::字段),传入的字段)
如:
new QueryWrapper().lambda().eq(TenantInfoPo::getLoginUserId,loginUserId)

有点QueryWrapper ,这里如果数据库更改了字段 只需要更改实体类的字段名称 这些方法的字段机会自动修改

list序列化为string存入数据库
//list就是想要序列化的list
JSONObject.toJSONString(list);

字符串转JSON
JSONObject.parseObject(String)

数据库中取出时
public List select() {
return JSONObject.parseArray(“从数据库中取出的String类型的字段”,T.class);
}

#更安全,而 $ 有sql注入风险
1-删除主键及自增

​ 1.1 取消自增
​ alter table 表名 change 自增的列名 自增的列名 int;如:alter table tb_created_metric change id id int;
​ 1.2 取消主键约束
​ alter table products drop primary key 如:alter table tb_created_metric drop primary key

删除某个列
alter table 数据名.dbo.表名 drop column 列名; alter table tb_created_metric drop column id;

把这些ids.和等于未读 的全部修改为 已读

  UpdateWrapper<SubmitDemandEntity> updateWrapper = Wrappers.update();

//where 条件
        updateWrapper.lambda()
                .in(SubmitDemandEntity::getId,ids)
                .eq(SubmitDemandEntity::getReadAndUnread,"2");

//要修改的内容为: 1				
        SubmitDemandEntity entity = new SubmitDemandEntity();
        entity.setReadAndUnread("1");
    submitDemandDao.update(entity, updateWrapper);
模糊查询

mybatis中xml开发like模糊查询的几种写法

SELECT id FROM t_product
        <where>
            <trim suffixOverrides=",">
                <if test="keyword != null and keyword != ''">
                    definition like concat('%',#{keyword},'%')
                </if>
            </trim>
        </where>

根据总条数和每页数据量计算 总页数
记内容总数量为 totalCount,
每页数量为 pageSize,
数据总页数为 totalPage,
则推荐算法如下:
totalPage = (totalCount+ pageSize-1) / pageSize;

Example的创建
SubmitDemandEntityExample submitDemandEntityExample = new SubmitDemandEntityExample();
SubmitDemandEntityExample.Criteria criteria = submitDemandEntityExample.createCriteria();
criteria.andReadAndUnreadEqualTo(submitDemandEntity.getReadAndUnread());
return submitDemandDao.selectByExample(submitDemandEntityExample);

redis

docker集群命令

docker create --name redis-node1 --net host -v /data/redis-data/node1:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-1.conf --port 6381

docker create --name redis-node2 --net host -v /data/redis-data/node2:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-2.conf --port 6382

docker create --name redis-node3 --net host -v /data/redis-data/node3:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-3.conf --port 6383

docker create --name redis-node4 --net host -v /data/redis-data/node4:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-4.conf --port 6384

docker create --name redis-node5 --net host -v /data/redis-data/node5:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-5.conf --port 6385

docker create --name redis-node6 --net host -v /data/redis-data/node6:/data redis:3.2 --cluster-enabled yes --cluster-config-file nodes-node-6.conf --port 6386

Linux

Linux=========

运行jar包

#运行jar包
java -jar jar包路径名称 --spring.config.location=程序配置文件 > 日志存放位置 2>&1 &
java -jar /app/test/demo-service-1.0.0.jar --spring.config.location=/properties/demo.yml > /logs/demo.log 2>&1 &

mkdir -p 创建多重目录

文件颜色代表的意义

浅蓝色 [l] 软链接
白色 [-] 普通文件/硬链接
蓝色 [d] 目录
红色 [l] 某文件被删除后,链接到该文件的软链接的颜色
红色闪烁 无 表示该文件已被删除,但还存在该文件的软链接
红色 [-] 压缩包
黄色 [c] 字符设备文件,如键盘鼠标
绿色 [-] 可执行文件,可执行的程序
桃红色 [s] 套接字文件
土黄色 [p] 管道文件
灰色文件 表示其它文件

常用命令

下载文件
sz /home/project/c1/你要下载的文件.xls 弹窗选择下载到哪个目录
上传文件
rz +弹窗,然后选择文件

查看占用的端口号
lsof -i:端口号

更多 lsof 的命令如下:

lsof -i:8080:查看8080端口占用
lsof abc.txt:显示开启文件abc.txt的进程
lsof -c abc:显示abc进程现在打开的文件
lsof -c -p 1234:列出进程号为1234的进程所打开的文件
lsof -g gid:显示归属gid的进程情况
lsof +d /usr/local/:显示目录下被进程开启的文件
lsof +D /usr/local/:同上,但是会搜索目录下的目录,时间较长
lsof -d 4:显示使用fd为4的进程
lsof -i -U:显示所有打开的端口和UNIX domain文件

清除占用的端口

kill -9 PID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HSOThXBc-1673488555586)(D:\desktop\个人笔记\IT总结.assets\image-20230110142809220.png)]

如上实例,我们看到 8000 端口对应的 PID 为 26993,使用以下命令杀死进程

kill -9 26993

##查看运行状态
ps -ef|grep java

#删除非空目录 : -rf
rm -rf dirName

Linux
查找目录:find /(查找范围) -name ‘查找关键字’ -type d
查找文件:find /(查找范围) -name 查找关键字 -print

赋予文件 执行的权限,特别是删除了xxx.sh文件,然后重新上传一个,如果直接执行./xxx.sh 是执行不了,因为没有执行权限,所以一般对于新上传的xx.sh都是 chmod +x start.sh

首先上传了一个stop1.sh文件,是灰色,直接./xx.sh执行不了
然后进行chmod +x 赋予执行权限。变绿色
后来使用chmod -x 去除执行权限,变灰色

查看日志

ps –ef|grep 进程名    查看进程
kill -9 杀掉进程
wc –l  输出文件行数
find 查找文件
tail –f 动态抓取文件内容(截取日志使用)
tail -n 10 文件名  查询文件的后面10行数据
head -n 10 文件名  查询文件的前面10行数据
cat 文件名|grep '关键字'  过滤查询
more 文件名
less 文件名


3、根据关键字查询日志:

cat -n default.log |grep '中文件不存在'

查看.gz压缩文件日志
不解压查看
zcat+日志名.gz |grep '关键字'


sh脚本

linux入门-shell(.sh)脚本编写和运行
常用的判断参数
1-文件检查
-d $path 当path变量是一个目录且该目录存在时返回真
-f $file 当file变量时一个文件且该文件存在时返回真
-e $pathname 当pathname变量时一个文件或目录且该文件或目录存在时返回真

 2-算数比较运算
 $num1 -eq #num2	$num1 等于	  $num2时返回真
 $num1 -ne #num2	$num1 不等于  $num2时返回真
 $num1 -lt #num2	$num1 小于	  $num2时返回真
 $num1 -le #num2	$num1 小于等于$num2时返回真
 $num1 -gt #num2	$num1 大于	  $num2时返回真
 $num1 -ge #num2	$num1 大于等于$num2时返回真

3-字符串运算
$string1 = $string2		如果string1与string2内容相同则返回真
$string1 != $string2	如果string1与string2内容不相同则返回真
-z $string1 			如果string1长度为0则返回真
-n $string1 			如果string1长度不为0则返回真

4-变量说明: 
$$ ——Shell本身的PID(ProcessID) 
$! ——Shell最后运行的后台Process的PID 
$? ——最后运行的命令的结束代码(返回值) 
$- ——使用Set命令设定的Flag一览 
$* ——所有参数列表。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。 
$@ ——所有参数列表。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。 
$# ——添加到Shell的参数个数  就是执行./xxx.sh 有没有携带参数(start /stop..)
$0 ——Shell本身的文件名 
$1~$n ——添加到Shell的各参数值。$1是第1参数、$2是第2参数…。

#查看正在运行的java程序:
ps -aux | grep java

#查看端口命令:
netstat -ntlp

wc -l 统计xx记录数
如: ps -ef |grep java|wc -l 统计运行的java程序数量
count=ps -ef | grep ${SPEVAP_NAME} | grep java | wc -l 获取名为SPEVAP_NAME 运行的java程序数量

grep -v grep 为了去除包含"grep"的进程行 ,避免影响最终数据的正确性 。

[isTester@iZ94b31ttqsZ]~# ps -ef|grep gogs
isTester.com 1883 1844 0 13:55 pts/0 00:00:00 grep gogs
git 6583 1 0 2018 ? 01:25:46 ./gogs web

加上grep -v grep ,就只剩下1行记录 。

[isTester@iZ94b31ttqsZ]~# ps -ef|grep gogs | grep -v grep
git 6583 1 0 2018 ? 01:25:46 ./gogs web

在脚本中获取当前脚本路径
方法一:
#!/bin/bash
path=$(cd `dirname $0`;pwd)
echo $path
path2=$(dirname $0)
echo $path2
当前脚本存在路径:/home/software
sh path.sh
/home/software


 

解释:
dirname $0 只是获取的当前脚本的相对路径.
cd dirname $0;pwd 先cd到当前路径然后pwd,打印成绝对路径

方法二:
#!/bin/bash
path=$(dirname $0)
path2=$(readlink -f $path)
echo path2
sh path.sh
/home/software
  1. 解释:
  2. readlink -f p a t h 如果 path 如果 path如果path没有链接,就显示自己本身的绝对路径

docker

安装docker

1-先安装yum
sudo yum update
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#安装docker,这里安装的是docker-ce(社区版),而docker-ee是企业版,是收费的
sudo yum install docker-ce
docker -v
能出现docker的版本号说明OK了

3-配置daemon.json:

vim /etc/docker/daemon.json

配置内容

{
“registry-mirrors”: [“https://docker.mirrors.ustc.edu.cn”],
“storage-driver”:“devicemapper”
}

重启:
systemctl daemon-reload
systemctl restart docker

删除卸载docker

1:
yum -y remove docker*.x86_64
2:
rm -rf /var/lib/docker

docker常用操作命令

Centos7中 启动Docker
systemctl start docker //启动docker
systemctl stop docker //停止docker
systemctl restart docker //重启docker

docker 目录
Var/lib/docker

查看所有运行的docker程序
docker ps -a

查看docker中的镜像
docker images;

查看docker中的镜像的详细信息(目录,配置文件等)
docker inspect CONTAINER ID(容器ID)

进入docker操作某镜像

1-docker ps -a 找到对应的NAMES
2-docker exec -it CONTAINER ID redis-cli
3-redis-cli 表示要进入正在运行的那个redis客户端

如:
docker exec -it 6188d99695aa redis-cli


移除某个镜像
1-正在运行的容器需要先停止
docker stop xxx(CONTAINER ID)

2-删除容器
docker rm CONTAINER ID

3-删除镜像
docker rmi image ID
如: docker rmi 3edbb69f9a49 

Docker 导出/导入镜像

1、方法一(推荐)试用未成功

我们可以使用 save 和 load 命令,通过镜像id导出镜像到宿主机,命令如下:

	$ docker save -o coredns.tar k8s.gcr.io/coredns:1.3.1

然后将导出的镜像文件上传到网络不好的主机上,执行以下命令进行镜像导入,命令如下:

	$ docker load < coredns.tar
	
启动导入的镜像

docker run -p 6379:6379 --name zy_redis -v $PWD/data:/data -d redis:3.2 redis-server

-p 6379:6379   docker端口和服务器端口的映射   
	如果是集群,那就是 
	-p 6371:6379 
	-p 6372:6379 
	-p 6373:6379
	-p 6374:6379
	-p 6375:6379
	-p 6376:6379
	
--name zy_redis    			定义容器名字
-v $PWD/data:/data    		将当前目录下的data目录挂载到redis中的data目录
-d redis:3.2 redis-server   redis:3.2   是镜像名称+版本号    redis-server  为 COMMAND 名称

2、方法二(试用成功了)

我们还可以使用 export 和 import 命令,进行导入/导出操作,导出命令如下:

	$ docker export eb516548c180 > coredns.tar

我们将上述 coredns.tar.gz 镜像在另一个网络不好的节点进行导入,命令如下(二者选其一即可):

$ docker import /usr/local/coredns.tar
$ cat coredns.tar | docker import - k8s.gcr.io/coredns:1.3.1(镜像名自己定义)

然后执行以下命令查看是否导入成功,命令如下:

	$ docker images

导入成功之后的节点镜像列表,如图所示:

启动导入的镜像

docker run -p 6379:6379 --name zy_redis -v $PWD/data:/data -d redis:3.2 redis-server

-p 6379:6379   docker端口和服务器端口的映射   
	如果是集群,那就是 
	-p 6371:6379 
	-p 6372:6379 
	-p 6373:6379
	-p 6374:6379
	-p 6375:6379
	-p 6376:6379
	
--name zy_redis    			定义容器名字
-v $PWD/data:/data    		将当前目录下的data目录挂载到redis中的data目录
-d redis:3.2 redis-server   redis:3.2   是镜像名称+版本号    redis-server  为 COMMAND 名称

框架

Spring框架

maven项目 package与install的区别
package 是将项目打包,java项目package后就是jar包,web项目package后就是war包,pom包:用在父级工程或聚合工程中,用来做jar包的版本控制,必须指明这个聚合工程的打包方式为pom。

install: 在A模块install后,就会生成对应的jar包或者war包,然后保存到自己本地仓库 如:A-SNAPSHOT.jar 如果下个模块B打包需要依赖这个jar包,就需要先install模块A,模块B才能打包成功

springBoot的测试

@Test 注解的引用错了,应该是: import org.junit.Test;

多环境配置的情况下:
1-application.yml 增加:
spring:

环境 dev|test|prod

​ profiles:
​ active: test

2-增加对应的application-dev.yml|application-test.yml|application-prod.yml   
3-相应环境对应相关数据库和配置的URL,公共的参数可以放到原生yml

环境 dev|test|prod

在 dev/test/prod的yaml文件优先级高于(有重复的会覆盖application.yml)application.yml

请求方式参数的规范

请求参数尽量用body/URL拼接的其中一种

URL中拼接字符串,建议如下,就不用转码,并且可以使用required = false 设置为非必传,默认true,必传

@GetMapping("/managerList")
public ResultDTO managerList(  @RequestParam(value = "page") int page ,
                               @RequestParam(value = "limit") int limit ,
                               @RequestParam(value = "readAndUnread",required = false) String readAndUnread ,
                               @RequestParam(value = "unit",required = false) String unit,
                               @RequestParam(value = "title",required = false) String title)

去掉字符串的某些字符(如去掉双引号),
String replace = matchtext.replace(“”", “”);

前端数组传数组过来,后端List转字符串入库

	List firstDemand = submitDemandDto.getFirstDemand();
    List secondDemand = submitDemandDto.getSecondDemand();

    String firstDemandStr = JSONObject.toJSONString(firstDemand);
    String secondDemandStr = JSONObject.toJSONString(secondDemand);

@RestController的作用等同于@Controller + @ResponseBody。
@Controller + @RequestMapping 映射到某个URL

@ResponseBody表示方法的返回值直接以指定的格式写入Http response body中,而不是解析为跳转路径。

前后端如果是传数组参数:两种方式
1-前端做转换
使用JSON.stringify 将数组对象转化成json字符串

1.1 前端代码

var ids = ['1','2'];
$.ajax({
	type : 'POST',
	url: 'submit/demand/secondDemandList',
	contentType : "application/json" ,
	data: JSON.stringify(ids),
	success : function(data) {
	}
});

传输的数据就是这样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4enG1pf-1673488555586)(D:\desktop\个人笔记\IT总结.assets\image-20221219134845336.png)]

1.2 后端代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OxknEDuy-1673488555587)(D:\desktop\个人笔记\待办事情.assets\image-20221216182301765.png)]

  1. 3Postman 测试数据要正确注意!![外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w2mzzkGG-1673488555587)(D:\desktop\个人笔记\待办事情.assets\image-20221216182516484.png)]

这样写才能成功请求

2-后端做转换

2.1 前端代码

var array = ["1", "2"];
$.ajax({  
    type : 'POST',  
    url: 'submit/demand/secondDemandList',
    contentType: "application/x-www-form-urlencoded",
    data: {"ids": array},
    success : function(data) {  
    }  
}); 

2.2 传输的数据就是这样的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4vG7RY0M-1673488555588)(D:\desktop\个人笔记\IT总结.assets\image-20221219135721390.png)]

2.3 后端代码

@RequestMapping(value = "submit/demand/secondDemandList", method = {RequestMethod.POST})
public void delete(HttpServletRequest req) {
    String[] array = req.getParameterValues("ids[]");
    for (String string : array) {
        System.out.println(string);
    }
}

2.4 测试数据

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OHYKDdQ3-1673488555588)(D:\desktop\个人笔记\IT总结.assets\image-20221219135924088.png)]

2.5 再次注意:两种post请求的content-type不同!

前后端传的是分页数据和某个对象(对象是 key:{} 而不是数组)

postman传参

{
	"currPage": 1,
	"pageSize": 10,
	"orderType": "desc",
	"orderField": "release_time",
	"params": {
		"eventType": "投资诈骗",
		"eventName": "事件名称",
        "releaseSource":"微博"
	}
}

示例:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GwdVe5f1-1673488555588)(D:\desktop\个人笔记\IT总结.assets\image-20230104181000729.png)]

SpringBoot在Test测试类或自定义类中通过@Autowired注入为null

​ https://blog.csdn.net/qq_40583885/article/details/106382726

分布式框架

storm:分布式实时大数据处理框架

1.适用场景广泛: storm可以实时处理消息和更新DB,对一个数据量进行持续的查询并返回客户端(持续计算),对一个耗资源的查询作实时并行化的处理(分布式方法调用,即DRPC),storm的这些基础API可以满足大量的场景。

2. 可伸缩性高:  Storm的可伸缩性可以让storm每秒可以处理的消息量达到很高。扩展一个实时计算任务,你所需要做的就是加机器并且提高这个计算任务的并行度 。Storm使用ZooKeeper来协调集群内的各种配置使得Storm的集群可以很容易的扩展。

3. 保证无数据丢失: 实时系统必须保证所有的数据被成功的处理。 那些会丢失数据的系统的适用场景非常窄, 而storm保证每一条消息都会被处理, 这一点和S4相比有巨大的反差。

4. 异常健壮: storm集群非常容易管理,轮流重启节点不影响应用。

5. 容错性好:在消息处理过程中出现异常, storm会进行重试

6. 语言无关性: Storm的topology和消息处理组件(Bolt)可以用任何语言来定义, 这一点使得任何人都可以使用storm.

排查BUG经验

当文本都一样的时候,但是两个文件的结果还是不一样 要看是不是编码的问题 UTF-8 还是GBK

你的空间或服务器已经满了,请空下回收站或者扩容(查看命令:df -lh);


测试

1)py -2 快速启动python2
2)py -3 快速启动python3

数据的类型:
元组: 用()小括号包起来,特点:只有一个元素时,需要在元素的后面加个逗号 b_tuple = (1,)
列表: 用[]中括号包起来,特点:有索引,查询块(JSON常用)
字典: 用{}花括号包起来,特点:元素是【键:值】的方式
集合: 用set()方法创建 ,集合特点: 元素是唯一,去重,不可变,没有索引

格式化代码: ctrl+ alt +L

怎么打开SQLmap:
进入SQLmap的根目录,然后cmd, python sqlmap.py -hh -->可以查看详细帮助

启动php项目:Xsmart项目
1-以管理员的身份!管理员的身份!管理员的身份! 启动phpstudy phpstudy中mysql和apache成功启动(绿色)
2-找到网页输入:http://127.0.0.1/admin.php
3-出现登录界面:
用户名:admin
密码:admin

启动VUE.shop项目(无后台页面):
1-进入项目目录然后cmd, node app.js
2-打开项目文档,即可访问对应的接口

蜗牛进销存:https://www.bilibili.com/video/BV16441157rv?p=3&spm_id_from=pageDriver&vd_source=d60eb173654e452e739d02f42edcd9e0
访问http://127.0.0.1:8080

使用locust:
1-代码写在pychram:使用self.client.get(‘login’)
2-然后在文件路径终端使用locust命令运行:locust -f 文件名 --host=http://localhost:8080

销存U/P:
admin
admin123


启动jenkins
1-到jenkins的安装目录
2-cmd --> java -jar jenkins.war

启动jmeter

1-进入jmeter的bin安装目录,
2-然后运行jmeter.bat 能够打开jemter窗口 说明OK

启动jupyter

  1. 先确定存放代码的文件路径,然后cmd进入黑窗,
    输入:jupyter notebook,跳转到一个网页即可

web自动化,接口自动化, 进班表更新和维护,(需要学员的学历截图)
adb命令的操作–>APP专项测试
2-安全的测试: 如何测试SQL防注入,还有xxs攻击
Apache

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

香瓜西蕉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值