OkHttp全解析之Http & Websocket
Okhttp-http基础信息
依赖信息
1implementation("com.squareup.okhttp3:okhttp:4.10.0")
作用
可用于http及websocket的Http Client请求框架
关键概念
HTTP网络请求中涉及2个重要概念
Request
Response
即请求和响应
Okhttp的设计上为了贴合现实的网络请求,规划了5个类
OkHttpClient
客户端实体,可以进行网络请求细节的配置
Request
客户端网络请求报文
Response
服务端网络请求响应报文
Call
HTTP请求
WebSocket
Websocket请求
Okhttp做的很好的一点是使用者基本上只需要和上面几个类打交道
http请求
123456789val request = Request.Builder() .url("https://www.example.com") .headers(Headers.headersOf()) .metho ...
Gradle启动之Client
Gradle启动之Client
在本文以前,我们分析了
gradle批处理
gradle-wrapper
接下来我们需要分析
Gradle Client的启动过程
Pre基本概述
Gradle是C/S架构的一个java 程序
gradlew实际是用来启动gradle-client进程,
接着client进程会尝试连接后台的守护进程也即是gradle daemon,然后通过socket进行通信。
准备
即进行源代码调试方面相关的环境配置
Gradle既然是一个纯Java程序那么我们肯定是可以调试的。
参考自idea官方文档——remote debug
创建Remote Debug Configuration
Note:
在gradle源码工程创建,方便到时候直接连接。
保持默认配置
复制Command line arguments for remote JVM
1-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
agentlib: 指定java agen ...
Classloader全解析
关于本文
Java内置ClassLoader
Java ClassLoader加载过程
自定义ClassLoader
基本概念
A class loader is an java object that is responsible for loading classes. The class ClassLoader is an abstract class. Given the binary name of a class, a class loader should attempt to locate or generate data that constitutes a definition for the class. A typical strategy is to transform the name into a file name and then read a “class file” of that name from a file system.
Classloader是用于加载class的对象,接受一个class的binary name寻找或者生成该类的2 ...
Gradle启动之gradle-wrapper
Gradle启动之gradle-wrapper
gradle-wrapper即gradle的包装器。
gradle它完成了gradle的环境配置以及gradle的启动。(也就是说到这一步gradle才开始启动起来)
EntryPoint
前面分析到了,gradlew shell脚本执行java 程序启动了gradle-wrapper.jar,接着就从这里开始进行分析。
代码量还是比较少的。
美中不足的是没有gradle-wrapper的源代码,代码没注释可读性稍差,不过好在逻辑简单。就不去翻gradle源码了。
Notes:
如果对代码有洁癖的bro,可以打开gradle源代码
subprojects/wapper
subprojects/cli
subprojects/wrapper-shared
1234567891011121314151617181920212223242526272829public static void main(String[] args) throws Exception { //获取ja ...
Gradle启动之批处理
Gradle启动之批处理
Gradle启动无非是通过shell或者bat脚本,所有要看懂启动逻辑,先了解下基础语法
Shell基础变量自定义变量
变量定义
1variable="value"
定义非常简单,变量名=值,值得注意的是变量名和等号间不能有空格,名称必须遵循如下规则。
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线 **_**。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
变量使用
12echo $variableecho ${variable}
$variable即可,echo表示打印传入的值。
echo $variable表明打印变量
预定义特殊变量
$0:是指你所写的shell脚本本身的名字;
$1:是指你写的shell脚本所传入的第一个参数 ;
$2:是指你写的shell脚本所传入的第二个参数
$#: 传递到脚本或函数的参数个数
$*: 以一个单字符串显示所有向脚本传递的参数
$$: 脚本运行的当前进程ID号 ...
Gradle源码环境搭建
Gradle源码阅读环境搭建
接触了很长一段时间的gradle,也看过一部分源码,但是总是感觉差了点东西,所以重新阅读,并以写作的方式加深理解。
源码下载需要准备两个东西
gradle v7.6源代码
配置gradle-wrapper.properties
12345distributionBase=GRADLE_USER_HOMEdistributionPath=wrapper/distsdistributionUrl=https\://services.gradle.org/distributions/gradle-7.6-all.zipzipStoreBase=GRADLE_USER_HOMEzipStorePath=wrapper/dists
note:
一定要选择gradle-7.6-all,没有all表示只有二进制没有源文件,debug的时候就看不到源文件。
其中gradle v7.6源代码不是必须的,主要是为了防止idea抽风。有时候代码看不了。其实gradle-wrapper.properties配置的gradle-7.6-all.zip就已经包含了gr ...
Docker Compose
Docker Compose
Compose是一个用于管理多容器的工具,仅用一个yaml文件,一条指令即可创建,开启,停止所有的服务
Docker Compose 文件语法
Compose 文件是一个yaml格式的文件。文件内容包含version,services,networks,volumns,configs,secrets
yaml多行缩进
一种描述数据的标记语言,类似于xml,json等。
数据结构可以用类似大纲的缩排方式呈现,结构通过缩进来表示,连续的项目通过减号“-”来表示,map结构里面的key/value对用冒号“:”来分隔。样例如下:
123456789101112131415house: family: name: Doe parents: - John - Jane children: - Paul - Mark - Simone address: number: 34 street: Main Street city: Nowheretown zipc ...
SSH基础
SSH证书通过ssh-keygen生成证书1ssh-keygen -t rsa -b 4096
note:
-t 表述加密方式(dsa | ecdsa | ecdsa-sk | ed25519 | ed25519-sk | rsa)
-b表示输出的密钥的长度
接着会弹出对话框
Enter file in which to save the key (/root/.ssh/id_rsa): ssh-test (输入key文件的名称)
密码(这里不设置)
Enter passphrase (empty for no passphrase):Enter same passphrase again:
当前路径即刻生成了rsa的公钥以及私钥
total 8.0K-rw——- 1 root root 3.4K Feb 3 19:05 ssh-test-rw-r–r– 1 root root 741 Feb 3 19:05 ssh-test.pub
配置ssh1vim ~/.ssh/config
1234Host 别名 HostName ...
CA证书那点事
CA证书
CA证书是https必不可少的东西,它包含了非对称加密的公钥信息,以及证书持有方的基本信息,以及颁发机构的信息。主要还是为了保证公钥的权威性,确保公钥的来源是可信的。
证书类型
der: .DER = DER扩展用于二进制DER编码证书。这些文件也可能承载CER或CRT扩展。
pem:使⽤Base64 ASCII进⾏编码的纯⽂本格式,是以“ - BEGIN …”前缀的ASCII(Base64)数据。
key:.KEY 扩展名用于公钥和私钥,常见使用于私钥。也可以被编码为二进制DER或ASCII PEM。
crs:证书签名请求。CSR文件是申请SSL证书时所需要的一个数据文件。
crt:CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。通俗来讲,.CRT文件常在Linux系统使用,包含公钥和主体信息。
crt:.CRT的替代形式,您可以在微软系统环境下将.CRT转换为.CER(.both DER编码的.CER,或base64 [PEM]编码的.cer)。通俗来讲,就是.C ...
Java之并发安全
线程安全线程安全问题
即多线程并发出现稀奇古怪无法理解的问题。
如何解决线程安全问题?
只要并发满足如下性质即可
可见性
即一个线程对一个变量修改后其余所有线程能立即知晓这个变量被修改了。
这句描述可能很奇怪?难道我一个线程修改了一个变量,其他线程难道还不知道吗?
不妨运行一下这个代码。
12345678910111213141516public class Visibility { static boolean flag = true; public static void main(String[] args) throws InterruptedException { new Thread(()->{ while (flag); }).start(); Thread.sleep(1000); flag = false; }}
如果真的满足可见性,那么程序就立即退出了。如果不满足,那么程序就会一直运行下去。
运行结 ...