tonglin0325的个人主页

SpringBoot学习笔记——websocket

可以在chrome上安装 Simple WebSocket Client 插件来辅助调试websocket功能

websocket client发送数据

 

websocket server接收数据

参考:Spring-Boot快速集成WebSocket服务端 客户端(支持客户端消息同步回调)

 

在springboot中使用websocket的时候需要注意如果web服务有权限的话,websockete连接同样是会被拦截,需要开放拦截

1
2
3
4
5
.antMatchers(
HttpMethod.GET,
"/ws/kafka/**"
).permitAll()

全文 >>

helm部署kubernetes-dashboard

kuberbetes-dashboard是K8S的管理工具,下面使用helm来进行部署,参考:

1
2
https://artifacthub.io/packages/helm/k8s-dashboard/kubernetes-dashboard

首先添加源

1
2
helm repo add kubernetes-dashboard https://kubernetes.github.io/dashboard/

查找chart

1
2
3
4
5
helm search repo kubernetes-dashboard

NAME CHART VERSION APP VERSION DESCRIPTION
kubernetes-dashboard/kubernetes-dashboard 5.4.1 2.5.1 General-purpose web UI for Kubernetes clusters

部署release

1
2
helm install my-k8s-dashboard kubernetes-dashboard/kubernetes-dashboard

访问kubernetes dashboard

1.修改kubernetes-dashboard的svc,将ClusterIp改成NodePort

 

此时再查看svc

1
2
3
4
kubectl get svc -A
NAMESPACE NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
default my-k8s-dashboard-kubernetes-dashboard NodePort 10.110.255.104 <none> 443:32511/TCP 21h

访问如下网址即可,注意这里建议使用firefox浏览器来访问,提示HTTPS不安全的话可以选择忽略;如果使用chrome浏览器的话,会提示需要需要导入HTTPS证书,证书地址如下

全文 >>

如何申请HTTPS证书

HTTP和HTTPS区别

超文本传输协议(HTTP)是用于客户端-服务器通信的协议或一组通信规则。当您访问网站时,您的浏览器会向 Web 服务器发送 HTTP 请求,该服务器将以 HTTP 响应进行响应。Web 服务器将以纯文本形式与您的浏览器交换数据。简而言之,HTTP 协议是为网络通信提供支持的底层技术。

安全超文本传输协议(HTTPS)是 HTTP 的一种更安全的版本或扩展。在 HTTPS 中,浏览器与服务器会在传输数据之前建立安全的加密连接。

HTTPS 协议的工作原理

HTTP 传输未加密的数据,这意味着从浏览器发送的信息可能会被第三方拦截和读取。这一过程并不理想,因此将其扩展成为 HTTPS,以便为通信再增加一层安全性。HTTPS 将 HTTP 请求和响应与 SSL 和 TLS 技术相结合。

SSL 和 TLS 参考:SSL 与 TLS 之间有何区别?

HTTPS 网站必须从独立证书颁发机构(CA)获取 SSL/TLS 证书。这些网站会在交换数据之前先与浏览器共享该证书,以建立信任。SSL 证书还包含加密信息,以便服务器和 Web 浏览器可以交换加密或刻意打乱的数据。

该过程的工作原理是:

  1. 您通过在浏览器的地址栏中键入 https://URL 格式来访问 HTTPS 网站。
  2. 浏览器尝试通过请求服务器的 SSL 证书来验证该站点的真实性。
  3. 该服务器发送包含公钥的 SSL/TLS 证书作为回复(非对称加密)。
  4. 该网站的 SSL 证书将证明该服务器身份。浏览器确认一切妥当后,它将使用该公钥加密并发送包含secret session key的消息。
  5. Web 服务器使用其私钥解密消息并检索session key。然后,它将加密该session key,并向浏览器发送确认消息。
  6. 现在,浏览器和 Web 服务器都切换到使用相同的session key来安全地交换消息(对称加密)。

参考:HTTP 与 HTTPS 之间有什么区别?

公钥私钥,加密解密,签名验签

既然是加密,那肯定是不希望别人知道我的消息,所以只有我才能解密,所以可得出公钥负责加密,私钥负责解密

同理,既然是签名,那肯定是不希望有人冒充我发消息,只有我才能发布这个签名,所以可得出私钥负责签名,公钥负责验证

参考:RSA的公钥和私钥到底哪个才是用来加密和哪个用来解密?

HTTPS 加密、证书、签名与握手

全文 >>

Kafka数据查询工具——Offset Explorer

官方地址下载,有mac,windows和linux版本

1
2
https://www.kafkatool.com/download.html

1.查看kafka topic中的数据(支持byte,string和avro)

安装后添加kafka集群的地址,可以选择使用zk地址或者kafka的broker地址来连接集群,这里选择使用kafka broker地址来连接

可以指定topic的partition和offset查看数据

默认查出来的数据是byte数组,即16进制的,可以借助在线转换工具将其转换成字符串后进行查看,比如

