配置nginx实现https访问
安装nginx在官网下载和系统匹配的nginx,解压即可 安装OpenSSL若网站有https的证书跳过2、3、4步即可,若没有证书则需要自己生成 由于代理https需要使用证书,这里我们使用OpenSSL生成自签名的证书,可以下载与系统相匹配的OpenSSL程序进行安装,安装过程一直下一步即可,下载地址 配置环境变量 新增环境变量 OPENSSL_HOME,变量值为 D:\OpenSSL-Win64,指向OpenSSL的安装路径 新增环境变量 OPENSSL_CONF,变量值为 D:\OpenSSL-Win64\bin\openssl.cfg,指向openssl.cfg文件目录 在环境变量path的末尾添加 %OPENSSL_HOME%\bin 生成证书在nginx安装目录创建 ssl文件夹,用于存放证书,如我的是 F:\nginx-1.16.1\ssl,以管理员权限运行cmd并进入创建的ssl目录 创建私钥在命令行中执行命令 openssl genrsa -des3 -out demo.key 1024 ,demo是私钥文件名,可以自定义,此处需要输入和验证密码,输入的密码...
面向对象的设计原则
什么样的代码可以称之为好代码?又如何评价代码比较差?每个人也许都有自己的标准,但是在软件设计领域中,有一套通过经验总结出来的,可以有效解决问题的指导思想和方法论,遵从这些原则,可以事半功倍,反之则有可能带来一些麻烦。 SOLIDSOLID是五种设计原则首字母的缩写,有趣的是这个单词本身就有稳定的含义,遵从这些设计原则,有助于我们设计出更灵活,易于拓展和维护的软件系统。 Single Responsibility Principle(SRP):单一职责原则 Open Close Principle(OCP):开闭原则原则 Liskov Substitution Principle(LSP):里氏替换原则 Interface Segregation Principle(ISP):接口隔离原则 Dependency Inversion Principle(DIP):依赖倒置原则 SOLID原则之间并不是相互孤立的,彼此间存在着一定关联,一个原则可以是另一个原则的加强或基础;违反其中的某一个原则,可能同时违反了其他原则。其中,开闭原则和里氏代换原则是设计目标;单一职责 原则...
深入解析StackOverflowError:从递归到迭代的优雅转型
栈溢出机制深度剖析在Java程序执行过程中,每个线程都拥有独立的栈空间用于存储方法调用和局部变量。当函数被调用时,JVM会创建一个新的栈帧(Stack Frame)并压入栈中,包含方法的参数、局部变量和返回地址等信息。 栈溢出的根本原因12345// 递归调用导致栈帧不断累积public void recursiveMethod(int n) { if (n <= 0) return; recursiveMethod(n - 1); // 每次调用都创建新的栈帧} 当递归层次过深时,栈帧数量超过栈容量限制,就会抛出java.lang.StackOverflowError。 系统化解决方案算法重构:递归转迭代核心思路:用显式的栈数据结构替代系统调用栈优势: 堆内存远大于栈内存,可处理更深层次的数据结构 避免方法调用的开销,提升性能 内存使用可控,不易出现溢出 尾递归优化(理论层面)虽然Java编译器不支持自动尾递归优化,但了解其原理有助于写出更好的代码: 1234567891011// 非尾递归public int factorial(i...
AI时代的程序员焦虑
AI时代的焦虑GPT、Claude等AI工具的爆发式发展,给程序员群体带来了前所未有的冲击和焦虑: 代码生成能力:AI能快速生成高质量代码,初级开发者的工作价值被质疑 技术迭代加速:新技术层出不穷,学习速度跟不上变化速度 岗位不确定性:裁员潮下,会被AI取代吗? 成为每个程序员的心头大石 学习价值困惑:花大量时间学习的知识,可能几个月后就过时了 这种焦虑感叠加原有的职业困境,让很多人更加迷茫:学什么?怎么学?学了还有用吗? 但历史告诉我们,每次技术革命都会淘汰一批人,也会成就一批人。关键不在于AI有多强,而在于我们如何调整学习策略,让自己成为驾驭AI的人,而不是被AI淘汰的人。 现状1、产品提需求,讨论开发,熟悉数据库,增删改查,加班,恶性循环 2、有些人比较爱学习,刷视频。视频讲的都挺好,源码课看了,喜欢看,但是越看越累,看完也不知道这东西怎么用,在公司就负责某个模块,天天围绕着几张表,处理不完的杂事 3、面试突击背题,背完就忘 4、不知道最精通的技术是什么,每天都在用Spring、SpringBoot,面试的时候稍微往深了问,发现并不知道底层的原理,也觉着底层原理并没有什...
从JUnit到Mockito:构建可靠Java单元测试
JUnit 4以下是JUnit 4中一些常用的类和注解的相关API: 注解: @Test:标记测试方法。 @Before:在每个测试方法之前执行的方法。 @After:在每个测试方法之后执行的方法。 @BeforeClass:在整个测试类之前执行的静态方法。 @AfterClass:在整个测试类之后执行的静态方法。 @RunWith:指定自定义的测试运行器(Runner)。 @Ignore:忽略某个测试方法或测试类。 断言(Assert): Assert.assertEquals(expected, actual):判断两个值是否相等。 Assert.assertTrue(condition):判断给定条件是否为真。 Assert.assertFalse(condition):判断给定条件是否为假。 Assert.assertNull(actual):判断给定对象引用是否为空。 Assert.assertNotNull(actual):判断给定对象引用是否不为空。 测试运行器(Runner): BlockJUnit4ClassRunner:默认的JUnit 4运行器,用...
线程池中的隐形陷阱:任务依赖导致的线程饥饿锁
故障现象为提升接口响应速度,将聚合接口的串行调用改为异步并行。上线后不久,系统抛出大量异常: 123456Exception in thread "main" java.util.concurrent.ExecutionException: java.util.concurrent.RejectedExecutionException: Task java.util.concurrent.FutureTask@42936575[Not completed, task = xxxxx] rejected from java.util.concurrent.ThreadPoolExecutor@33f18ac[Running, pool size = X, active threads = X, queued tasks = N, completed tasks = M] 线程池和队列均已被耗尽。 第一反应是线程池参数设置太小,但深入分析后发现:代码逻辑有问题——提交到线程池的任务存在相互依赖关系。 核心问题:在有限大小的线程池中执行相互依赖的任务,可能产生死...
Zookeeper分布式服务框架
Zookeeper是一个分布式服务框架,是Apache Hadoop的一个子项目,它主要用于解决分布式应用中经常遇到的一些数据管理问题,比如配置管理、命名服务、分布式锁、集群管理等。刚接触zookeeper的时候有些云里雾里,不知从哪里入手好,其实简单的说zookeeper就是 文件系统 + 监听通知机制。 系统原理文件系统在zookeeper中维护了类似Unix系统的树形文件节点,可以往这个节点中存储或者获取数据,我们将这些节点称为znode,每个znode默认能够存储1Mb的数据,znode有四种不同的类型。 PERSISTENT 持久化目录节点 所谓持久节点就是指节点创建后,除非进行删除操作就一直存在,不会因创建该节点的客户端会话失效或者zookeeper服务停止而消失 PERSISTENT_SEQUENTIAL 持久化顺序编号节点 和持久节点基本特性一致,额外的特点是,每个父节点会为他的第一级子节点维护一份时序,会记录每个子节点创建的先后顺序。在创建子节点的过程中,zookeeper会自动给子节点的名称后面增加一个数字后缀。例如创建名为”test”的子节点,zooke...
ZooKeeper服务注册发现
在分布式架构中,系统经常被暴漏为服务供其他系统调用,为使系统间能够相互通信,需要有一个协调系统来管理这些服务,这就是服务注册与服务发现,这个协调者也被称之为注册中心。下面基于zookeeper来实现一个简单的服务注册与发现功能 通过Maven引入需要的jar包 12345<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version></dependency> 创建服务注册类 1234567891011121314151617181920212223242526272829303132package com.wrxiang.zk.util;import org.I0Itec.zkclient.ZkClient;public class ZkServiceRegistry { private ZkClient zkClient; ...
Zookeeper统一配置管理
为什么需要统一配置?我们在开发系统时,一般会将一些信息添加到配置文件中,比如数据库信息、日志等,如果需要更改也是修改配置文件然后再发布到生产中,这种方式在集群的环境下就会显得很麻烦。那么有什么解决方法呢? 将公共配置抽取出来 提供统一的配置入口对公共配置进行修改 修改后的内容能够同步到各集群系统中 Zookeeper方案这里我们采取zookeeper实现统一配置管理,配置信息存放在zookeeper的节点中,一旦配置信息发生改变,zk会通知监听该节点的客户端系统,客户端系统获取最新的配置信息,然后进行配置信息的重新载入。下面基于zookeeper实现了一个粗略的统一配置管理通过Maven引入zkclient.jar 12345<dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.11</version></dependency> 创建配置信息实体 Conf...
linux主机通过ssh登录windows服务器启动tomcat所踩的坑
情景描述公司的Jenkins服务安装在linux系统上,但是很多应用服务器都是windows系统,那么在jenkisn上编译生成的war包如何传输到windows服务器上并且进行tomcat服务的重启呢?相对于linux的应用服务器,使用jenkins在windows上做自动发布还是遇到了一些不好解决的问题,windows系统在运维上还是有许多不便的(默默吐槽一句)。 发布步骤类比linux的应用服务器,首选是通过ssh远程登录的方式进行,这样的话jenkins的配置都不需要怎么更改,简单的发布步骤如下: jenkins中使用MAVEN编译打包,生成所需的war包 scp将war包传输到应用服务器 ssh远程执行应用服务器的部署重启脚本 发布完成 windows默认是不支持ssh服务的,这里我采用的是微软官方的解决方案OpenSSH,安装步骤可以参考:Windows安装OpenSSH服务 遇到的问题jenkisn远程调用应用服务器上的部署脚本后,tomcat服务没有启动,但是在应用服务器上手动运行脚本是能够完成项目的部署以及重启的,通过调试发现远程调用bat脚本确实将tomc...
VS Code快捷键指南
打开工程:code + 路径 打开指定文件:ctrl + p 打开/关闭终端:ctrl + ` (1左边的按键) 跳转到行:ctrl + g 按单词移动光标:ctrl + 左右 选中单词:ctrl + d (重复按可以多选) 选中行:ctrl + l (重复按会同时选择下一行) 移动行:alt + 上下 格式化代码:ctrl + shift + f 跳转到定义:f12 查看当前文件符号:ctrl + shift + o 剪切/复制当前行:ctrl + x / ctrl + c (什么都不选的时候) 切换tab:alt+数字 顺序切换tab:ctrl + pageup / pagedown 关闭文件:ctrl+w 关闭所有文件:ctrl + k w (ctrl不松手) ctrl+b 打开主侧边栏 ctrl+shift+e 打开文件管理器 ctrl+0 焦点聚焦到主侧边栏 ctrl+1 焦点聚焦到代码编辑器 ctrl+shift+space 重新出现函数信息提示 ctrl+\ 添加分屏 ctrl + d 选中当前内容,连续快捷键会逐个选...
Markdown LaTeX公式指南
在MarkDown文件中上写公式是比较头疼的事情。好在Markdown支持LaTeX公式的输入,在一定程度上缓解了输入的麻烦。 基础部分公式标记在Markdown中,有两种输入公式的方法:一是行内公式(inline),用一对美元符号$包裹。二是整行公式(displayed),用一对紧挨的两个美元符号$$包裹。 这是一个行内公式 $E=mc^2$,写法是:$E=mc^2$。这是一个整行公式:$$ \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6} $$写法是 1$$ \sum_{i=0}^n i^2 = \frac{(n^2+n)(2n+1)}{6} $$ 希腊字母 名称 大写 Tex 小写 Tex alpha $A$ A $\alpha$ \alpha beta $B$ B $\beta$ \beta gamma $\Gamma$ \Gamma $\gamma$ \gamma delta $\Delta$ \Delta $\delta...







