首页 文章 精选 留言 我的

精选列表

搜索[高DPI],共10000篇文章
优秀的个人博客,低调大师

Lem 2.0 发布,高扩展性编辑器

Lem 是一款专为 Common Lisp 编程语言而开发的编辑器,支持 Windows、Linux 和 macOS。 Lem 2.0 正式发布,带来了以下这些变化: SDL2 前端 这个版本的亮点是 SDL2 前端的实现。这个功能增加了对鼠标、图形功能和 Windows 的支持。 图形 由于 SDL2 的图形功能,现在可以显示图像和形状。你可以在指定的缓冲区或窗口上的任何位置进行绘制。 鼠标支持 增加了对鼠标点击和滚动的支持。此外,用鼠标中键在光标位置插入 S-expressions,以及通过双击或三击进行选择,都已成为可能。 增加颜色主题 此前,默认的主题只限于 emacs-dark 和 emacs-light。在这个版本中,增加了 180 多个新的主题。 此外,还增加了M-x list-color-themes命令,它允许你显示并从可用的主题列表中选择。 此外,所选的主题被保存为 $HOME/.lem/config.lisp 中的 plist,并在编辑器重新启动时应用。 UI 改进 新版本大大改进了 lem 的默认外观,改变了浮动窗口边框、框架复用器标签等元素的外观。此外,还为光标位置的线条添加了高亮显示。 还修改了列出缓冲区(C-x C-b)和显示 slime 连接列表(M-x lisp-connection-list)的用户界面。 并更新了完成窗口的设计,该窗口出现在C-x C-f这样的命令中。 grep 改进了用户界面,以便在使用grep或M-.时显示多个候选 directory-mode 改进了使用 M-x 查找文件打开目录时的显示。主要的更新包括: 显示与文件对应的 emojis 增加了对鼠标的支持 能够用外部程序打开 lem 不支持的文件 Lisp 模式 做了一些小的改进: 拉动时的缩进调整 增加了一项功能,即在没有相应的开括号时不插入 )。 调整输出到 REPL 的位置 在函数/文件编译过程中,将鼠标悬停在下划线部分会弹出信息 其他变化 还有许多其他改动,包括: 添加 var 和 defun,以便在保存时去除尾部的空白 增加了 json-mode 小的改动和大规模的重构,例如替换 lsp-mode、language-server 中使用的内部模块 大量的错误修复 更多详情可查看:https://github.com/lem-project/lem/releases/tag/v2.0.0

优秀的个人博客,低调大师

Fizz Gateway 2.6.6 发布,聚合高并发问题修复