1
2
https://tool.lu/hexstr/

也可以在属性中设置value为String,这样就可以直接查看反序列化后字符串

全文 >>

Flink学习笔记——Table和SQL API

Table API官方文档参考

1
2
https://nightlies.apache.org/flink/flink-docs-master/docs/dev/table/tableapi/

RowKind

 

自定义修改debezium-json format

Flink 1.11.1:flink CDC Debezium自定义修改debezium-json格式

Flink cdc自定义format格式数据源

 

如果要在flink sql中使用checkpoint,可以使用set命令,如下

1
2
3
4
5
6
7
SET 'state.checkpoints.dir' = 'hdfs:///bar/foo/';
SET 'execution.checkpointing.mode' = 'EXACTLY_ONCE';
SET 'execution.checkpointing.interval' = '30min';
SET 'execution.checkpointing.min-pause' = '20min';
SET 'execution.checkpointing.max-concurrent-checkpoints' = '1';
SET 'execution.checkpointing.prefer-checkpoint-for-recovery' = 'true';

全文 >>

Kafka学习笔记——Producer API

参考kafka官方文档,版本1.0.x

1
2
http://kafka.apache.org/10/documentation.html#consumerapi

依赖,选择 Cloudera Rel 中的 1.0.1-kafka-3.1.0

1
2
3
4
5
6
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>1.0.1-kafka-3.1.0</version>
</dependency>

Kafka的生产者配置

1
2
http://kafka.apache.org/10/documentation.html#producerconfigs

其中producer api中文含义参考:kafka系列七、kafka核心配置

producer是线程安全的,通常应该在所有线程之间共享,以获得最佳性能。producer管理着一个后台线程,该线程执行I/O操作,并与每个需要通信的broker建立TCP连接。如果使用后不能关闭producer,将会泄漏这些资源。

Timer类和TimerTask类

Timer类是一种线程设施,可以用来实现在某一个时间或某一段时间后安排某一个任务执行一次或定期重复执行

该功能要与TimerTask类配合使用。TimerTask类用来实现由Timer安排的一次或重复执行的某一任务。

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimerTask;
import java.util.Timer;

class MyTask extends TimerTask{ //任务调度类要继承TimerTask

@Override
public void run() {
// TODO 自动生成的方法存根
SimpleDateFormat sdf = null;
sdf = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss:SSS");
System.out.println("当前系统的时间:"+sdf.format(new Date()));
}

}

public class Timer_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
Timer t = new Timer(); //建立Timer类对象
MyTask myTask = new MyTask(); //定义任务
t.schedule(myTask, 1000, 2000); //设置任务的执行,1秒后开始,每2秒重复
}

}

 

spring-boot项目建立

使用idea来开发spring-boot项目,对于community版本的idea,由于没有spring-boot插件,所有对于开发spring-boot的web项目来说不是很方便,所以安装Ultimate版本的idea,使用的版本是2017.1.6版本

参考 : https://blog.csdn.net/typa01_kk/article/details/76696618

1.创建项目

2.填写项目名称

3.添加需要的框架

这里勾选spring web

4.启动web服务

访问 localhost:8080

 

如果想在更新了代码之后实现热更新,请参考 : https://blog.csdn.net/qq_42685050/article/details/81588584

全文 >>

Java——正则表达式

程序中应用正则表达式则必须依靠Pattern类和Matcher类,这两个类都是在java.util.regex包中定义。

Pattern类的主要作用是进行正则规范的编写。

Matcher类主要是执行规范,验证一个字符串是否符合其规范。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.util.regex.Pattern;
import java.util.regex.Matcher;;

public class Regex_demo {

public static void main(String[] args) {
// TODO 自动生成的方法存根
// String str = "123456789";
// if(Pattern.compile("[0-9]+").matcher(str).matches()){ //使用正则表达式
// System.out.println("是由数字组成!");
// } else{
// System.out.println("不是由数字组成!");
// }

// String str = "2016-03-11" ;
// String pat = "\\d{4}-\\d{2}-\\d{2}"; //定义规则,其中/不要转义,//d等于/d
// Pattern p = Pattern.compile(pat); //实例化Pattern类
// Matcher m = p.matcher(str); //验证字符串内容是否合法
// if(m.matches()){
// System.out.println("日期格式合法!");
// }else{
// System.out.println("日期格式不合法!");
// }

String str = "A123B123C123F123" ;
String pat = "\\d+";
Pattern p = Pattern.compile(pat); //实例化Pattern类
String s[] = p.split(str); //进行字符串拆分
for(int i=0;i<s.length;i++){
System.out.println(s[i]+"\t"); //输出其中符合字母的字符
}

Matcher m = p.matcher(str); //实例化Matcher类
String newString = m.replaceAll("_"); //替换所有的数字
System.out.println(newString);
}

}

 

 

 

 

全文 >>