首页 文章 精选 留言 我的

精选列表

搜索[高性能全文搜索引擎],共10000篇文章
优秀的个人博客,低调大师

OpenLiteSpeed – 开源版轻量高性能 WebServer 更新至 1.6.8

OpenLiteSpeed Web Server OpenLiteSpeed 是 LiteSpeed EnterPrise 的社区版本,相较 Nginx 很多扩展如 Brotli、nginx-cache-purge 等扩展,会因为更新的不及时导致对最新Stable版本的不支持,同时也没有企业级的保障。 而 OpenLiteSpeed 的组件有官方进行主要维护和更新,提供商用企业级的体验。 在性能上,LiteSpeed Tech 提供的 BenchMark 中,在 WordPress、Joomla、OpenCart、ModSecurity、小型静态文件、HTTP/2、HTTP/3 的测试上都比 Apache HTTPD 和 Nginx 有这更好的表现,这不仅仅是跑个 Hello World 而是进行一个完整的测试。 OLS 1.6.8 发布日期:2020-02-10 下载地址 预编译二进制包: https://openlitespeed.org/packages/openlitespeed-1.6.8.tgz 源码包: https://openlitespeed.org/packages/openlitespeed-1.6.8.src.tgz 新功能 自动删除过期的缓存内容以节省空间。 可选择跳过 Let's Encrypt 的重写处理。 更新缓存,仅为前端请求提供与 litespeed cache 相关的 header。 改进 修复了内部缓存管理器模块中的一些小问题。 REFRESH URI 缓存请求现在等同于陈旧的清理。 添加了针对URI陈旧清理的响应 header。 提高了缓存清除的准确性。 更新 更新 context 配置,当在目录中自动添加尾随“ /”到对应目录。 更新 lsup.sh 升级工具以添加对-e paramater标志的支持,仅用于升级二进制文件。 BUG修复 修复了未设置“ storagepath”配置设置时未调用缓存清理的问题。 修复了在极少数情况下解析重写规则时发生的崩溃错误。 参考消息:https://www.mf8.biz/ols-1-6-8/

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

JUC包中的分而治之策略-为提高性能而生

一、前言 本次分享我们来共同探讨JUC包中一些有意思的类,包含AtomicLong & LongAdder,ThreadLocalRandom原理。 二、AtomicLong & LongAdder 2.1 AtomicLong 类 AtomicLong是JUC包提供的原子性操作类,其内部通过CAS保证了对计数的原子性更新操作。 大家可以翻看源码发现内部是通过UnSafe(rt.jar)这个类的CAs操作来保证对内部的计数器变量 long value进行原子性更新的,比如JDK8中: public final long incrementAndGet() { return unsafe.getAndAddLong(this, valueOffset, 1L) + 1L; } 其中unsafe

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

C#高性能二进制序列化

