redis ziplist

“redis list” linkedlist 每个node包含了三个部分,指向前一个节点和后一个节点的指针,以及一个数据值。而一个list包含了指向首尾的指针、整个list的长度,以及三个函数指针,用来复制节点的值、释放节点的值,以及比较节点内容。 ziplist 压缩列表 ziplist是一种特殊编码的节省内存空间的双链表,能以O(1)的时间复杂度在两端push和pop数据 ziplist是redis中实现的一个地址连续的链表。 每次操作都需要重新分配内存 先看下官方对ziplist的整体描述 /* The ziplist is a specially encoded dually linked list that is designed to be very memory efficient. It stores both strings and integer values, where integers are encoded as actual integers instead of a series of characters. It allows push and pop operations on either side of the list * in O(1) time. However, because every operation requires a reallocation of the memory used by the ziplist, the actual complexity is related to the ...

Created 4046-07-04 · Updated 9096-10-09 · 3 min · 428 words · -

编译器指令重排, Compiler Instruction Reordering

编译器指令重排, Compiler Instruction Reordering compiler的主要工作就是将对人们可读的源码转化成机器语言,机器语言就是对CPU可读的代码。因此,compiler可以在背后做些不为人知的事情。我们考虑下面的C语言代码: int a, b; void foo(void) { a = b + 1; b = 0; } 使用 aarch64-linux-gnu-gcc 在不优化代码的情况下编译上述代码,使用 objdump 工具查看 foo() 反汇编结果 <foo>: … ldr w0, [x0] // load b to w0 add w1, w0, #0x1 … str w1, [x0] // a = b + 1 ... str wzr, [x0] // b = 0 我们应该知道 Linux 默认编译优化选项是-O2,因此我们采用-O2 优化选项编译上述代码,并反汇编得到如下汇编结果: <foo>: ldr w2, [x0] // load b to w2 str wzr, [x0] // b = 0 add w0, w2, #0x1 str w0, [x1] // a = b + 1 比较优化和不优化的结果,我们可以发现。在不优化的情况下,a 和 b 的写入内存顺序符合代码顺序 (program order)。但是-O2 优化后,a 和 b 的写入顺序和 program order 是相反的。-O2优化后的代码转换成C语言可以看作如下形式: ...

Created 9096-07-09 · Updated 9096-10-09 · 3 min · 586 words · -

Unsafe

“Unsafe” Unsafe在sun.misc 下,顾名思义,这是一个不安全的类,因为Unsafe类所操作的并不属于Java标准,Java的一系列内存操作都是交给jvm的,而Unsafe类却能有像C语言的指针一样直接操作内存的能力,同时也会带来了指针的问题。过度使用Unsafe类的话,会使出错率变得更大,因此官方才命名为Unsafe,并且不建议使用,连注释的没有。 而为了安全使用Unsafe,Unsafe类只允许jdk自带的类使用,从下面的代码中可以看出 public static Unsafe getUnsafe() { Class<?> caller = Reflection.getCallerClass(); if (!VM.isSystemDomainLoader(caller.getClassLoader())) throw new SecurityException("Unsafe"); return theUnsafe; } 如果当前Class是非系统加载的(也就是caller.getClassLoader()不为空),直接抛出SecurityException 。 在java9之后,又出现了一个jdk.internal.misc.Unsafe类,其功能与sun.misc.Unsafe类是一样的,唯一不一样的是在 getSafe() 的时候,jdk.internal.misc.Unsafe是没有做校验的,但是jdk包下的代码,应用开发时是不能直接调用的,而且在java9之后,两个Unsafe类都有充足的注释。 JUC紧密使用了Unsafe的功能。 功能简介 Unsafe类的功能主要分为内存操作、CAS、Class相关、对象操作、数组相关、内存屏障、系统相关、线程调度等功能。 内存操作 堆外(native memory)内存操作 //分配内存,并返回内存地址 public native long allocateMemory(long bytes); //扩充内存,address可以是allocateMemory方法返回的地址,bytes是扩充的大小 public native long reallocateMemory(long address, long bytes); //释放内存 public native void freeMemory(long address); //在给定的内存块设置默认值 public native void setMemory(long address, long bytes, byte value); //获取指定地址值的byte类型 public native byte getByte(long address); //设置堆外指定值的byte类型的值 public native void putByte(long address, byte x); 堆内内存操作 ...

Created 20206-09-20 · Updated 9096-10-09 · 3 min · 456 words · -

相互转换逗号分隔的字符串和 List

“相互转换逗号分隔的字符串和List” https://blog.csdn.net/yywusuoweile/article/details/50315377 将逗号分隔的字符串转换为List 方法 1: 利用JDK的Arrays类 String str = "a,b,c"; List<String> result = Arrays.asList(str.split(",")); 方法 2: 利用Guava的Splitter String str = "a, b, c"; List<String> result = Splitter.on(",").trimResults().splitToList(str); 方法 3: 利用Apache Commons的StringUtils (只是用了split) String str = "a,b,c"; List<String> result = Arrays.asList(StringUtils.split(str,",")); 方法 4: 利用Spring Framework的StringUtils String str = "a,b,c"; List<String> str = Arrays.asList(StringUtils.commaDelimitedListToStringArray(str)); 将List转换为逗号分隔符 方法 1: 利用JDK (好像没有很好的方法,需要一步一步实现) NA 方法 2: 利用Guava的Joiner List<String> list = new ArrayList<String>(); list.add("a"); list.add("b"); list.add("c"); String str = Joiner.on(",").join(list); 方法 3: 利用Apache Commons的StringUtils ...

Created 9096-10-09 · Updated 9096-10-09 · 1 min · 130 words · -

Redis 主从模式 VS 哨兵 sentinel 模式 VS Redis cluster 模式

“主从模式 VS 哨兵sentinel模式 VS Redis cluster模式” 主从模式 (redis2.8版本之前的模式) 、 哨兵 sentinel模式 (redis2.8及之后的模式) 、 redis cluster模式 (redis3.0版本之后) 主从模式原理 同MySQL主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,Redis的主从结构可以采用一主多从或者级联结构,Redis主从复制可以根据是否是全量分为全量同步和增量同步。下图为级联结构。 优点: 解决数据备份问题 做到读写分离,提高服务器性能 缺点: 每个客户端连接redis实例的时候都是指定了ip和端口号的,如果所连接的redis实例因为故障下线了,而主从模式也没有提供一定的手段通知客户端另外可连接的客户端地址,因而需要手动更改客户端配置重新连接 主从模式下,如果主节点由于故障下线了,那么从节点因为没有主节点而同步中断,因而需要人工进行故障转移工作 无法实现动态扩容 sentinel 哨兵模式 Sentinel (哨兵) 是 Redis 的高可用性解决方案: 由一个或多个 Sentinel实例组成的Sentinel系统可以监视任意多个主服务器, 以及这些主服务器属下的所有从服务器,并在被监视的主服务器进入下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器。 优点 Master 状态监测 如果 Master 异常,则会进行 Master-slave 转换,将其中一个 Slave 作为 Master,将之前的 Master 作为 Slave Master-Slave 切换后,master_redis.conf、slave_redis.conf 和 sentinel.conf 的内容都会发生改变,即 master_redis.conf 中会多一行 slaveof 的配置,sentinel.conf 的监控目标会随之调换 缺点: 如果是从节点下线了,sentinel 是不会对其进行故障转移的,连接从节点的客户端也无法获取到新地可用从节点 无法实现动态扩容 cluster 模式 在这个图中,每一个蓝色的圈都代表着一个redis的服务器节点。它们任何两个节点之间都是相互连通的。客户端可以与任何一个节点相连接,然后就可以访问集群中的任何一个节点。对其进行存取和其他操作。 一般集群建议搭建三主三从架构,三主提供服务,三从提供备份功能。每一个节点都存有这个集群所有主节点以及从节点的信息。 它们之间通过互相的ping-pong判断是否节点可以连接上。如果有一半以上的节点去ping一个节点的时候没有回应,集群就认为这个节点宕机了,然后去连接它的备用节点。如果某个节点和所有从节点全部挂掉,我们集群就进入faill状态。还有就是如果有一半以上的主节点宕机,那么我们集群同样进入发力了状态。这就是我们的redis的投票机制,具体原理如下图所示: (1)投票过程是集群中所有master参与,如果半数以上master节点与master节点通信超时(cluster-node-timeout),认为当前master节点挂掉. (2):什么时候整个集群不可用(cluster_state:fail)? ...

Created 9096-10-09 · Updated 9096-10-09 · 4 min · 693 words · -

archlinux kde, config

删除和重新安装 KDE 删除 KDE # 连接到远程主机 ssh root@192.168.50.19 # 1. 停止并禁用 SDDM 显示管理器 systemctl stop sddm systemctl disable sddm # 2. 查看已安装的 KDE 相关包 pacman -Qq | grep -E 'plasma|kde' # 3. 删除 KDE Plasma 桌面环境及相关包 # 删除 plasma 元包和所有依赖 sudo pacman -Rns plasma-desktop plasma-wayland-session # 删除其他 KDE 应用(根据需要) sudo pacman -Rns konsole dolphin kate kwalletmanager # 删除 KDE 主题和附加组件 sudo pacman -Rns breeze-gtk breeze kde-gtk-config kdeplasma-addons # 删除 SDDM(如果不再需要) sudo pacman -Rns sddm # 4. 清理孤立的依赖包 sudo pacman -Rns $(pacman -Qtdq) # 5. 清理配置文件(可选) # 删除系统级配置 rm -rf /etc/sddm.conf.d/ rm -rf /usr/share/sddm/ # 删除用户配置(谨慎操作,会删除个人设置) rm -rf ~/.config/plasma* rm -rf ~/.config/kde* rm -rf ~/.local/share/plasma* rm -rf ~/.local/share/kwalletd/ rm -rf ~/.kde4/ # 6. 清理缓存 rm -rf ~/.cache/plasma* rm -rf ~/.cache/kde* 重新安装 KDE # 1. 更新系统 sudo pacman -Syu # 2. 安装 KDE Plasma plasma-meta(元包/包组) sudo pacman -S plasma-meta # 3. 安装常用的 KDE 应用 sudo pacman -S konsole dolphin kate # 4. 安装 SDDM 显示管理器 sudo pacman -S sddm # 5. 启用 SDDM systemctl enable sddm systemctl start sddm # 6. 安装 Wayland 支持(可选) # 注意:plasma-wayland-session 已集成到 plasma-workspace 中 # 如果已安装 plasma-desktop,Wayland 会话支持已经包含 # 只需安装 XWayland 相关组件即可 sudo pacman -S xorg-xwayland # 7. 安装 GTK 主题支持(可选) sudo pacman -S breeze-gtk breeze kde-gtk-config # 8. 安装 KDE 附加组件(可选) sudo pacman -S kdeplasma-addons # 9. 安装钱包管理器(可选) sudo pacman -S kwalletmanager # 10. 重启系统 reboot 选择性安装 - X11 或 Wayland 纯 Wayland 会话(推荐) 如果只想使用 Wayland 模式,仍需安装少量 X11 组件以支持 XWayland 兼容层: ...

Created 3036-12-03 · Updated 3036-12-03 · 3 min · 504 words · -

DataGrip

DataGrip console 中使用变量 select * from public.actor where actor.actor_id < ${a} 导出建表语句 打开DataGrip、找到目标表 选中之后右键点击SQL Scripts→SQL Generator. 就可以看到建表语句了

Created 3036-07-03 · Updated 3036-07-03 · 1 min · 17 words · -

epub pdf azw3 mobi

“epub pdf azw3 mobi” EPUB> PDF> azw3 Calibre 从 azw3 转换格式到 EPUB 只需要 1分半, 转 PDF 格式需要10分钟以上。 azw3 > EPUB https://divineengine.net/article/how-to-remove-drm-from-kindle-books-with-calibre/ mobi mobi 电子书格式能够流行普及起来,很大程度上依靠亚马逊这个巨大的内容提供商,以及电子书阅读器 Kindle。 其中mobi 电子书主要分为KF7 (也称mobi7) 和 KF8 (也称mobi8) 两种标准的Kindle 电子书。mobi7 不支持在Kindle 中更换字体、加粗等比较丰富的排版格式,mobi8 则支持这些丰富的排版格式。但亚马逊却不支持mobi8 邮箱传输至Kindle。 MOBI格式是Amazon专有的电子书格式。由于Kindle的普及以及亚马逊自身强大的内容供应,该格式可以成为一种常见的电子书格式。实际上,MOBI格式是亚马逊在EPUB的基础上开发的,因此这两种格式实际上非常相似,并且相互转换相对容易。 MOBI格式有两个主要标准,旧的KF7标准和新的KF8标准。两个标准文件扩展名是MOBI,并且文件名没有区别,但是两者之间仍然存在一些区别:KF8标准支持更丰富的排版格式,例如Kindle中的字体替换和粗体显示,而KF7标准不支持这些排版格式。此外,如果通过电子邮件推送将KF8标准电子书同步到Kindle,则该电子书的封面不会显示在Kindle上。 目前市面上的 MOBI 文件大部分是来自两种途径: 一种是 EPUB、pdf 或者 txt 转换成的 MOBI, 一种是从 Amazon 商店流出来的 MOBI。 azw3 目前从 Amazon 购买的书,大部分已经是azw3格式。而以前主流的mobi 格式则越来越少,azw3正逐渐取代mobi成为Kindle电子书的主流格式。 你可以将azw3 理解为亚马逊给mobi8电子书加的一个「壳」,目的是为了更好地保护电子书的版权 (DRM保护) 。也就是说,azw3格式的电子书兼具mobi8电子书支持丰富内容排版的特点。但亚马逊目前还不支持azw3格式的电子书邮箱传输至Kindle,也就是说你没办法将azw3格式的电子书存储至亚马逊云端,也没法将其同步至你的其他Kindle设备或者KindleAPP。 为了让azw3格式的电子书同时支持丰富的排版和邮箱传输,库管同样建议你使用 Calibre 软件将其转换为混合mobi7和mobi8的电子书格式 (both) ,然后再邮箱传输进Kindle。 与 MOBI 一样,AZW和AZW3 同样是亚马逊的私有格式,甚至可以说,MOBI 格式与 AZW、AZW3 格式在本质上并没有什么区别!MOBI 格式与 AZW、AZW3 格式的区别在于,AZW、AZW3 格式比 MOBI 格式多了一层“壳”;MOBI 与 AZW、AZW3 格式的关系你可以这么理解: ...

Created 6066-06-06 · Updated 6066-06-06 · 1 min · 170 words · -

微服务注册中心

“微服务注册中心” 微服务注册中心, ZooKeeper, Eureka, Consul, Nacos 服务注册中心本质上是为了解耦服务提供者和服务消费者。对于任何一个微服务,原则上都应存在或者支持多个提供者,这是由微服务的分布式属性决定的。更进一步,为了支持弹性扩缩容特性,一个微服务的提供者的数量和分布往往是动态变化的,也是无法预先确定的。因此,原本在单体应用阶段常用的静态LB机制就不再适用了,需要引入额外的组件来管理微服务提供者的注册与发现,而这个组件就是服务注册中心。 CAP理论 CAP理论是分布式架构中重要理论 一致性(Consistency) (所有节点在同一时间具有相同的数据) 可用性(Availability) (保证每个请求不管成功或者失败都有响应) 分隔容忍(Partition tolerance) (系统中任意信息的丢失或失败不会影响系统的继续运作) P的理解,我觉得是在整个系统中某个部分,挂掉了,或者宕机了,并不影响整个系统的运作或者说使用, 而可用性是,某个系统的某个节点挂了,但是并不影响系统的接受或者发出请求,CAP 不可能都取,只能取其中2个 原因是 如果C是第一需求的话,那么会影响A的性能,因为要数据同步,不然请求结果会有差异,但是数据同步会消耗时间,期间可用性就会降低。 如果A是第一需求,那么只要有一个服务在,就能正常接受请求,但是对与返回结果变不能保证,原因是,在分布式部署的时候,数据一致的过程不可能想切线路那么快。 再如果,同事满足一致性和可用性,那么分区容错就很难保证了,也就是单点,也是分布式的基本核心,好了,明白这些理论,就可以在相应的场景选取服务注册与发现了 Zookeeper -> CP 与 Eureka 有所不同,Apache Zookeeper 在设计时就紧遵CP原则,即任何时候对 Zookeeper 的访问请求能得到一致的数据结果,同时系统对网络分割具备容错性,但是 Zookeeper 不能保证每次服务请求都是可达的。 从 Zookeeper 的实际应用情况来看,在使用 Zookeeper 获取服务列表时,如果此时的 Zookeeper 集群中的 Leader 宕机了,该集群就要进行 Leader 的选举,又或者 Zookeeper 集群中半数以上服务器节点不可用 (例如有三个节点,如果节点一检测到节点三挂了 ,节点二也检测到节点三挂了,那这个节点才算是真的挂了) ,那么将无法处理该请求。所以说,Zookeeper 不能保证服务可用性。 当然,在大多数分布式环境中,尤其是涉及到数据存储的场景,数据一致性应该是首先被保证的,这也是 Zookeeper 设计紧遵CP原则的另一个原因。 但是对于服务发现来说,情况就不太一样了,针对同一个服务,即使注册中心的不同节点保存的服务提供者信息不尽相同,也并不会造成灾难性的后果。 因为对于服务消费者来说,能消费才是最重要的,消费者虽然拿到可能不正确的服务实例信息后尝试消费一下,也要胜过因为无法获取实例信息而不去消费,导致系统异常要好 (淘宝的双十一,京东的618就是紧遵AP的最好参照) 。 当master节点因为网络故障与其他节点失去联系时,剩余节点会重新进行leader选举。问题在于,选举leader的时间太长,30~120s,而且选举期间整个zk集群都是不可用的,这就导致在选举期间注册服务瘫痪。 在云部署环境下, 因为网络问题使得zk集群失去master节点是大概率事件,虽然服务能最终恢复,但是漫长的选举事件导致注册长期不可用是不能容忍的。 zookeeper 的 CP 模型不适合注册中心 zookeeper 是一个非常优秀的项目,非常成熟,被大量的团队使用,但对于服务发现来讲,zookeeper 真的是一个错误的方案。 在 CAP 模型中,zookeeper 是 CP,意味着面对网络分区时,为了保持一致性,他是不可用的。 ...

Created 28286-12-28 · Updated 28286-12-28 · 2 min · 348 words · -

VarHandle

“VarHandle” VarHandle 的出现替代了java.util.concurrent.atomic和sun.misc.Unsafe的部分操作。并且提供了一系列标准的内存屏障操作,用于更加细粒度的控制内存排序。在安全性、可用性、性能上都要优于现有的API。VarHandle 可以与任何字段、数组元素或静态变量关联,支持在不同访问模型下对这些类型变量的访问,包括简单的 read/write 访问,volatile 类型的 read/write 访问,和 CAS(compare-and-swap)等。 Unsafe 是不建议开发者直接使用的,因为 Unsafe 所操作的并不属于Java标准,会容易带来一些安全性的问题。JDK9 之后,官方推荐使用 java.lang.invoke.Varhandle 来替代 Unsafe 大部分功能,对比 Unsafe ,Varhandle 有着相似的功能,但会更加安全,并且,在并发方面也提高了不少性能。 Varhandle是对变量或参数定义的变量系列的动态强类型引用,包括静态字段,非静态字段,数组元素或堆外数据结构的组件。 在各种访问模式下都支持访问这些变量,包括简单的读/写访问,volatile 的读/写访问以及 CAS (compare-and-set)访问。简单来说 Variable 就是对这些变量进行绑定,通过 Varhandle 直接对这些变量进行操作。 import java.lang.invoke.MethodHandles; import java.lang.invoke.VarHandle; import java.util.Arrays; public class VarHandleX { public int publicVar = 1; protected int protectedVar = 2; @SuppressWarnings("FieldMayBeFinal") private int privateVar = 3; public int[] arrayData = new int[]{1, 2, 3}; @Override public String toString() { return "VarHandleX{" + "publicVar=" + publicVar + ", protectedVar=" + protectedVar + ", privateVar=" + privateVar + ", arrayData=" + Arrays.toString(arrayData) + '}'; } public static void main(String[] args) { try { VarHandleX instance = new VarHandleX(); VarHandle varHandle = MethodHandles.privateLookupIn(VarHandleX.class, MethodHandles.lookup()) .findVarHandle(VarHandleX.class, "privateVar", int.class); varHandle.set(instance, 33); System.out.println(instance); protectedDemo(); protectedDemo2(); publicDemo(); arrayDemo(); } catch (NoSuchFieldException | IllegalAccessException e) { e.printStackTrace(); } } private static void protectedDemo() throws NoSuchFieldException, IllegalAccessException { VarHandleX instance = new VarHandleX(); VarHandle varHandle = MethodHandles.privateLookupIn(VarHandleX.class, MethodHandles.lookup()) .findVarHandle(VarHandleX.class, "protectedVar", int.class); varHandle.set(instance, 22); System.out.println("protected: " + instance); } private static void protectedDemo2() throws NoSuchFieldException, IllegalAccessException { VarHandleX instance = new VarHandleX(); VarHandle varHandle = MethodHandles.lookup() .in(VarHandleX.class) .findVarHandle(VarHandleX.class, "protectedVar", int.class); varHandle.set(instance, 22); System.out.println("protected 2: " + instance); } private static void publicDemo() throws NoSuchFieldException, IllegalAccessException { VarHandleX instance = new VarHandleX(); VarHandle varHandle = MethodHandles.lookup() .in(VarHandleX.class) .findVarHandle(VarHandleX.class, "publicVar", int.class); varHandle.set(instance, 11); System.out.println("public: " + instance); } private static void arrayDemo() throws NoSuchFieldException, IllegalAccessException { VarHandleX instance = new VarHandleX(); VarHandle arrayVarHandle = MethodHandles.arrayElementVarHandle(int[].class); arrayVarHandle.compareAndSet(instance.arrayData, 0, 1, 11); arrayVarHandle.compareAndSet(instance.arrayData, 1, 2, 22); arrayVarHandle.compareAndSet(instance.arrayData, 2, 3, 33); System.out.println("array: " + instance); } } 获取Varhandle方式汇总 MethodHandles.privateLookupIn(class, MethodHandles.lookup())获取访问私有变量的Lookup MethodHandles.lookup() 获取访问protected、public的Lookup findVarHandle: 用于创建对象中非静态字段的VarHandle。接收参数有三个,第一个为接收者的class对象,第二个是字段名称,第三个是字段类型。 findStaticVarHandle: 用于创建对象中静态字段的VarHandle,接收参数与findVarHandle一致。 unreflectVarHandle: 通过反射字段Field创建VarHandle。 MethodHandles.arrayElementVarHandle(int[].class) 获取管理数组的 Varhandle 功能 VarHandle来使用plain、opaque、release/acquire和volatile四种共享内存的访问模式,根据这四种共享内存的访问模式又分为写入访问模式、读取访问模式、原子更新访问模式、数值更新访问模式、按位原子更新访问模式。 ...

Created 21216-09-21 · Updated 21216-09-21 · 4 min · 655 words · -

Spring Cloud

“Spring Cloud” Eureka [jʊ’ri:kə] Ribbon [ˈrɪbən] Feign [fen] Hystrix [hɪst’rɪks] Zuul [zulu] Sleuth [sluθ] Turbine [ˈtɜ:rbaɪn] Spring Cloud Netflix (Eureka、Hystrix、Zuul、Archaius) 、Spring Cloud Config、Spring Cloud Bus、Spring Cloud Cluster、Spring Cloud Consul、Spring Cloud Security、Spring Cloud Sleuth、Spring Cloud Data Flow、Spring Cloud Stream、Spring Cloud Task、Spring Cloud Zookeeper、Spring Cloud Connectors、Spring Cloud Starters、Spring Cloud CLI Eureka: 服务注册中心,一个基于REST的服务,用于定位服务,以实现微服务架构中服务发现和故障转移。 Hystrix: 熔断器,容错管理工具,旨在通过熔断机制控制服务和第三方库的节点,从而对延迟和故障提供更强大的容错能力。 l Turbine: Turbine是聚合服务器发送事件流数据的一个工具,用来监控集群下Hystrix的Metrics情况。 l Zuul: API网关,Zuul是在微服务中提供动态路由、监控、弹性、安全等边缘服务的框架。 l Ribbon: 提供微服务中的负载均衡功能,有多种负载均衡策略可供选择,可配合服务发现和断路器使用。 l Feign: Feign是一种声明式、模板化的HTTP客户端。 l Spring Cloud Config: 配置管理工具包,让你可以把配置放到远程服务器,集中化管理集群配置,目前支持本地存储、Git以及Subversion。 l Spring Cloud Security: 基于Spring Security的安全工具包,为微服务的应用程序添加安全控制。 ...

Created 14146-09-14 · Updated 14146-09-14 · 1 min · 140 words · -

服务治理

“服务治理” https://coolshell.me/articles/talking-about-service-governance-microservices-and-service-mesh.html 服务治理,也称为SOA治理,是指用来管理SOA的采用和实现的过程。 服务定义 (服务的范围、接口和边界) 服务部署生命周期 (各个生命周期阶段) 服务版本治理 (包括兼容性) 服务迁移 (启用和退役) 服务注册中心 (依赖关系) 服务消息模型 (规范数据模型) 服务监视 (进行问题确定) 服务所有权 (企业组织) 服务测试 (重复测试) 服务安全 (包括可接受的保护范围) Dubbo开源 直到2011年10月27日,阿里巴巴开源了自己的SOA服务化治理方案的核心框架Dubbo,服务治理和SOA的设计理念开始逐渐在国内软件行业中落地,并被广泛应用。

Created 14146-09-14 · Updated 14146-09-14 · 1 min · 25 words · -

分布式协调组件

“分布式协调组件” 常用的分布式协调组件有 全局功能数据存储/有功能的组件: K-V类: redis、memcache Zookeeper 消息队列 配置中心: Spring Cloud Config等 持久数据存储: MySQL MongoDB 分布式协调组件应用场景: (类比单机中多线程并发安全变量的操作) 分布式session 分布式计数器 分布式锁 分布式队列 先入先出队列 要等所有队列元素聚集之后才能统一安排执行的Barrier模型队列 分布式配置 分布式协调 / 通知 数据发布、订阅 软负载均衡: 域名 -> IP和端口号配置 命名服务: 在分布式环境中,上层应用需要一个全局唯一的名字,类似于数据库中的主键 集群管理: 集群监控 (进群运行时状态收集) 集群控制 (对集群进行操作和控制) Master选举 https://zhuanlan.zhihu.com/p/50901935

Created 12126-09-12 · Updated 12126-09-12 · 1 min · 40 words · -

CR3控制寄存器

“CR3控制寄存器” CR3用来存放页目录表物理内存基地址,每当进程切换时,Linux 就会把下一个将要运行进程的页目录表物理内存基地址等信息存放到CR3寄存器中。 https://blog.csdn.net/SweeNeil/article/details/106171361

Created 8086-09-08 · Updated 8086-09-08 · 1 min · 4 words · -

celery

celery https://github.com/celery/celery celery 是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度。它的执行单元为任务(task),利用多线程, 如 Eventlet,gevent等,它们能被并发地执行在单个或多个职程服务器(worker servers)上。任务能异步执行(后台运行)或同步执行(等待任务完成)。 # install rabbitmq https://wangyue.dev/rabbitmq # install celery pip install celery # 添加用户跟密码, rabbitmqctl add_user test test123 rabbitmqctl add_user user0 password0 # 添加虚拟主机 rabbitmqctl add_vhost test_vhost rabbitmqctl add_vhost vhost0 # 为用户添加标签, rabbitmqctl set_user_tags test test_tag rabbitmqctl set_user_tags user0 tag0 # 设置用户权限, rabbitmqctl set_permissions -p test_vhost test ".*" ".*" ".*" rabbitmqctl set_permissions -p vhost0 user0 ".*" ".*" ".*" # run celery server celery -A tasks worker --loglevel=INFO ———————————————— 版权声明:本文为CSDN博主「吴秋霖」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qiulin_wu/article/details/106119757 ...

Created 16166-08-16 · Updated 16166-08-16 · 2 min · 280 words · -

rabbitmq

rabbitmq nerdctl # nerdctl, network: host nerdctl run -d --hostname host0 --name rabbitmq --network host --memory 2g -p 15672:15672 -p 5672:5672 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 50000" rabbitmq:3.8.18-management # docker with timeout config docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 -e RABBITMQ_SERVER_ADDITIONAL_ERL_ARGS="-rabbit consumer_timeout 50000" rabbitmq:3.8.18-management # 查看 版本 rabbitmqctl status docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.10-management docker run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.8.18-management podman run -d --hostname host0 --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3.11.10-management rabbitmqctl list_connections rabbitmqctl list_queues rabbitmqctl list_channels rabbitmqctl list_users rabbitmqctl cluster_status # 查看 consumer_timeout 的值 rabbitmqctl eval 'application:get_env(rabbit, consumer_timeout).' 管理页面 使用:http://宿主ip:15672 访问管理页面,默认用户名密码:guest/guest ...

Created 16166-08-16 · Updated 16166-08-16 · 2 min · 311 words · -

tesla

“tesla” 基础版辅助驾驶 (BAP/AP 增强版自动辅助驾驶 (EAP) EAP Enhanced Autopilot,增强型自动驾驶 和完全自动驾驶 (FSD) FSD Full Self-Driving 完全自动驾驶 EAP 自动辅助导航驾驶: 自动驶入和驶出高速公路匝道或立交桥岔路口,超过行驶缓慢的车辆。 自动辅助变道: 在高速公路上自动辅助变换车道。 自动泊车: 平行泊车与垂直泊车。 智能召唤: 在合适的场景下,停在车位的车辆会响应您的召唤,驶出车位并前往您所在的位置。 FSD NOA Navigate on Autopilot自动辅助导航驾驶 (简称NOA) 启动车辆即启动, 开启该选项后,在具备NOA使用条件的路段,Model 3将自动开启NOA功能。 根据速度变道 (即自动超车) 特斯拉官方称之为速控变道,在行驶中存在两种普遍情况,一种是本车道内行驶时前方有慢车阻挡,需要变道超车;另一种是正常行驶中,有慢车从前方进入到本车道,此时需要变道以保持车速。该功能有三种变道模式: 柔和、普通、极速。柔和可以理解为以最保守的变道方式,极速则最激进的变道模式。 要求变道确认 开启这一功能后,当NOA驾驶中,Model 3判断需要变线时,将提醒驾驶员打转向灯进行确认,然后才能执行变线操作。而选择“否”,关闭这一功能后,Model 3将自动变线,而不再要求打转向灯进行确认。 变道提醒 开启后,在自动变道时,Model 3会通过蜂鸣或振动方式提醒驾驶员即将进行变道操作。

Created 6066-08-06 · Updated 6066-08-06 · 1 min · 43 words · -

中间件, Middleware

“中间件, Middleware” 中间件 中间件一词的由来中间件这个术语第一次出现是 1968 年在德国加尔米施帕滕基兴举办的 NATO 软件工程大会 结束后发表的一份报告中。这届大会正式确定了软件工程(Software Engineering)的概念,同时还探讨了软件设计、生产和分发等主题。 中间件的定义 中间件 (英语: Middleware) ,又译中间件、中介层,是一类提供系统软件和应用软件之间连接、便于软件各部件之间的沟通的软件,应用软件可以借助中间件在不同的技术架构之间共享信息与资源。中间件位于客户机服务器的操作系统之上,管理着计算资源和网络通信。 – 维基百科什么不是中间件我们按照类别来看一些经常会遇到的一些不是中间件的概念- 业务平台不是中间件,业务平台是从服务的视角抽象的能同时支撑多个业务,业务之间的信息能形成交互和增强的平台。- 营销工具不是中间件,营销工具是直接作用于最终消费者用户的软件或者插件服务。- 二方/三方工具包不是中间件,二方/三方工具包是在各种场景的程序开发过程中沉淀的一些常用工具类(功能)的集合,包含于软件代码本身。- SaaS 不是中间件,SaaS(Software as a Service) 更多的是一种软件交付模式,无需用户安装,通过网络在线访问的一种服务模式。- PaaS 不是中间件,PaaS(Platform as a Service) 将软件研发的平台做为一种服务,提供软件部署平台(强调的是屏蔽系统和软件细节的runtime平台)。评判关键从定义可以总结出评判的几个地方 性质: 中间件是软件。 作用层级: 系统软件和应用软件之间、软件各部件之间;管理客户机与系统软件之间的计算资源和网络通信。 服务对象: 中间件为应用软件服务,应用软件为最终用户服务,最终用户并不直接使用中间件。 中间件的好处 中间件能给客户带来什么?为上层应用软件的开发提供便捷的、开箱即用的服务交互和计算的能力,缩短开发周期;屏蔽底层runtime的差异;节省应用本身的系统资源,减少运行成本。 中间件分类 什么时候使用中间件 基于中间件的定义我们知道中间件是连接软件与系统之间的服务,那么我们什么时候使用了中间件,在哪些地方用到了中间件了。我们不妨假设一个http请求过程来窥视一番。当你在浏览器中输入一个网址时,它会通过 DNS 解析到目标服务注册的公网IP地址请求到达目标服务的 web 反向代理服务器 Tengine 之后,经过一定的过滤转发到目标服务A上服务A通过 RPC框架 Dubbo 请求服务B的结果做中间计算,并且从 Tair 缓存中读取计算因子,计算结果服务A接着使用 Druid 通过 TDDL 写入计算结果到 MySQL Master 节点然后返回结果异步过程中 Canal 通过模拟 Binlog 主从复制的原理,迅速将这条 Binlog 消费并下发到消息队列 RocketMQ服务C通过 RocketMQ 消费到事件之后,通过配置中心 ConfigServer 拉取到的策略进行对应策略的事件处理。这个过程中我们使用了一系列的中间件来协同各个微服务完成整个流程,如web反向代理服务器 Tengine、RPC框架 Dubbo、缓存 Tair、连接池 Driud、数据库代理层 TDDL、Binlog 同步工具 Canal、消息队列 RocketMQ、配置中心 ConfigServer。 ...

Created 29296-07-29 · Updated 29296-07-29 · 1 min · 148 words · -

负载均衡

负载均衡 负载均衡 load balancing 何为负载均衡?顾名思义就是让系统的负载根据一定的规则均衡地分配在所有参与工作的服务器上,从而最大限度地提升系统整体的运行效率。 LVS、Nginx 当前大多数的互联网系统都使用了服务器集群技术,集群是将相同服务部署在多台服务器上构成一个集群整体对外提供服务,这些集群可以是 Web 应用服务器集群,也可以是数据库服务器集群,还可以是分布式缓存服务器集群等等。 在实际应用中,在 Web 服务器集群之前总会有一台负载均衡服务器,负载均衡设备的任务就是作为 Web 服务器流量的入口,挑选最合适的一台 Web 服务器,将客户端的请求转发给它处理,实现客户端到真实服务端的透明转发。 最近几年很火的「云计算」以及分布式架构,本质上也是将后端服务器作为计算资源、存储资源,由某台管理服务器封装成一个服务对外提供,客户端不需要关心真正提供服务的是哪台机器,在它看来,就好像它面对的是一台拥有近乎无限能力的服务器,而本质上,真正提供服务的,是后端的集群。 LVS、Nginx、HAProxy 是目前使用最广泛的三种软件负载均衡软件。 一般对负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术。具体的应用需求还得具体分析,如果是中小型的 Web 应用,比如日 PV 小于1000万,用 Nginx 就完全可以了;如果机器不少,可以用 DNS 轮询,LVS 所耗费的机器还是比较多的;大型网站或重要的服务,且服务器比较多时,可以考虑用 LVS。 目前关于网站架构一般比较合理流行的架构方案: Web 前端采用 Nginx/HAProxy+Keepalived 作负载均衡器;后端采用 MySQ L数据库一主多从和读写分离,采用 LVS+Keepalived 的架构。 LVS LVS 是 Linux Virtual Server 的简称,也就是 Linux 虚拟服务器。现在 LVS 已经是 Linux 标准内核的一部分,从 Linux2.4 内核以后,已经完全内置了 LVS 的各个功能模块,无需给内核打任何补丁,可以直接使用 LVS 提供的各种功能。 LVS 自从1998年开始,发展到现在已经是一个比较成熟的技术项目了。 LVS 的体系结构 LVS 架设的服务器集群系统有三个部分组成: (1) 最前端的负载均衡层,用 Load Balancer 表示 (2) 中间的服务器集群层,用 Server Array 表示 ...

Created 26266-07-26 · Updated 26266-07-26 · 3 min · 451 words · -

Java NIO Channel, buffer

“Java NIO Channel, buffer” Channel Channel Characteristics Java NIO Channel Classes buffer 什么是缓冲区? 缓冲区类型 缓冲区内部细节 NIO Buffer Characteristics How to Read from NIO Buffer How to Write to NIO Buffer Java NIO 读写文件实例程序 Channel Java NIO中,channel用于数据的传输。类似于传统IO中的流的概念。channel的两端是buffer和一个entity,不同于IO中的流,channel是双向的,既可以写入,也可以读取。而流则是单向的,所以channel更加灵活。我们在读取数据或者写入数据的时候,都必须经过channel和buffer,也就是说,我们在读取数据的时候,先利用channel将IO设备中的数据读取到buffer,然后从buffer中读取,我们在写入数据的时候,先将数据写入到buffer,然后buffer中的数据再通过channel传到IO设备中。 image.png 我们知道NIO的特点就是将IO操作更加类似于底层IO的流程。 我们可以通过底层IO的机制更好的理解channel。 所有的系统I/O都分为两个阶段: 等待就绪和操作。 等待就绪就是从IO设备将数据读取到内核中的过程。 操作就是将数据从内核复制到进程缓冲区的过程。 channel就可以看作是IO设备和内核区域的一个桥梁,凡是与IO设备交互都必须通过channel,而buffer就可以看作是内核缓冲区。这样整个过程就很好理解了。 我们看一下读取的过程 先从IO设备,网卡或者磁盘将内容读取到内核中,对应于NIO就是从网卡或磁盘利用channel将数据读到buffer中 然后就是内核中的数据复制到进程缓冲区,对应于就是从buffer中读取数据 写入的过程则是: 先从进程将数据写到内核中,对应于就是进程将数据写入到buffer中, 然后内核中的数据再写入到网卡或者磁盘中,对应于就是,buffer中的数据利用channel传输到IO设备中。 image.png 以上其实就是NIO基本的利用channel和buffer进行读取和写入的流程。 Channel Characteristics 与传统IO中的流不同,channel是双向的,可读可写 channel从buffer中读取数据,写入数据也是先写入到buffer channel可以实现异步读写操作 channel可以设置为阻塞和非阻塞的模式 非阻塞模式意味着,当读不到数据或者缓冲区已满无法写入的时候,不会把线程睡眠 只有socket的channel可以设置为非阻塞模式,文件的channel是无法设置的。文件的IO一定是阻塞的 如果是文件channel的话,channel可以在channel之间传输数据 Java NIO Channel Classes channel主要有两大类,四个具体的类 FileChannel 文件的读写是不可以设置为非阻塞模式 SocketChannel 根据tcp和udp,服务端和客户端,又可以分为, SocketChannel, ServerSocketChannel and DatagramChannel.它们是可以设置为非阻塞模式的 buffer 什么是缓冲区? Buffer 是一个对象, 它包含一些要写入或者刚读出的数据。 在 NIO 中加入 Buffer 对象,体现了新库与原 I/O 的一个重要区别。在面向流的 I/O 中,您将数据直接写入或者将数据直接读到 Stream 对象中。 在 NIO 库中,所有数据都是用缓冲区处理的。在读取数据时,它是直接读到缓冲区中的。在写入数据时,它是写入到缓冲区中的。任何时候访问 NIO 中的数据,您都是将它放到缓冲区中。 缓冲区实质上是一个数组。通常它是一个字节数组,但是也可以使用其他种类的数组。但是一个缓冲区不 仅仅 是一个数组。缓冲区提供了对数据的结构化访问,而且还可以跟踪系统的读/写进程。 ...

Created 25256-07-25 · Updated 25256-07-25 · 3 min · 481 words · -