v2.6.6 changelog: 修复服务编排步骤中并发处理接口响应结果的问题 修复异常数量包含4xx错误的问题 修复获取IP时取到本地IP的问题 修复MD5验签方式没有校验时间戳的问题 支持Redis集群 Fix concurrent processing issue of multiple requests of aggregation step Fix the issue that the number of exceptions contains 4xx errors Fix the issue that a local IP address is obtained while obtaining server IP Fix the issue that MD5 signature does not check the timestamp Support configuring Redis cluster Fizz Gateway是什么? An Aggregation API Gateway in Java . Fizz Gateway 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。 演示环境(Demo) http://demo.fizzgate.com/ 账号/密码:admin/Aa123! 健康检查地址:http://demo.fizzgate.com/admin/health(线上版本请限制admin路径的外网访问) API地址:http://demo.fizzgate.com/proxy/[服务名]/[API_Path] Fizz的设计 Fizz典型应用场景 产品特性 集群管理:Fizz网关节点是无状态的,配置信息自动同步,支持节点水平拓展和多集群部署。 安全授权:支持内置的key-auth, JWT, basic-auth授权方式,并且可以方便控制。 服务编排:支持HTTP、Dubbo、gRPC、Soap协议热服务编排能力,支持前后端编码,支持JSON/XML输出,随时随地更新API。 负载均衡:支持round-robin负载均衡。 多注册中心:支持从Eureka或Nacos注册中心进行服务发现。 配置中心:支持接入apollo配置中心。 HTTP反向代理:隐藏真实后端服务,支持 Rest API反向代理。 访问策略:支持不同策略访问不同的API、配置不同的鉴权等。 IP黑白名单:支持配置IP黑白名单。 自定义插件:强大的插件机制支持自由扩展。 可扩展:简单易用的插件机制方便扩展功能。 高性能:性能在众多网关之中表现优异。 版本控制:支持操作的发布和多次回滚。 管理后台:通过管理后台界面对网关集群进行各项配置。 回调管理:支持回调的管理、订阅、重放、以及日志。 多级限流:细颗粒度的限流方式包含服务限流,接口限流,APP_ID限流,IP限流。 微服务文档:企业级管理开放微服务文档管理,系统集成更方便。 公网专线:建立公网中受到完全保护的私有连接通道。 策略熔断:根据服务或者具体地址进行多种恢复策略熔断配置。 基准测试 我们将Fizz与市面上主要的网关产品进行比较,使用相同的环境和条件,测试对象均为单个节点。Mock接口模拟20ms时延,报文大小约2K。 Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz * 4 Linux version 3.10.0-957.21.3.el7.x86_64 8G RAM 分类 产品 600并发 QPS 600并发 90% Latency(ms) 1000并发 QPS 1000并发 90% Latency(ms) 后端服务 直接访问后端服务 23540 32.19 27325 52.09 流量网关 kong v2.4.1 15662 50.87 17152 84.3 应用网关 fizz-gateway-community v2.0.0 12206 65.76 12766 100.34 应用网关 spring-cloud-gateway v2.2.9 11323 68.57 10472 127.59 应用网关 shenyu v2.3.0 9284 92.98 9939 148.61 版本对照 Fizz-gateway-community: 社区版 Fizz-manager-professional:管理后台专业版(服务端) Fizz-admin-professional:管理后台专业版(前端) Fizz-gateway-community Fizz-manager-professional Fizz-admin-professional v1.0.0 v1.0.0 v1.0.0 v1.1.0 v1.1.0 v1.1.0 v1.1.1 v1.1.1 v1.1.1 v1.2.0 v1.2.0 v1.2.0 从v1.3.0开始管理后台的前端和服务端合并成一个包 Fizz-gateway-community: 社区版 Fizz-manager-professional:管理后台 Fizz-gateway-community Fizz-manager-professional v1.3.0 v1.3.0 v1.4.0 v1.4.0 v1.4.1 v1.4.1 v1.5.0 v1.5.0 v1.5.1 v1.5.1 v2.0.0 v2.0.0 v2.1.0 v2.1.0 v2.2.0 v2.2.0 v2.2.1 v2.2.1 v2.2.3 v2.2.3 v2.3.0 v2.3.0 v2.3.2 v2.3.2 v2.3.3 v2.3.3 v2.4.0 v2.4.0 v2.4.1 v2.4.1 v2.5.0 v2.5.0 v2.5.1 v2.5.1 v2.5.2 v2.5.2 v2.6.0 v2.6.0 v2.6.1 v2.6.1 v2.6.2 v2.6.2 v2.6.3 v2.6.3 v2.6.4 v2.6.4 v2.6.5 v2.6.5 v2.6.6 v2.6.6 请根据社区版的版本下载对应的管理后台版本 部署说明 详细部署教程>>> 安装依赖 安装以下依赖软件: Redis 2.8或以上版本 MySQL 5.7或以上版本 Apollo配置中心 (可选) Eureka或Nacos服务注册中心(可选) 依赖的安装可参考详细部署教程 安装Fizz 一、安装管理后台 从github的releases(https://wj.qq.com/s2/8682608/8fe2/) 下载 fizz-manager-professional 安装包 管理后台(fizz-manager-professional) 说明: 以下安装步骤出现的{version}表示所使用管理后台的版本号,例如1.3.0。 安装方式一:二进制安装包 解压fizz-manager-professional-{version}.zip安装包 首次安装执行fizz-manager-professional-{version}-mysql.sql数据库脚本,从低版本升级至高版本选择执行update目录下对应升级脚本 修改application-prod.yml文件,将相关配置修改成部署环境的配置 Linux启动 执行chmod +x boot.sh命令给boot.sh增加执行权限;执行./boot.sh start命令启动服务,支持 start/stop/restart/status命令 Windows启动 执行.\boot.cmd start命令启动服务,支持 start/stop/restart/status命令 安装方式二(v2.0.0或以上版本):docker: 下载对应版本的镜像:docker pull fizzgate/fizz-manager-professional:{version} 通过环境变量方式修改redis配置、database配置(其它配置同理)并运行镜像 docker run --rm -d -p 8000:8000 \ -e "spring.redis.host={your redis host IP}" \ -e "spring.redis.port={your redis port}" \ -e "spring.redis.password={your redis password}" \ -e "spring.redis.database={your redis database}" \ -e "spring.datasource.url=jdbc:mysql://{your MySQL database host IP}:3306/fizz_manager?useSSL=false&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&transformedBitIsBoolean=true&serverTimezone=GMT%2B8&nullCatalogMeansCurrent=true&allowPublicKeyRetrieval=true" \ -e "spring.datasource.username={your MySQL database username}" \ -e "spring.datasource.password={your MySQL database password}" \ fizzgate/fizz-manager-professional:{version} 或通过映射目录方式使用外部配置文件和输出日志到宿主机, 配置文件可从安装包里获取,在宿主机创建fizz-manager-professional/config和fizz-manager-professional/logs目录,把application-prod.yml配置文件放置config下,在fizz-manager-professional目录下运行镜像 cd fizz-manager-professional docker run --rm -d -p 8000:8000 \ -v $PWD/config:/opt/fizz-manager-professional/config \ -v $PWD/logs:/opt/fizz-manager-professional/logs fizzgate/fizz-manager-professional:{version} 服务启动后访问 http://{部署机器IP地址}:8000/#/login,使用超级管理员账户admin密码Aa123!登录 二、安装fizz-gateway-community社区版 说明: 支持配置中心:apollo、nacos,支持注册中心:eureka、nacos,详细配置方法查看application.yml文件。 如果使用apollo配置中心,可把application.yml文件内容迁到配置中心(apollo上应用名为:fizz-gateway);如果不使用apollo可去掉下面启动命令里的apollo参数。 以下安装步骤出现的{version}表示所使用网关的版本号,例如1.3.0。 安装方式一:二进制安装包 下载fizz-gateway-community的二进制安装包,解压修改application.yml配置文件里配置中心、注册中心、redis(redis配置需与管理后台一致)的配置 根据需要修改boot.sh脚本的apollo连接,不使用apollo配置中心可跳过 Linux启动 执行./boot.sh start命令启动服务,支持 start/stop/restart/status命令 Windows启动 执行.\boot.cmd start命令启动服务,支持 start/stop/restart/status命令 安装方式二:源码安装: 本地clone仓库上的最新代码,修改application.yml配置文件里配置中心、注册中心、redis(redis配置需与管理后台一致)的配置 在项目根目录fizz-gateway-community下执行Maven命令mvn clean package install -DskipTests=true 在项目目录fizz-gateway-community/fizz-bootstrap下执行Maven命令mvn clean package -DskipTests=true 进入fizz-gateway-community/fizz-bootstrap/target/fizz-gateway-community目录,执行./boot.sh start命令启动服务,支持 start/stop/restart/status命令 安装方式三(v2.0.0或以上版本):docker: 下载对应版本的镜像:docker pull fizzgate/fizz-gateway-community:{version} 通过环境变量方式修改redis配置(其它配置同理)并运行镜像 docker run --rm -d -p 8600:8600 \ -e "aggregate.redis.host={your redis host IP}" \ -e "aggregate.redis.port={your redis port}" \ -e "aggregate.redis.password={your redis password}" \ -e "aggregate.redis.database={your redis database}" \ fizzgate/fizz-gateway-community:{version} 或通过映射目录方式使用外部配置文件和输出日志到宿主机, 配置文件可从安装包或源码里获取,在宿主机创建fizz-gateway-community/config和fizz-gateway-community/logs目录,把application.yml和log4j2-spring.xml配置文件放置config下,在fizz-gateway-community目录下运行镜像 cd fizz-gateway-community docker run --rm -d -p 8600:8600 \ -v $PWD/config:/opt/fizz-gateway-community/config \ -v $PWD/logs:/opt/fizz-gateway-community/logs fizzgate/fizz-gateway-community:{version} 最后访问网关,地址形式为:http://127.0.0.1:8600/proxy/[服务名]/[API_Path]