二进制序列化可以方便快捷的将对象进行持久化或者网络传输,并且体积小、性能高,应用面甚至还要高于json的序列化;开始之前,先来看看dotcore/dotne自带的二进制序列化:C#中对象序列化和反序列化一般是通过BinaryFormatter类来实现的二进制序列化、反序列化的。 BinaryFormatter序列化: 1 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 2 3 System.IO.MemoryStream memStream = new System.IO.MemoryStream(); 4 5 serializer.Serialize(memStream, request); BinaryFormatter反序列化: 1 memStream.Position=0; 2 3 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer = 4 5 new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 6 7 object newobj = deserializer.Deserialize(memStream); 8 9 memStream.Close(); 10 11 return newobj; 用着多了就发现BinaryFormatter有很多地方不妥,下面就来数数这个序列化的“三宗罪”: 1.类名上面要加上[Serializable],不加不给序列化;正常的用法应该是序列化一个对象,不需的地方加上NonSerialized才合理吧; 2.序列化byte[]结果非常大,使用System.Text.Encoding.UTF8.GetString(bytes)查看下,发现里面有一大堆的元数据;对比看看google的protobuf,pb为什么在网络上应用的越来越多,这和他本身序列化完后体积小有着绝大部门的原因; 3.序列化对象需要完全一致,连类的命名空间都要相同,这点对于分面式开发的应用来说也是不可接受的; 既然BinaryFormatter不好用,那就只能动手自行实现一个解决上述问题的二进制序列化方案;首先去掉[Serializable]这个标签,接着主要是分析对象,并定义对象序列化后的数据结构;这里的想法是按长度加内容的方式来定义,举个例子:使用int作为长度,来保存一个int值,序列化完应该是:4,0,0,0,1,0,0,0这样的一组bytes,同理可以将int、short、long、float、double、datetime、enum、array、string、class、generic等按照这个格式进行序列化,这里主要使用的是BitConverter、反射等来实现序列化与反序列化; 序列化实现如下: 1 public static byte[] Serialize(object param) 2 { 3 List<byte> datas = new List<byte>(); 4 5 var len = 0; 6 7 byte[] data = null; 8 9 if (param == null) 10 { 11 len = 0; 12 } 13 else 14 { 15 if (param is string) 16 { 17 data = Encoding.UTF8.GetBytes((string)param); 18 } 19 else if (param is byte) 20 { 21 data = new byte[] { (byte)param }; 22 } 23 else if (param is bool) 24 { 25 data = BitConverter.GetBytes((bool)param); 26 } 27 else if (param is short) 28 { 29 data = BitConverter.GetBytes((short)param); 30 } 31 else if (param is int) 32 { 33 data = BitConverter.GetBytes((int)param); 34 } 35 else if (param is long) 36 { 37 data = BitConverter.GetBytes((long)param); 38 } 39 else if (param is float) 40 { 41 data = BitConverter.GetBytes((float)param); 42 } 43 else if (param is double) 44 { 45 data = BitConverter.GetBytes((double)param); 46 } 47 else if (param is DateTime) 48 { 49 var str = "wl" + ((DateTime)param).Ticks; 50 data = Encoding.UTF8.GetBytes(str); 51 } 52 else if (param is Enum) 53 { 54 var enumValType = Enum.GetUnderlyingType(param.GetType()); 55 56 if (enumValType == typeof(byte)) 57 { 58 data = new byte[] { (byte)param }; 59 } 60 else if (enumValType == typeof(short)) 61 { 62 data = BitConverter.GetBytes((Int16)param); 63 } 64 else if (enumValType == typeof(int)) 65 { 66 data = BitConverter.GetBytes((Int32)param); 67 } 68 else 69 { 70 data = BitConverter.GetBytes((Int64)param); 71 } 72 } 73 else if (param is byte[]) 74 { 75 data = (byte[])param; 76 } 77 else 78 { 79 var type = param.GetType(); 80 81 82 if (type.IsGenericType || type.IsArray) 83 { 84 if (TypeHelper.DicTypeStrs.Contains(type.Name)) 85 data = SerializeDic((System.Collections.IDictionary)param); 86 else if (TypeHelper.ListTypeStrs.Contains(type.Name) || type.IsArray) 87 data = SerializeList((System.Collections.IEnumerable)param); 88 else 89 data = SerializeClass(param, type); 90 } 91 else if (type.IsClass) 92 { 93 data = SerializeClass(param, type); 94 } 95 96 } 97 if (data != null) 98 len = data.Length; 99 } 100 datas.AddRange(BitConverter.GetBytes(len)); 101 if (len > 0) 102 { 103 datas.AddRange(data); 104 } 105 return datas.Count == 0 ? null : datas.ToArray(); 106 } View Code 反序列化实现如下: 1 public static object Deserialize(Type type, byte[] datas, ref int offset) 2 { 3 dynamic obj = null; 4 5 var len = 0; 6 7 byte[] data = null; 8 9 len = BitConverter.ToInt32(datas, offset); 10 offset += 4; 11 if (len > 0) 12 { 13 data = new byte[len]; 14 Buffer.BlockCopy(datas, offset, data, 0, len); 15 offset += len; 16 17 if (type == typeof(string)) 18 { 19 obj = Encoding.UTF8.GetString(data); 20 } 21 else if (type == typeof(byte)) 22 { 23 obj = (data); 24 } 25 else if (type == typeof(bool)) 26 { 27 obj = (BitConverter.ToBoolean(data, 0)); 28 } 29 else if (type == typeof(short)) 30 { 31 obj = (BitConverter.ToInt16(data, 0)); 32 } 33 else if (type == typeof(int)) 34 { 35 obj = (BitConverter.ToInt32(data, 0)); 36 } 37 else if (type == typeof(long)) 38 { 39 obj = (BitConverter.ToInt64(data, 0)); 40 } 41 else if (type == typeof(float)) 42 { 43 obj = (BitConverter.ToSingle(data, 0)); 44 } 45 else if (type == typeof(double)) 46 { 47 obj = (BitConverter.ToDouble(data, 0)); 48 } 49 else if (type == typeof(decimal)) 50 { 51 obj = (BitConverter.ToDouble(data, 0)); 52 } 53 else if (type == typeof(DateTime)) 54 { 55 var dstr = Encoding.UTF8.GetString(data); 56 var ticks = long.Parse(dstr.Substring(2)); 57 obj = (new DateTime(ticks)); 58 } 59 else if (type.BaseType == typeof(Enum)) 60 { 61 var numType = Enum.GetUnderlyingType(type); 62 63 if (numType == typeof(byte)) 64 { 65 obj = Enum.ToObject(type, data[0]); 66 } 67 else if (numType == typeof(short)) 68 { 69 obj = Enum.ToObject(type, BitConverter.ToInt16(data, 0)); 70 } 71 else if (numType == typeof(int)) 72 { 73 obj = Enum.ToObject(type, BitConverter.ToInt32(data, 0)); 74 } 75 else 76 { 77 obj = Enum.ToObject(type, BitConverter.ToInt64(data, 0)); 78 } 79 } 80 else if (type == typeof(byte[])) 81 { 82 obj = (byte[])data; 83 } 84 else if (type.IsGenericType) 85 { 86 if (TypeHelper.ListTypeStrs.Contains(type.Name)) 87 { 88 obj = DeserializeList(type, data); 89 } 90 else if (TypeHelper.DicTypeStrs.Contains(type.Name)) 91 { 92 obj = DeserializeDic(type, data); 93 } 94 else 95 { 96 obj = DeserializeClass(type, data); 97 } 98 } 99 else if (type.IsClass) 100 { 101 obj = DeserializeClass(type, data); 102 } 103 else if (type.IsArray) 104 { 105 obj = DeserializeArray(type, data); 106 } 107 else 108 { 109 throw new RPCPamarsException("ParamsSerializeUtil.Deserialize 未定义的类型:" + type.ToString()); 110 } 111 112 } 113 return obj; 114 } View Code 其他详细的代码可以查看ParamsSerializeUtil.cs 功能基本实现了,下面对比一下10000次的实体序列化与反序列化测试结果: 实体代码: 1 var groupInfo = new GroupInfo() 2 { 3 GroupID = 1, 4 IsTemporary = false, 5 Name = "yswenli group", 6 Created = DateTimeHelper.Now, 7 Creator = new UserInfo() 8 { 9 10 ID = 1, 11 Birthday = DateTimeHelper.Now.AddYears(-100), 12 UserName = "yswenli" 13 }, 14 Users = new System.Collections.Generic.List<UserInfo>() 15 { 16 new UserInfo() 17 { 18 19 ID = 1, 20 Birthday = DateTimeHelper.Now.AddYears(-100), 21 UserName = "yswenli" 22 } 23 } 24 }; 测试代码: 1 public static byte[] SerializeBinary(object request) 2 { 3 4 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter serializer = 5 6 new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 7 8 using (System.IO.MemoryStream memStream = new System.IO.MemoryStream()) 9 { 10 serializer.Serialize(memStream, request); 11 12 return memStream.ToArray(); 13 } 14 } 15 16 17 public static object DeSerializeBinary(byte[] data) 18 { 19 using (System.IO.MemoryStream memStream = new System.IO.MemoryStream(data)) 20 { 21 System.Runtime.Serialization.Formatters.Binary.BinaryFormatter deserializer = 22 23 new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter(); 24 25 return deserializer.Deserialize(memStream); 26 } 27 } 28 29 static void SerializeTest() 30 { 31 var groupInfo = new GroupInfo() 32 { 33 GroupID = 1, 34 IsTemporary = false, 35 Name = "yswenli group", 36 Created = DateTimeHelper.Now, 37 Creator = new UserInfo() 38 { 39 40 ID = 1, 41 Birthday = DateTimeHelper.Now.AddYears(-100), 42 UserName = "yswenli" 43 }, 44 Users = new System.Collections.Generic.List<UserInfo>() 45 { 46 new UserInfo() 47 { 48 49 ID = 1, 50 Birthday = DateTimeHelper.Now.AddYears(-100), 51 UserName = "yswenli" 52 } 53 } 54 }; 55 56 var count = 100000; 57 var len1 = 0; 58 var len2 = 0; 59 60 Stopwatch sw = new Stopwatch(); 61 sw.Start(); 62 63 List<byte[]> list = new List<byte[]>(); 64 for (int i = 0; i < count; i++) 65 { 66 var bytes = SerializeBinary(groupInfo); 67 len1 = bytes.Length; 68 list.Add(bytes); 69 } 70 ConsoleHelper.WriteLine($"BinaryFormatter实体序列化平均:{count * 1000 / sw.ElapsedMilliseconds} 次/秒"); 71 72 sw.Restart(); 73 for (int i = 0; i < count; i++) 74 { 75 var obj = DeSerializeBinary(list[i]); 76 } 77 ConsoleHelper.WriteLine($"BinaryFormatter实体反序列化平均:{count * 1000 / sw.ElapsedMilliseconds} 次/秒"); 78 ConsoleHelper.WriteLine($"BinaryFormatter序列化生成bytes大小:{len1 * count * 1.0 / 1024 / 1024} Mb"); 79 list.Clear(); 80 sw.Restart(); 81 82 for (int i = 0; i < count; i++) 83 { 84 var bytes = RPC.Serialize.ParamsSerializeUtil.Serialize(groupInfo); 85 len2 = bytes.Length; 86 list.Add(bytes); 87 } 88 ConsoleHelper.WriteLine($"ParamsSerializeUtil实体序列化平均:{count * 1000 / sw.ElapsedMilliseconds} 次/秒"); 89 sw.Restart(); 90 for (int i = 0; i < count; i++) 91 { 92 int os = 0; 93 94 var obj = RPC.Serialize.ParamsSerializeUtil.Deserialize(groupInfo.GetType(), list[i], ref os); 95 } 96 ConsoleHelper.WriteLine($"ParamsSerializeUtil实体反序列化平均:{count * 1000 / sw.ElapsedMilliseconds} 次/秒"); 97 ConsoleHelper.WriteLine($"ParamsSerializeUtil序列化生成bytes大小:{len2 * count * 1.0 / 1024 / 1024} Mb"); 98 sw.Stop(); 99 } View Code 运行结果: 感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是yswenli 。

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

