DoH和DoT是什么
DNS 协议要讲 DoT 和 DoH,不可避免的我们要重温一下 DNS 协议的历史。 DNS 的历史与安全问题DNS 协议在 1987 年甚至更早的时候就被规范好,那个年代互联网安全还不是严重的威胁,DNS 协议使用非可靠的 UDP 和 TCP 协议。 UDP 的问题UDP 是一个无状态的传输协议,尽管在传递数据时非常快,但它是无法避免攻击的。此外,在数据传递时,因为网络状态差的时候,很容易发生丢包的情况。此外,UDP 是明文在网络上传输。 TCP 的问题TCP 相对于 UDP 安全性是略高。它的可靠体现在 TCP 在传递数据之前,会通过三次握手来建立连接。 然而 TCP 就是完美的解决方案吗?并不尽然。正是因为 TCP 的三次握手机制,导致 TCP 很容易被利用来实现 DOS 等攻击。 DNS 协议的安全隐患时至今日,互联网的安全环境已经截然不同。假设用户被某个攻击者盯上,我们来看原来的使用 UDP 和 TCP 协议可能存在什么样的安全隐患: 隐患一:无法验证对端的身份当浏览器接收到一个 DNS 的响应时,它无法确认这个响应是否来自它信任的 DNS 服务商。在 DNS 服务商答...
Debian 12 使用NTP同步时间
在 Debian 12 上使用 ntpd(Network Time Protocol Daemon)进行时间同步可以提供高精度和稳定的时间服务。以下是详细的设置步骤: 1. 安装 NTP 服务首先,确保系统包是最新的,然后安装 ntp: 12sudo apt updatesudo apt install -y ntp 2. 配置 NTP 服务器ntpd 的配置文件位于 /etc/ntp.conf。安装完成后,您可以编辑此文件以指定 NTP 服务器和调整其他设置。 1sudo nano /etc/ntpsec/ntp.conf 在文件中找到以 pool 或 server 开头的行,这是默认的 NTP 服务器。可以将它们替换为您想要使用的 NTP 服务器。例如,使用公共的 NTP 服务器: 12345# 默认的服务器配置pool 0.debian.pool.ntp.org iburstpool 1.debian.pool.ntp.org iburstpool 2.debian.pool.ntp.org iburstpool 3.debian.pool.ntp.org iburst...
Docker-compose ports和expose的区别
docker-compose中有两种方式可以暴露容器的端口:ports和expose。 1 portsports暴露容器端口到主机的任意端口或指定端口,用法: 1234ports: - "80:80" # 绑定容器的80端口到主机的80端口 - "9000:8080" # 绑定容器的8080端口到主机的9000端口 - "443" # 绑定容器的443端口到主机的任意端口,容器启动时随机分配绑定的主机端口号 不管是否指定主机端口,使用ports都会将端口暴露给主机。 2 exposeexpose暴露容器给link到当前容器的容器,用法: 1234expose: - "3000" - "8000" 以上指令将当前容器的端口3000和8000暴露给link到本容器的容器。 和ports的区别是,expose不会将端口暴露给主机。
Git 创建远程仓库推送出现 refusing to merge unrelated histories 错误
背景在本地创建了项目并使用git进行跟踪,在远程仓库创建了项目,并进行了一些初始化,例如生成了README.md Linces等文件的时候,关联远程仓库并推送的时候会出现下面的报错: 1* branch master -> FETCH_HEAD = [up to date] master -> origin/master fatal: refusing to merge unrelated histories 核心报错原因该错误是 Git 的安全机制拦截:本地仓库和远程 origin/master 分支被判定为 两个完全独立、无血缘关系 的仓库(无共同的初始提交),Git 默认拒绝合并这类「无关历史」,避免仓库数据混乱。 ✅ 你的场景补充:up to date 仅代表分支提交记录数量一致,不代表历史同源,核心矛盾是「历史无关」而非「版本不一致」。 方案 1:【最优推荐】强制合并无关历史(一行命令解决,99% 场景适用)这是 Git 官方提供的专属解决方案,直接添加参数允许合并无血缘关系的仓库,保留双方所有提交记录,是最便捷、最常用的方法: 核心命令(直接执行,一...
Nginx 反向代理相关配置
当我们在一台服务器上 启动多个服务时, 因为在 http 协议下默认端口是 80 端口, https 下默认是 443 端口,为了好记和美观我们 只能对外暴漏这两个端口。 以 http 协议 为例假设我 有个后台服务在 127.0.0.1:3000这个服务里面有个接口 /aaa/bbb如果你的 后台服务启动到 3000 端口http://xxxx.com:3000/aaa/bbb 这样也是可以访问的但是,不好记也不美观.访问时 希望http://xxxx.com/api/aaa/bbb或http://api.xxxx.com/aaa/bbb所以我们得 让 Nginx 启动到 80 端口上, 然后 Nginx 通过 /api 前缀 或 二级域名 来进行代理到 目标服务 nginx.conf 配置123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657...http { ... server { ...
Nginx 配置 Websocket
WebSocket 和HTTP虽然是不同协议,但是两者“握手”方式兼容。通过HTTP升级机制,使用HTTP的Upgrade和Connection协议头的方式可以将连接从HTTP升级为WebSocket。Websocket 使用 ws 或 wss 的统一资源标志符,类似于 HTTPS,其中 wss 表示在 TLS 之上的 Websocket。如: 12ws://example.com/wsapiwss://secure.example.com/ Websocket 使用和 HTTP 相同的 TCP 端口,可以绕过大多数防火墙的限制。默认情况下,Websocket 协议使用 80 端口;运行在 TLS 之上时,默认使用 443 端口。 一个典型的Websocket握手请求如下: 客户端请求: 1234567GET / HTTP/1.1Upgrade: websocketConnection: UpgradeHost: example.comOrigin: http://example.comSec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==Sec...
RocketMQListener和MessageListenerOrderly的顺序消费对比
在SpringBoot集成RocketMQ实现顺序消费时,实现RocketMQListener接口并指定ConsumeMode.ORDERLY 与 直接实现MessageListenerOrderly接口 本质上都是基于RocketMQ的顺序消费机制,但两者在编程模型、封装层级和使用场景上存在区别,具体如下: 1. 所属框架与封装层级不同 RocketMQListener + ConsumeMode.ORDERLY是Spring Cloud Alibaba RocketMQ对原生API的封装,属于Spring生态的编程模型。它通过@RocketMQMessageListener注解的consumeMode属性(设置为ConsumeMode.ORDERLY)声明顺序消费,底层会自动适配RocketMQ的顺序消费逻辑,简化了开发者对原生API的直接操作。 MessageListenerOrderly接口是RocketMQ客户端原生API(org.apache.rocketmq.client.consumer.listener包下)的接口,属于更底层的编程模型。开发者需要直接对接Roc...
RocketMQ消息幂等处理
为了防止消息重复消费导致业务处理异常,云消息队列 RocketMQ 版的消费者在接收到消息后,有必要根据业务上的唯一Key对消息做幂等处理。本文介绍消息幂等的概念、适用场景以及处理方法。 什么是消息幂等当出现消费者对某条消息重复消费的情况时,重复消费的结果与消费一次的结果是相同的,并且多次消费并未对业务系统产生任何负面影响,那么这个消费者的处理过程就是幂等的。 例如,在支付场景下,消费者消费扣款消息,对一笔订单执行扣款操作,扣款金额为100元。如果因网络不稳定等原因导致扣款消息重复投递,消费者重复消费了该扣款消息,但最终的业务结果是只扣款一次,扣费100元,且用户的扣款记录中对应的订单只有一条扣款流水,不会多次扣除费用。那么这次扣款操作是符合要求的,整个消费过程实现了消息幂等。 适用场景在互联网应用中,尤其在网络不稳定的情况下, RocketMQ 版的消息有可能会出现重复。如果消息重复会影响您的业务处理,请对消息做幂等处理。 消息重复的场景如下: 发送时消息重复 当一条消息已被成功发送到服务端并完成持久化,此时出现了网络闪断或者客户端宕机,导致服务端对客户端应答失败。 如果此...
Spring Cloud Alibaba体系使用OpenFeign与RestTemplate作为RPC组件
前言 本篇将介绍Spring Cloud Alibaba使用OpenFeign和RestTemplate进行RPC调用,并且将介绍两种RPC工具如何集成Sentinel进行系统保护。 OpenFeignOpenFeign介绍 OpenFeign是一种声明式、模板化的HTTP客户端。 在Spring Cloud中使用OpenFeign,可以做到使用HTTP请求访问远程服务,就像调用本地方法一样的,开发者完全感知不到这是在调用远程方法,更感知不到在访问HTTP请求。 OpenFeign使用 编写两个服务,一个provider服务account-svc一个consumer服务order-svc。 Provider代码 pom依赖 123456789101112131415161718192021222324252627<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" x...
SpringBoot 项目使用Lettuce连接Redis
Maven依赖123456789101112<!-- redis 缓存操作 --><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId></dependency><!-- pool 对象池 --><dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId></dependency> 配置项详解在 Spring Boot 中,通过 spring.data.redis.lettuce 配置项,可以对 Lettuce Redis 客户端进行配置。Lettuce 是 Spring Data Redis 默认使用的 Redis 客户端,支持高...