优秀的个人博客,低调大师

Antrea v1.2.0 版本发布:支持 Egress 高可用

引言 Antrea 项目是一个基于 Open vSwitch(OVS)的开源 Kubernetes CNI 网络解决方案,旨在为 Kubernetes 集群提供更高效、更安全的跨平台网络和安全策略。Antrea Github 地址:https://github.com/antrea-io/antrea 北京时间2021年07月16日,Antrea发布了新版本v1.2.0。NetworkPolicyStats 功能从 Alpha 升级到 Beta,因此默认启用。Antrea v1.2.0 Release文档:https://github.com/antrea-io/antrea/releases/tag/v1.2.0 新增特性 本次发布的1.2.0版本新特性包括: 添加新的 ExternalIPPool API 以定义可用作出口 SNAT IP 的 IP 地址范围;这些 IP 根据 nodeSelector 分配给节点,并在节点出现故障时自动故障转移;(#2236#2237 #2186 #2358 #2345 #2371,@tnqn @wenqiq) 有关更多信息,请参阅AntreaEgress 用户指南 在 Linux 上基于OpenFlow meters对OVS 数据面发送到 Antrea Agent的 PacketIn 消息进行限速;(#2215,@GraysonWu @antoninbas) 从 FlowAggregator 导出流记录时,为源和目标 Pod(如果适用)添加 K8s 标签作为 IPFIX 信息元素;(#2240,@dreamtalen) 使用antctl命令(antctl get featuregates)查看 Antrea Agent或Antrea Controller FeatureGates信息;(#2082,@luolanzone) Antrea Octant 插件支持重新运行最近一次 Traceflow 请求;(#2202,@Dhruv-J) 支持为 Pod 配置额外的SR-IOV网络接口(这些接口没有连接到 OVS 网桥),相应的用户API将在接下来的版本中提供。(#2151,@ramay1) 亮点一:更灵活的Egress IP 配置,支持Egress节点故障转移 添加新的 ExternalIPPool API 以定义可用作出口SNAT IP 的 IP地址范围;这些 IP 根据 nodeSelector 分配给节点,并在节点出现故障时支持故障转移; Egress资源是用来管理集群内Pods的出口流量的CRD API。它支持为Pod访问外部网络的流量指定出口IP(SNAT IP)和出口节点。当Egress应用于某个Pod时,它的出口流量将通过隧道传输到配置有对应Egress IP的节点(如果Egress IP所在的节点不同于Pod运行的节点的话),并经过SNAT将数据包源地址转换为Egress IP。 示例: 创建一个external IPPool,命名为external-ip-pool,指定其可用IP范围,且nodeSelector只选定“kind-worker2”: - apiVersion: crd.antrea.io/v1alpha2 kind: ExternalIPPool metadata: name: external-ip-pool spec: ipRanges: - start: 10.10.0.11 # 10.10.0.11-10.10.0.20 can be used as Egress IPs end: 10.10.0.20 nodeSelector: matchExpressions: - key: kubernetes.io/hostname operator: In values: ["kind-worker2"] 创建Egress,命名为egress-prod-web,指定其external IPPool为刚创建的external-ip-pool: apiVersion: crd.antrea.io/v1alpha2kind: Egressmetadata: name: egress-prod-webspec: appliedTo: namespaceSelector: matchLabels: kubernetes.io/metadata.name: prod podSelector: matchLabels: app: web externalIPPool: external-ip-pool 查看Egress列表,看到系统在external-ip-pool指定的IP范围内自动为Egress分配了IP,并且将IP自动配置到了指定的节点“kind-worker2”: # kubectl get egressNAME EGRESSIP AGE NODEegress-prod-web 10.10.0.11 1m kind-worker2 更详细的指导文档请参考:https://github.com/antrea-io/antrea/blob/v1.2.0/docs/egress.md 亮点二:在 Linux 上使用 OpenFlow 计量器实现packet-in报文限速 在Linux上使用OpenFlow计量器, OVS 数据路径发送到Antrea agent的PacketIn消息进行速率限制。 亮点三:在流记录中添加 Pod 标签信息 从FlowAggregator导出流记录时,为源和目标Pod(如果适用)添加 K8s 标签作为IPFIX信息元素;标签信息是网络策略推荐应用所必需的,还可以增强Kibana 仪表板上的可用性。 亮点四:使用“antctl get featuregates”命令查看特性启用 使用 antctl 命令(“antctl get featuregates”)打印 Antrea Agent 和/或 Antrea Controller FeatureGates信息; 示例: # antctl get featuregatesAntrea Agent Feature GatesFEATUREGATE STATUS VERSIONAntreaProxy Enabled BETAEgress Disabled ALPHAEndpointSlice Disabled ALPHATraceflow Enabled BETAFlowExporter Disabled ALPHANetworkPolicyStats Disabled ALPHANodePortLocal Disabled ALPHAAntreaPolicy Enabled BETA Antrea Controller Feature GatesFEATUREGATE STATUS VERSIONNetworkPolicyStats Disabled ALPHAAntreaPolicy Enabled BETAEgress Disabled ALPHATraceflow Enabled BETA 其他修改 新版本除了以上新特性外,还包括以下修改: 在 Service 上启用 NodePortLocal 时,使用 Service 的目标端口而不是所选 Pod 的(可选)容器端口来确定如何为 Pod 配置端口转发。(#2222,@monotosh-avi) 更新go-ipfix依赖项的版本以提高 FlowExporter 性能。(#2129,@zyiou) 根据我们的 API 弃用策略删除弃用的API版本networking.antrea.tanzu.vmware.com/v1beta1。(#2265,@hangyan) 当 Antrea 在 OVS 中执行 SNAT 时,在Traceflow observations中显示转换的源 IP 地址。(#2227,@luolanzone) 从 FlowAggregator 导出的流记录中删除不必要的 IPFIX 信息元素:“originalExporterIPv4Address”、“originalExporterIPv6Address”和“originalObservationDomainId”。(#2361,@zyiou) NodePortLocal 忽略非 TCP 服务端口,更新文档中关于支持协议的限制。(#2396,@antoninbas) 使用 OVS 用户空间数据路径(KinD集群)时,在 PREROUTING(使用 iptables)中丢弃上行链路接收到的数据包,以防止节点的TCP/IP协议栈处理这些数据包。(#2143,@antoninbas) 改进Antrea原生网络策略文档,添加关于 Antrea v1.1 ClusterNetworkPolicy API 引入的“namespace”字段的介绍。(#2271,@abhiraut) 问题修复 新版本还包括以下问题修复: 修复禁用 AntreaProxy 时的节点间 ClusterIP 服务访问问题。(#2318,@tnqn) 修复在双栈集群中使用 IPv4 和 IPv6 Service组合时 AntreaProxy 中重复的组 ID 分配,这导致了Service连接问题。(#2317,@hongliangl) 修复同时启用AntreaProxy和Egress 时节点内 ClusterIP 服务访问问题。(#2332,@tnqn) 修复大规模集群中GroupEntityIndex(在 Antrea Controller 中)初始化时的死锁;这导致了 NetworkPolicies不能正确分发和执行。(#2376,@tnqn) 修复包含空“From”字段(对于入口规则)或空“To”字段(对于出口规则)的ClusterNetworkPolicy的处理。(#2383,@Dyanngg) 在 Windows 上使用“os/exec”包替换第三方库来运行 PowerShell 命令配置主机网络,以解决第三方库存在的goroutine卡住的问题。(#2363,@lzhecheng) [Windows] 修复 Docker作为Windows节点的runtime时HNS Endpoint 在Pod被删除时没有被清理的问题。(#2306,@wenyingd) [Windows] 修复Windows节点上为Pod创建网络时访问HNS Network存在的race condition。(#2253,@tnqn)[Windows] 修复了向 OVS 发送 PacketOut 消息时的校验和计算错误。(#2273,@Dyanngg) 修复了 controlplane API 的内部和版本化类型之间的无效转换函数,这会导致JSON编码错误。(#2302,@tnqn) 修复了旧版“controlplane.antrea.tanzu.vmware.com”API 的 v1beta1 版本的实现:API 错误地使用了一些 v1beta2 类型,并且缺少一些字段选择器。(#2305,@tnqn) 验证创建HNSNetwork时自动发现的上行链路网卡不是虚拟网卡,并在验证失败时输出更友好的错误日志。(#2246,@tnqn)[Windows] 为 NodePortLocal 分配主机端口时,首先确保该端口可用并通过监听该端口来保留它。(#2385,@antoninbas) 将 NodePortLocal 的默认端口范围更改为 61000-62000,以避免与 Linux 上的默认ip_local_port_range 冲突。(#2382,@antoninbas) 将NamespaceIndex 添加到 NodePortLocal Controller 的PodInformer以避免错误日志提示和慢查询。(#2377,@tnqn) 当mutating webhook处理Antrea原生网络策略时,仅在“Patch”内容不为空时设置响应内容中的“PatchType”字段,否则响应会被认为无效。(#2295,@Dyanngg) 修复 FlowAggregator 中的“egressNetworkPolicyRuleAction”IPFIX 信息元素。(#2228,@zyiou) 修复Antrea Octant 插件中访问Traceflow 状态存在的race condition(在多个浏览器会话的情况下)。(#2261,@antoninbas) 删除从 Antrea agent调用ovs-appctl时只存在单个ovs-vswitchd.ctl 文件的假设。(#2260,@antoninbas) 修复antrea/antrea-ubuntu Docker镜像中whereabouts二进制文件权限问题。(#2353,@antoninbas) 致谢 随着v1.2.0版本的发布,Antrea提供了更完备的Egress功能,更加友好便捷的用户体验。 社区的繁荣离不开贡献者的支持,感谢每一位社区贡献者! https://github.com/abhiraut https://github.com/antoninbas https://github.com/Dhruv-J https://github.com/dreamtalen https://github.com/Dyanngg https://github.com/hangyan https://github.com/hongliangl https://github.com/luolanzone https://github.com/lzhecheng https://github.com/monotosh-avi https://github.com/ramay1 https://github.com/tnqn https://github.com/wenyingd https://github.com/wenqiq https://github.com/zyiou 关于 Antrea Antrea项目是一个基于 Open vSwitch(OVS)的开源 Kubernetes CNI 网络解决方案,旨在为 Kubernetes 集群提供更高效、更安全的跨平台网络和安全策略。 2021年4月28日,经云原生计算基金会(CNCF)技术监督委员会(TOC)投票决议,Antrea成为CNCF沙箱级项目(Sandbox Project)。 GitHub:https://github.com/antrea-io/antrea 官网:https://antrea.io