高性能网络通信框架Netty-基础概念篇

一、前言 Netty是一种可以轻松快速的开发协议服务器和客户端网络应用程序的NIO框架,它大大简化了TCP或者UDP服务器的网络编程,但是你仍然可以访问和使用底层的API,Netty只是对其进行了高层的抽象。 Netty的简易和快速开发并不意味着由它开发的程序将失去可维护性或者存在性能问题。Netty是被精心设计的,它的设计参考了许多协议的实现,比如FTP,SMTP,HTTP和各种二进制和基于文本的传统协议,因此 Netty成功的实现了兼顾快速开发,性能,稳定性,灵活性为一体,不需要为了考虑一方面原因而妥协其他方面。 二、基础概念 Channel也就是通道,这个概念是在JDK NIO类库里面提供的一个概念,JDK中其实现类有客户端套接字通道java.nio.channels.SocketChannel和服务端监听套接字通道java.nio

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

MySQL高性能主从架构的复制原理及配置详解

MySQL Replication mysql的复制: 1:复制是什么? 复制是一种能力,将MySQL的数据分布到多个系统上去,这种分布的机制,是通过将MySQL的某一台主机的数据COPY到其它主机上, 并重新执行一遍来实现的。 @@mysql复制是其自带的,从某种程度上来讲,能够架构高可用的MySQL系统 ---------------------------------------------------------------- 2:实现的机制或说是原理: 主从架构: 一主多从的架构: @@其修改的操作只能在主服务器上 主主架构: @@可以有效避免一个主服务器的压力 环状主架构: @@几台服务器互相COPY 一主从从架构: @@一台主服务器,一台从服务器后还可以跟n台从服务器。 -------------------------------------- 其架构还支持,将一台主服务器的部分数据复制到一台从服务器上,将另外一部分的数据复制到另一台的从服务器上。 @@此种机制要通过 Filter,过滤来实现。 -------------------------------------------------------- 3:mysql的复制的类型: (1):基于语句的复制:(其执行的时间有所差别,用户也有所差别) @@在主服务器上执行的SQL语句,在从服务器上同样的执行的一边。 @@mysql默认采用基于语句的复制,效率比较高。一旦发现没法精确复制时,会自动选着基于行的复制。 (2):基于行的复制:把改变的内容复制过去,而不是把命令在从服务器上执行一遍 @@ 从mysql5.0开始支持 (3):混合类型的复制 @@默认采用基于语句的复制,一旦发现基于语句的无法精确的复制时,就会采用基于行的复制。 ------------------------------------------------------------------------------------------------------------ 4: mysql默认情况下只能为读提供扩展功能操作,而不能为写操作提供扩展功能。 单主服务器,在写操作比较多的情况下可能成为整个系统架构的瓶颈的。 ------------------------------------------------------------------------------- 5:主从架构解决的问题 Problems Solved by Replicaton,也是从服务器带来的好处。 Data distribution 数据的分布 Load balancin 负载均衡(Mainly for Read) Backups 用从服务器来实现备份 High availability and failover 高可用和故障转移的功能 Testing MySQL upgrades 测试MySQL软件的升级 -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 6:主从架构工作的原理: 主服务器上每一个数据的修改,都会记录在二进制日志(Binary log)中去, 因此只要能够得到其二进制文件在从服务器上执行一遍就可以了。 从服务器上启动了一个进程-I/O thread 远程连接到主服务器上去。 并请求读取主服务器的二进制日志文件。把其二进制文件的内容都复制过来 保存到从服务器的中继日志文件(Relay log)中去。 从服务器一旦发现,中继日志中更新了,就启动一个新的线程SQL thread 这个线程会从中继日志文件中读取从主服务器上复制过来的,改变数据库的 每一个操作,并在当前服务器上从新应用一遍,或说是执行一遍。 @@二进制日志不能让人随便能够读取,有两个特殊的权限Replication Client,Replication Slave 这两个权限限定了,除了复制二进制日志,读取二进制日志文件相关信息的权限,没有任何的权限。 因此需要在主服务器上建立一个这样的用户,并在从服务器上使用。 @@如果我们的主从架构跨域互联网,且复制的过程是明文的,因此在Internet上传输,别人完全可以 抓包的形式,获取相关的数据。但复制是支持SSL的,所以要加密。 @@mysql服务器的ServerID默认情况都是1,为了避免循环复制,我们需要手动修改mysql的主配置文件 可以把从服务器的ServerID的修改为2,3,4,...... ------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------- 7:建立主从架构的规划: 主服务器: 启动二进制日志文件 修改ServerID 建立一个用户,具有那两个特殊权限 从服务器: 修改ServerID 启动中继日志(Relay log) 连接到主服务器 ------------------------------------------------------------------------------------------- 配置主服务器:Configuring the Master (1) The server ID is uesd to distinguish two servers from each other (2) To set up the binary log and server ID ,you have to take the server down and add the log-bin,log-bin-index,and server-id options to the my.cnf configuration file log-bin: 二进制日志,其默认值on,代表着启用二进制日志,它的文件名默认是主机名+000001的形式,随主机名的改变 ,二进制日志名也得改变。所以要设定一个固定的名字给它。不用给它指后缀的,系统自加的。 log-bin-index:此文件包含了当前系统被使用的所有的二进制日志文件。 server-id: @@此定义是在my.cnf的[mysqld]字段定义 --------------------------------------------------------------------------------------------- 创建一个数据库用户: mysql> GRANT REPLICATION SLAVE,REPLICATION CLIENT ON *.* TOrepl@'192.168.0.%'IDENTIFIED BY 'password'; --------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------- 配置从服务器:Configuring the Slave (1) As with the master server,you need to assign each slave a unique server ID (2) You may also want to consider adding the names of the Relay Log and the Realy Log index files to the my.cnf file using the options relay-log and relay-log-index. ---------------------------------------------------------------------------------------------- (3)连接到主服务器上: mysql> CHANGE MASTER TO MASTER_HOST='server1', -> MASTER_USER='repl', -> MASTER_PASSWORD='password', --------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------- 主服务器:172.16.100.1 从服务器:172.16.100.2 这两个服务器都是干净的服务器,也就是原始数据都相同。 ----------------------------------------------------- 主服务器: (1):编辑主配置文件my.cnf # vim /etc/my.cnf @@找到log-bin log-bin=mysql-bin @@添加log-bin-index log-bin-index=mysql-bin.index @@使server-id 等于1 server-id =1 # service mysqld restart -------------------------------------------- (2):创建mysql用户 # mysql mysql> GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TOrepl@'172.16.%.%'IDENTIFIED BY 'redhat'; @@添加用户repl ,设置其权限,密码 mysql> FLUSH PRIVILEGES; mysql> SHOW MASTER STATUS; @@可以查看主服务器的状态。 ---------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------- 从服务器: (1):编辑主配置文件: # vim /etc/my.cnf @@可以关闭二进制文件的功能 #log-bin=mysql-bin #binlog_format=mixed @@添加relay-log,relay-log-index relay-log=relay-bin relay-log-index=relay-bin.index @@修改server-id的值 server-id =2 # service mysqld start --------------------------------------------------- (2):连接到主服务器上: # mysql mysql> CHANGE MASTER TO MASTER_HOST='172.16.100.1', MASTER_USER='repl', MASTER_PASSWORD='redhat', MASTER_LOG_FILE='mysql-bin.000001'; mysql> SHOW SLAVE STATUS\G; @@可以查看从服务器的状态。 mysql> START SLAVE; @@启动从服务器的 mysql> SHOW SLAVE STATUS\G; @@主要查看 Slave_IO_Running, Slave_SQL_Running这两个选项的状态值。 @@此时如果发现有错误,可以在主服务器上,查看错误日志。 # cd /mydata/data # tail localhost.localdomain.err ------------------------------------------------------------------------------------- (3)可以设置从服务器的数据库为只读的,以防不懂数据库的人修改数据库 # mysql mysql> SHOW VARIABLES LIKE '%read_only%'; @@可以查看read_only的值。设置其值为ON mysql> SET GLOBAL read_only=ON; ------------------------------------------------------------------------------------- 测试: 在主服务器上创建个数据库,在数据库中创建个表 # mysql mysql> CREATE DATABASE hellodb; mysql> use hellodb; mysql> CREATE TABLE t1 ( -> NAME VARCHAR(15)); 此时可以进行相关的验证,看配置的复制功能是否成功。 本文转自 kuchuli 51CTO博客,原文链接:http://blog.51cto.com/lgdvsehome/663680,如需转载请自行联系原作者

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

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

用户登录
用户注册