优秀的个人博客,低调大师

Solus 4.3 发布,高颜值 Linux 发行版

Solus 4.3 已发布,此版本带来了桌面环境的更新、新的软件堆栈和硬件支持。 Solus 4.3 采用了 Linux 5.13.1 内核,可为更广泛的硬件提供支持,例如: AMD Radeon RX 6700 XT、6800、6800 XT 和 6900 XT 显卡 用于 Elkhart Lake 平台和带有 DA7219 + MAX98373/MAX98360A I2S 音频编解码器的 ASoC 机器驱动程序 通过 X86_PLATFORM_DRIVERS_DELL 支持面向 Dell X86 平台特定的驱动程序,例如供应商特定的笔记本电脑扩展驱动程序 通过 SENSORS_NZXT_KRAKEN2 对 NZXT Kraken X42/X52/X62/X72 一体式 CPU 液体冷却器进行硬件监控 通过 NET_VENDOR_MICROSOFT 支持 Microsoft 网络设备 用于 Elkhart Lake、Jasper Lake、Tiger Lake 的英特尔 ASoC 通过 HID_PLAYSTATION 支持索尼 PS5 控制器 补充对 Microsoft Surface 的支持,例如 CHARGER_SURFACE、SURFACE_ACPI_NOTIFY(Surface ACPI 通知 (SAN) 驱动程序)、SURFACE_DTX 和 SURFACE_HOTPLUG(具有热插拔 PCIe 卡的 Microsoft Surface 设备上的带外热插拔事件信号,更多详细信息请点击此处)。 通过 HID_SEMITEK 支持 SemiTek 键盘 此外,Solus 4.3 也继续完善其内核配置,此版本具有以下更改: 启用 CONFIG_NETFILTER_XT_TARGET_CHECKSUM 以改进 lxd 支持 启用 KVM guest 通过 X86_SGX_KVM 创建 SGX enclave 启用 VIRTIO SND 禁用 RT_GROUP_SCHED 以改进 JACK 支持 常用的软件包升级包括: Firefox 89.0.2 LibreOffice 7.1.4.2 Thunderbird 78.11.0 Mesa 21.1.3 ffmpeg 4.4 …… 桌面环境方面,Solus 4.3提供了最新版本的 Budgie / GNOME / MATE / KDE Plasma,并针对这些桌面环境提供了许多更新,例如 GNOME 桌面版本的 GNOME 升级到了最新的 GNOME 40.2。 详细更新内容和下载地址查看https://getsol.us/2021/07/11/solus-4-3-released/。 Solus 是从无到有创建的 Linux 发行版,可选择自产的 Budgie 桌面环境,或者 GNOME、MATE、KDE Plasma 作为桌面环境。它的包管理器 eopkg 基于来自 Pardus Linux 的 PiSi 包管理系统,并有着准滚动发行模式。 延伸阅读 Solus Linux 作者正在打造“真正现代化的 Linux 发行版”,不依赖 GNU

优秀的个人博客,低调大师

用K8S部署高可用NACOS集群

2 --> 我们先来单点部署NACOS服务: apiVersion: v1 kind: Service metadata: name: nacos namespace: {namespace} labels: app: nacos spec: ports: - protocol: TCP port: 8848 targetPort: 8848 name: nacos-http selector: app: nacos --- apiVersion: apps/v1 kind: StatefulSet metadata: name: nacos namespace: {namespace} spec: serviceName: nacos selector: matchLabels: app: nacos replicas: 1 template: metadata: labels: app: nacos spec: containers: - name: nacos image: nacos/nacos-server:2.0.1 resources: requests: memory: "1024Mi" cpu: "256m" limits: memory: "2048Mi" cpu: "512m" ports: - containerPort: 8848 name: nacos-http env: - name: MODE value: "standalone" 我们用集群的方式部署: 1.我们要准备好NFS服务器,建好PV和PVC apiVersion: v1 kind: Namespace metadata: name: {namespace} --- apiVersion: v1 kind: PersistentVolume metadata: name: nfs-pv-{namespace} labels: pv: nfs-pv-{namespace} annotations: volume.beta.kubernetes.io/mount-options: "noatime,nodiratime,noresvport,nolock,proto=udp,rsize=1048576,wsize=1048576,hard" spec: capacity: storage: 100Gi accessModes: - ReadWriteMany persistentVolumeReclaimPolicy: Retain nfs: path: /nfs/{namespace} server: 192.168.0.2 --- kind: PersistentVolumeClaim apiVersion: v1 metadata: name: nfs-pvc namespace: {namespace} spec: accessModes: - ReadWriteMany resources: requests: storage: 100Gi selector: matchLabels: pv: nfs-pv-{namespace} 2.准备好数据库,我们集群里面是有数据库,这里我就不做配置直接使用,只是导入数据库而已 数据库的地址: mysql 数据库名称: nacos 数据库的账号: root 数据库的密码: 123456 然后导入https://github.com/alibaba/nacos/blob/develop/distribution/conf/nacos-mysql.sql 3.创建配置文件 apiVersion: v1 kind: ConfigMap metadata: name: nacos-cm namespace: {namespace} data: mysql.db.name: "nacos" mysql.db.host: "mysql" mysql.port: "3306" mysql.user: "root" mysql.password: "123456" 4.创建部署文件 apiVersion: apps/v1 kind: StatefulSet metadata: name: nacos namespace: {namespace} spec: serviceName: nacos-headless selector: matchLabels: app: nacos replicas: 3 template: metadata: labels: app: nacos spec: initContainers: - name: peer-finder-plugin-install image: nacos/nacos-peer-finder-plugin:1.1 imagePullPolicy: Always volumeMounts: - mountPath: /home/nacos/plugins/peer-finder name: nacos-data subPath: peer-finder containers: - name: nacos image: nacos/nacos-server:2.0.1 resources: requests: memory: "1024Mi" cpu: "256m" limits: memory: "2048Mi" cpu: "512m" ports: - containerPort: 8848 name: nacos-http - containerPort: 9848 name: nacos-rpc - containerPort: 9849 name: raft-rpc - containerPort: 7848 name: old-raft-rpc env: - name: NACOS_REPLICAS value: "3" - name: SERVICE_NAME value: "nacos-headless" - name: DOMAIN_NAME value: "cluster.local" - name: POD_NAMESPACE valueFrom: fieldRef: apiVersion: v1 fieldPath: metadata.namespace - name: MYSQL_SERVICE_HOST valueFrom: configMapKeyRef: name: nacos-cm key: mysql.db.host - name: MYSQL_SERVICE_DB_NAME valueFrom: configMapKeyRef: name: nacos-cm key: mysql.db.name - name: MYSQL_SERVICE_PORT valueFrom: configMapKeyRef: name: nacos-cm key: mysql.port - name: MYSQL_SERVICE_USER valueFrom: configMapKeyRef: name: nacos-cm key: mysql.user - name: MYSQL_SERVICE_PASSWORD valueFrom: configMapKeyRef: name: nacos-cm key: mysql.password - name: NACOS_SERVER_PORT value: "8848" - name: NACOS_APPLICATION_PORT value: "8848" - name: PREFER_HOST_MODE value: "hostname" - name: NACOS_SERVERS value: "nacos-0.nacos-headless.{namespace}.svc.cluster.local:8848 nacos-1.nacos-headless.{namespace}.svc.cluster.local:8848 nacos-2.nacos-headless.{namespace}.svc.cluster.local:8848" volumeMounts: - name: nacos-data mountPath: /home/nacos/plugins/peer-finder subPath: peer-finder - name: nacos-data mountPath: /home/nacos/data subPath: data - name: nacos-data mountPath: /home/nacos/logs subPath: logs volumes: - name: nacos-data persistentVolumeClaim: claimName: nfs-pvc 5.创建服务 apiVersion: v1 kind: Service metadata: name: nacos-headless namespace: {namespace} labels: app: nacos annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" spec: ports: - protocol: TCP port: 8848 targetPort: 8848 name: nacos-http - protocol: TCP port: 9848 targetPort: 9848 name: nacos-rpc - protocol: TCP port: 9849 targetPort: 9849 name: raft-rpc - protocol: TCP port: 7848 targetPort: 7848 name: old-raft-rpc clusterIP: None selector: app: nacos --- apiVersion: v1 kind: Service metadata: name: nacos namespace: {namespace} labels: app: nacos annotations: service.alpha.kubernetes.io/tolerate-unready-endpoints: "true" spec: ports: - protocol: TCP port: 8848 targetPort: 8848 name: nacos-http - protocol: TCP port: 9848 targetPort: 9848 name: nacos-rpc - protocol: TCP port: 9849 targetPort: 9849 name: raft-rpc - protocol: TCP port: 7848 targetPort: 7848 name: old-raft-rpc selector: app: nacos 以上文章参考https://github.com/nacos-group/nacos-k8s 只是nacos-k8s这个里面有个坑,就是缺了 - name: MYSQL_SERVICE_HOST valueFrom: configMapKeyRef: name: nacos-cm key: mysql.db.host 同时为方便集群访问,我这里建立一个nacos服务直接访问集群 以上需要将{namespace}修改为自己的命名空间

优秀的个人博客,低调大师

高并发下如何保证接口的幂等性?

前言 接口幂等性问题,对于开发人员来说,是一个跟语言无关的公共问题。本文分享了一些解决这类问题非常实用的办法,绝大部分内容我在项目中实践过的,给有需要的小伙伴一个参考。 不知道你有没有遇到过这些场景: 有时我们在填写某些form表单时,保存按钮不小心快速点了两次,表中竟然产生了两条重复的数据,只是id不一样。 我们在项目中为了解决接口超时问题,通常会引入了重试机制。第一次请求接口超时了,请求方没能及时获取返回结果(此时有可能已经成功了),为了避免返回错误的结果(这种情况不可能直接返回失败吧?),于是会对该请求重试几次,这样也会产生重复的数据。 mq消费者在读取消息时,有时候会读取到重复消息(至于什么原因这里先不说,有兴趣的小伙伴,可以找我私聊),如果处理不好,也会产生重复的数据。 没错,这些都是幂等性问题。 接口幂等性是指用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。 这类问题多发于接口的: insert操作,这种情况下多次请求,可能会产生重复数据。 update操作,如果只是单纯的更新数据,比如:update user set status=1 where id=1,是没有问题的。如果还有计算,比如:update user set status=status+1 where id=1,这种情况下多次请求,可能会导致数据错误。 那么我们要如何保证接口幂等性?本文将会告诉你答案。 1. insert前先select 通常情况下,在保存数据的接口中,我们为了防止产生重复数据,一般会在insert前,先根据name或code字段select一下数据。如果该数据已存在,则执行update操作,如果不存在,才执行 insert操作。 该方案可能是我们平时在防止产生重复数据时,使用最多的方案。但是该方案不适用于并发场景,在并发场景中,要配合其他方案一起使用,否则同样会产生重复数据。我在这里提一下,是为了避免大家踩坑。 2. 加悲观锁 在支付场景中,用户A的账号余额有150元,想转出100元,正常情况下用户A的余额只剩50元。一般情况下,sql是这样的: updateuseramount=amount-100whereid=123; 如果出现多次相同的请求,可能会导致用户A的余额变成负数。这种情况,用户A来可能要哭了。于此同时,系统开发人员可能也要哭了,因为这是很严重的系统bug。 为了解决这个问题,可以加悲观锁,将用户A的那行数据锁住,在同一时刻只允许一个请求获得锁,更新数据,其他的请求则等待。 通常情况下通过如下sql锁住单行数据: select*fromuserid=123forupdate; 具体流程如下: 具体步骤: 多个请求同时根据id查询用户信息。 判断余额是否不足100,如果余额不足,则直接返回余额不足。 如果余额充足,则通过for update再次查询用户信息,并且尝试获取锁。 只有第一个请求能获取到行锁,其余没有获取锁的请求,则等待下一次获取锁的机会。 第一个请求获取到锁之后,判断余额是否不足100,如果余额足够,则进行update操作。 如果余额不足,说明是重复请求,则直接返回成功。 需要特别注意的是:如果使用的是mysql数据库,存储引擎必须用innodb,因为它才支持事务。此外,这里id字段一定要是主键或者唯一索引,不然会锁住整张表。 悲观锁需要在同一个事务操作过程中锁住一行数据,如果事务耗时比较长,会造成大量的请求等待,影响接口性能。此外,每次请求接口很难保证都有相同的返回值,所以不适合幂等性设计场景,但是在防重场景中是可以的使用的。在这里顺便说一下,防重设计和幂等设计,其实是有区别的。防重设计主要为了避免产生重复数据,对接口返回没有太多要求。而幂等设计除了避免产生重复数据之外,还要求每次请求都返回一样的结果。 3. 加乐观锁 既然悲观锁有性能问题,为了提升接口性能,我们可以使用乐观锁。需要在表中增加一个timestamp或者version字段,这里以version字段为例。 在更新数据之前先查询一下数据: selectid,amount,versionfromuserid=123; 如果数据存在,假设查到的version等于1,再使用id和version字段作为查询条件更新数据: updateusersetamount=amount+100,version=version+1whereid=123andversion=1; 更新数据的同时version+1,然后判断本次update操作的影响行数,如果大于0,则说明本次更新成功,如果等于0,则说明本次更新没有让数据变更。 由于第一次请求version等于1是可以成功的,操作成功后version变成2了。这时如果并发的请求过来,再执行相同的sql: updateusersetamount=amount+100,version=version+1whereid=123andversion=1; 该update操作不会真正更新数据,最终sql的执行结果影响行数是0,因为version已经变成2了,where中的version=1肯定无法满足条件。但为了保证接口幂等性,接口可以直接返回成功,因为version值已经修改了,那么前面必定已经成功过一次,后面都是重复的请求。 具体流程如下: 具体步骤: 先根据id查询用户信息,包含version字段 根据id和version字段值作为where条件的参数,更新用户信息,同时version+1 判断操作影响行数,如果影响1行,则说明是一次请求,可以做其他数据操作。 如果影响0行,说明是重复请求,则直接返回成功。 4. 加唯一索引 绝大数情况下,为了防止重复数据的产生,我们都会在表中加唯一索引,这是一个非常简单,并且有效的方案。 altertable`order`addUNIQUEKEY`un_code`(`code`); 加了唯一索引之后,第一次请求数据可以插入成功。但后面的相同请求,插入数据时会报Duplicate entry '002' for key 'order.un_code异常,表示唯一索引有冲突。 虽说抛异常对数据来说没有影响,不会造成错误数据。但是为了保证接口幂等性,我们需要对该异常进行捕获,然后返回成功。 如果是java程序需要捕获:DuplicateKeyException异常,如果使用了spring框架还需要捕获:MySQLIntegrityConstraintViolationException异常。 具体流程图如下: 具体步骤: 用户通过浏览器发起请求,服务端收集数据。 将该数据插入mysql 判断是否执行成功,如果成功,则操作其他数据(可能还有其他的业务逻辑)。 如果执行失败,捕获唯一索引冲突异常,直接返回成功。 5. 建防重表 有时候表中并非所有的场景都不允许产生重复的数据,只有某些特定场景才不允许。这时候,直接在表中加唯一索引,显然是不太合适的。 针对这种情况,我们可以通过建防重表来解决问题。 该表可以只包含两个字段:id和唯一索引,唯一索引可以是多个字段比如:name、code等组合起来的唯一标识,例如:susan_0001。 具体流程图如下: 具体步骤: 用户通过浏览器发起请求,服务端收集数据。 将该数据插入mysql防重表 判断是否执行成功,如果成功,则做mysql其他的数据操作(可能还有其他的业务逻辑)。 如果执行失败,捕获唯一索引冲突异常,直接返回成功。 需要特别注意的是:防重表和业务表必须在同一个数据库中,并且操作要在同一个事务中。 6. 根据状态机 很多时候业务表是有状态的,比如订单表中有:1-下单、2-已支付、3-完成、4-撤销等状态。如果这些状态的值是有规律的,按照业务节点正好是从小到大,我们就能通过它来保证接口的幂等性。 假如id=123的订单状态是已支付,现在要变成完成状态。 update`order`setstatus=3whereid=123andstatus=2; 第一次请求时,该订单的状态是已支付,值是2,所以该update语句可以正常更新数据,sql执行结果的影响行数是1,订单状态变成了3。 后面有相同的请求过来,再执行相同的sql时,由于订单状态变成了3,再用status=2作为条件,无法查询出需要更新的数据,所以最终sql执行结果的影响行数是0,即不会真正的更新数据。但为了保证接口幂等性,影响行数是0时,接口也可以直接返回成功。 具体流程图如下: 具体步骤: 用户通过浏览器发起请求,服务端收集数据。 根据id和当前状态作为条件,更新成下一个状态 判断操作影响行数,如果影响了1行,说明当前操作成功,可以进行其他数据操作。 如果影响了0行,说明是重复请求,直接返回成功。 主要特别注意的是,该方案仅限于要更新的表有状态字段,并且刚好要更新状态字段的这种特殊情况,并非所有场景都适用。 7. 加分布式锁 其实前面介绍过的加唯一索引或者加防重表,本质是使用了数据库的分布式锁,也属于分布式锁的一种。但由于数据库分布式锁的性能不太好,我们可以改用:redis或zookeeper。 鉴于现在很多公司分布式配置中心改用apollo或nacos,已经很少用zookeeper了,我们以redis为例介绍分布式锁。 目前主要有三种方式实现redis的分布式锁: setNx命令 set命令 Redission框架 每种方案各有利弊,具体实现细节我就不说了,有兴趣的朋友可以加我微信找我私聊。 具体流程图如下: 具体步骤: 用户通过浏览器发起请求,服务端会收集数据,并且生成订单号code作为唯一业务字段。 使用redis的set命令,将该订单code设置到redis中,同时设置超时时间。 判断是否设置成功,如果设置成功,说明是第一次请求,则进行数据操作。 如果设置失败,说明是重复请求,则直接返回成功。 需要特别注意的是:分布式锁一定要设置一个合理的过期时间,如果设置过短,无法有效的防止重复请求。如果设置过长,可能会浪费redis的存储空间,需要根据实际业务情况而定。 8. 获取token 除了上述方案之外,还有最后一种使用token的方案。该方案跟之前的所有方案都有点不一样,需要两次请求才能完成一次业务操作。 第一次请求获取token 第二次请求带着这个token,完成业务操作。 具体流程图如下: 第一步,先获取token。 第二步,做具体业务操作。 具体步骤: 用户访问页面时,浏览器自动发起获取token请求。 服务端生成token,保存到redis中,然后返回给浏览器。 用户通过浏览器发起请求时,携带该token。 在redis中查询该token是否存在,如果不存在,说明是第一次请求,做则后续的数据操作。 如果存在,说明是重复请求,则直接返回成功。 在redis中token会在过期时间之后,被自动删除。 以上方案是针对幂等设计的。 如果是防重设计,流程图要改改:

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册