首页 文章 精选 留言 我的

精选列表

搜索[空间理解],共10007篇文章
优秀的个人博客,低调大师

理解 RSTP

交换机MAC学习 拓扑,两台终端连接至同一台交换机,交换机为2层交换机,默认VLAN1 。使用PC1 ping PC2 查看交换机mac地址表 dis mac-address PC1的MAC(5489-9821-0EA9)映射在交换机的G0/0/24端口PC2的MAC(5489-98e1-0a25)映射在交换机的G0/0/23端口有了这个映射条目 ,交换机就可以把接收的帧相互进行转发 此处还涉及到两个概念,一个叫广播,一个叫单播。所谓广播,既广而播之,单播为定向。交换机加电,加载IOS后,MAC条目都为空。当PC1 ping PC2 时,交换机端口接收到包后就会发起广播,寻找PC2的MAC地址。我们在PC2就会看到广播包,PC2将信息返给交换机。通过这样一个问寻,就建立起了MAC地址列表。PC1 与 PC2 在以后的通信过程中就可以直接看到对方,而无需再进行广播。 环路 二层交换中会涉及到一个非常通用的概念,环路。即交换机产生了环路,环路会导致MAC学习混乱以及广播风暴产生 ,导致网络不可用。终其原理就是会在不同的端口学习到同一个MAC地址,导致交换机无法正常处理,就会反复的学习。无法到达终态,非常吃资源。拓扑两台交换机关闭STP,模拟环路。 sys stp diable 在console界面,最显著特征就是会有mac flapping提示,表示有环路存在 开启RSTP RSTP 是STP的加版 ,需要设置主根。将SW01设置为主根sw1配置如下: stp enable stp mode rstp stp root primary sw2 sw3都开启生成树 stp enable stp mode rstp sw01 为主根sw01,02,03 的端口状态如下,sw02端口有阻塞,如果环路中其它端口发生了变化 ,down掉,sw02的端口就会放开,保证链路的畅通。 STP 原理 概念 1、BPDU,桥接协议数据单元 ,用于存储生成树信息,并通过组播在交换机之间传递。BPDU传递的时间间隔默认为2S2、Bridge ID,用于选举根交换机,由桥优先级和MAC组成。可配范围:0-65535 -------[CIST Global Info][Mode RSTP]------- CIST Bridge :0 .4c1f-cc05-4633 BID的规则 ,优先比较桥ID,桥ID越小优先级越高。如果优先级相同,则次比MAC地址,值越小优先级越高。Port Cost,端口开销,华为说法,数据从端口发出时的开销,接收无开销。带宽越高,开销越小,带宽与开销成反比。开销值可以自定义(实验可以,但实际环境不建议,根据实际情况来决定)3、Root Port,根端口,离根交换机最近的端口,到根路径开销最小。根路径开销(root path cost),非根交换机到根交换机最小开销路径4、Desinged Port,转发根交换机数据的端口5、Alternate Port, 预备后补端口,实际上就是已经没有实际数据转发的端口,阻塞端口 端口状态 Forwarding 转发状态 ,正常学习MAC,正常的端口状态Learning 只处理bpdu,不转发流量,但正常学习MACDiscarding 丢弃状态,不转发数据流量 ,只接收bpdu信息 stp现在没有用的,5种端口状态基本了解即可 根桥选举 前提: 所有交换机的链路都相同,链路的带宽一致。1>根桥选举在SW01上执行了,stp root primary ,根优先级便设置为了0。优先级最高,那必定产生两个DP端口。2>RP端口选举根据RP端口定义,到根路径开销最小非根交换机的端口为root port。通过拓扑,我们可以查看到SW02的G0/0/1到根交换机的开销最小(直连) SW03的G0/0/2到根交换机的开销最小,选举为根端口。3>选举指定端口、阻塞端口现在只剩下最后一段链路,SW2和SW3。端口抓包ROOT PATH COST都一样,此处使用了20000的值。那比较桥ID,SW3的梆ID最小。优先级高选举为DP端口,另一侧则为ALER端口(discarding) 技巧:根端口的选择:把自己放到非根桥交换机的位置,沿着每个端口可到达根桥,累加途经的带宽开销,开销最小的那个端口胜出,即是根端口。 指定端口的选择:把自己放在链路的中点,从链路的中点开始沿着两个不同方向的端口到达根桥,累计途经的带宽开销,开销最小的那个端口胜出,即是指定端口。

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

HTAP数据库 PostgreSQL 场景与性能测试之 5 - (OLTP) 空间应用 - 空间包含查询

标签 PostgreSQL , HTAP , OLTP , OLAP , 场景与性能测试 背景 PostgreSQL是一个历史悠久的数据库,历史可以追溯到1973年,最早由2014计算机图灵奖得主,关系数据库的鼻祖Michael_Stonebraker操刀设计,PostgreSQL具备与Oracle类似的功能、性能、架构以及稳定性。 PostgreSQL社区的贡献者众多,来自全球各个行业,历经数年,PostgreSQL 每年发布一个大版本,以持久的生命力和稳定性著称。 2017年10月,PostgreSQL 推出10 版本,携带诸多惊天特性,目标是胜任OLAP和OLTP的HTAP混合场景的需求: 《最受开发者欢迎的HTAP数据库PostgreSQL 10特性》 1、多核并行增强 2、fdw 聚合下推 3、逻辑订阅 4、分区 5、金融级多副本 6、jso

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

elasticSearch空间坐标的设置和查询

原文网址:http://blog.csdn.net/yangwenbo214/article/details/54411004 一、数据准备 为了方便起见,我模拟臆造了json格式的数据 {"timestamp":"2017-01-13T13:13:32.2516955+08:00","deviceId":"myFirstDevice","windSpeed":17,"haze":284,"city":"Beijing","lat":33.9402,"lon":116.40739} 1 模拟数据我用的是c#,大概如下: static void SendingRandomMessages() { //var eventHubClient = EventHubClient.CreateFromConnectionString(connectionString, eventHubName); int len = 4; string[] citys = { "Beijing", "Shangjhai", "Guangzhou", "Shenzhen" }; int[] avgWindSpeed = { 10, 16, 5, 7 }; int[] avgWindSpeed1 = { 10, 16, 5, 7 }; int[] avgHaze1 = { 200, 100, 50, 49 }; int[] avgHaze = { 200, 100, 50, 49 }; double[] latitude = { 39.3402, 31.23042, 23.13369, 22.54310 }; double[] longitude = { 116.40739, 121.47370, 113.28880, 114.057860 }; Random rand = new Random(); while (true) { try { for (int i = 0; i < len; i++) { avgWindSpeed[i] = avgWindSpeed1[i] + rand.Next(1, 11); avgHaze[i] = avgHaze1[i] + rand.Next(10, 100); var telemetryDataPoint = new { timestamp = DateTime.Now, deviceId = "myFirstDevice", windSpeed = avgWindSpeed[i], haze = avgHaze[i], city = citys[i], lat = latitude[i], lon = longitude[i] }; var message = JsonConvert.SerializeObject(telemetryDataPoint); //eventHubClient.Send(new EventData(Encoding.UTF8.GetBytes(message))); Console.WriteLine("{0} > Get message: {1}", "eventHubName", message); } } catch (Exception exception) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("{0} > Exception: {1}", DateTime.Now, exception.Message); Console.ResetColor(); } Thread.Sleep(200); } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 此处我是作为消息发到一个eventhub中,你正确的做法可以将json写到文本文件中,再通过logstash读取即可 我的目的有两个: 获取数据中的lat、lon经纬度数据在kibana Map中进行绘图 获取数据中的timestamp作为我在kibana中的搜索时间,默认情况下是@timestamp 二、解决问题的整体思路 lat、lon本质上是float类型,此处需要设计一个mapping 日志内的时间,本质上应该是个字符串。我们得先卡出这个字段,然后用date match进行转换 三、解决实例 1. mapping的设计,我给出一个template { "template": "geo-*", "settings": { "index.refresh_interval": "5s" }, "mappings": { "_default_": { "_all": {"enabled": true, "omit_norms": true}, "dynamic_templates": [ { "message_field": { "match": "message", "match_mapping_type": "string", "mapping": { "type": "string", "index": "analyzed", "omit_norms": true } } }, { "string_fields": { "match": "*", "match_mapping_type": "string", "mapping": { "type": "string", "index": "analyzed", "omit_norms": true, "fields": { "raw": {"type": "string", "index": "not_analyzed", "ignore_above": 256} } } } } ], "properties": { "@version": { "type": "string", "index": "not_analyzed" }, "lonlat": { "type": "geo_point" } } } } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 大概解释如下: “template”: “geo-*”,所有geo开头的索引,都将会套用这个template配置 “lonlat”: { “type”: “geo_point” } 这个定义了lonlat为geo_point类型,为以后Map绘制奠定基础,这个是关键。 NOTE:这个lonlat名字不能取成特定的关键名字?,我取成location一直报错。 更加详细的介绍你可以查看官网文档 2. 给出logstash的配置文件 input { file { path => "/opt/logstash/1.log" start_position => "beginning" sincedb_path => "/dev/null" } } filter { json { source => "message" } mutate { add_field => [ "[lonlat]", "%{lon}" ] add_field => [ "[lonlat]", "%{lat}" ] } date{ match=>["timestamp","ISO8601"] timezone => "Asia/Shanghai" "target" => "logdate" } } output { stdout { codec => rubydebug } elasticsearch { hosts =>"wb-elk" index => "geo-%{+YYYY.MM.dd}" # template => "/opt/logstash/monster.json" # template_overwrite => true } } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 大概解释一下: json {source => “message”}这个能将json数据格式分解出一个个字段 mutate 这个是向geo_point中加入经纬度数据 date {match=>}这个是将匹配json数据分解出来的timestamp,并以时间格式赋值给logdate output中注释掉的是template文件。我采用的是直接put template的方式,因此注释掉了。两个方法都可行 补充:经纬度信息格式确定和重命名: mutate { convert => { "lon" => "float" } convert => { "lat" => "float" } } mutate { rename => { "lon" => "[lonlat][lon]" "lat" => "[lonlat][lat]" } } 3.运行过程

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

JavaJDBC(快速理解)

1.JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2.JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface) java.sql.*; (这个软件包下有很多接口。) 3.JDBC开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。 classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar 以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。 IDEA有自己的配置方式。 4.JDBC编程六步(需要背会) 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库) 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。) 第三步:获取数据库操作对象(专门执行sql语句的对象) 第四步:执行SQL语句(DQL DML....) 第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。) 第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。) import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; public class JDBCTest{ public static void main(String[] args) { Connection conn= null; Statement stmt = null; ResultSet rs = null; try{ //1.注册驱动 //第一种方式 Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); //第二种方式(一下方法不需要返回值,我们只需要它的类加载动作) class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/bjpowernode"; String user = "root"; String password = "333"; conn = DriverManager.getConnection(url,user,password); System.out.println("数据库连接对象:"+conn); //com.mysql.jdbc.JDBC4Connection@34340fab //3.获取数据库操作对象(statement专门执行sql语句) stmt = conn.createStatement(); //4.执行sql String sql = "select empno as a,ename,sal from emp"; rs= stmt.executeQuery(sql); //executeUpdate执行DML语句 executeQuery(sql)执行DQL语句 //5.处理查询结果集 while(rs.next()) { int empno = rs.getInt("a"); String ename = rs.getString("ename"); double sal = rs.getDouble("sal"); System.out.pritnln(empno+","+ename+","+sal); } } catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(stmt !=null){ stmt.close(); } }catch(SQLException e){ e.printStackTrace(); } try{ if(conn !=null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } } 使用属性配置文件 //jdbc.propertes属性配置文件 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/bjpowernode user=root password=333 import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import java.util.*; public class JDBCTest{ public static void main(String[] args) { //使用资源绑定器绑定属性配置文件 ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); String driver = bundle.getString("driver"); String url = bundle.getString("url"); String user = bundle.getString("user"); String password = bundle.getString("password"); Connection conn= null; Statement stmt = null; try{ //1.注册驱动 class.forName(driver); //2.获取连接 conn = DriverManager.getConnection(url,user,password); System.out.println("数据库连接对象:"+conn); //com.mysql.jdbc.JDBC4Connection@34340fab //3.获取数据库操作对象(statement专门执行sql语句) stmt = conn.createStatement(); //4.执行sql String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')"; int count = stmt.executeUpdate(sql); //执行DML语句 System.out.println(count == 1 ? "保存成功":"保存失败"); //5.处理查询结果集 } catch(Exception e){ e.printStackTrace(); }finally{ try{ if(stmt !=null){ stmt.close(); } }catch(SQLException e){ e.printStackTrace(); } try{ if(conn !=null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } } 5.登录功能实现(防止SQL注入,PreparedStatement) package com.bjpowernode.jdbc; import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.Scanner; /*实现功能: 1.需求:模拟用户登录功能的实现。 2.业务描述: 程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码 合法:显示登录成功。 不合法:显示登录失败。 3.数据准备: 在实际的开发中使用建模工具 4.Sql注入现象(安全隐患): 根本原因 fdsa ''or 将用户名或密码的or 当做了sql语句 解决SQL注入问题: 要想用户信息不参与Sql语句编译,那么必须使用java.sql.PreparedStatement PreparedStatement是属于预编译数据库操作对象,编译一次执行多次。 PreparedStatement ps = null; 其中一个?代表一个占位符,站位符不能用点引号括起来 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); 给占位符传值 ps.setString(1,loginName); ps.setString(2,loginPwd); */ public class JDBCTest06 { public static void main(String[] args) { //初始一个界面 Map<String,String> userLoginInfo = initUI(); boolean loginSuccess = login(userLoginInfo); System.out.println(loginSuccess? "登录成功!":"登录失败用户名密码错误!"); } private static boolean login(Map<String, String> userLoginInfo) { boolean loginSuccess = false; Connection conn = null; PreparedStatement ps = null;//这里是PreParedStatement(预编译数据库操作对象) ResultSet rs = null; try{ //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //连接语句 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","333"); //获取数据库操作对象 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); //给占位符传值 ps.setString(1,userLoginInfo.get("loginName")); ps.setString(2,userLoginInfo.get("loginPwd")); rs = ps.executeQuery(); if (rs.next()) { loginSuccess = true; } }catch (ClassNotFoundException e){ e.printStackTrace(); }catch (SQLException e) { e.printStackTrace(); }finally { if (rs !=null){ try { rs.close(); }catch (SQLException e) { e.printStackTrace(); } } if (ps !=null){ try { ps.close(); }catch (SQLException e) { e.printStackTrace(); } } if (conn !=null) { try{ conn.close(); }catch (SQLException e) { e.printStackTrace(); } } } return loginSuccess; } /* * 初始化用户页面 * @return 用户输入用户名密码等登录信息 * */ private static Map<String, String> initUI() { Scanner s = new Scanner(System.in); System.out.println("用户名:"); String loginName = s.nextLine(); System.out.println("密码:"); String loginPwd = s.nextLine(); Map<String,String> userLoginInfo = new HashMap<>(); userLoginInfo.put("loginName",loginName); userLoginInfo.put("loginPwd",loginPwd); return userLoginInfo; } } Statement的用处(需要SQL注入) Statement存在SQL注入问题,是编译一次执行一次。PreparedStatement执行效率高。 需要先 用户台输入desc降序,输入asc升序,此时需要使用Sql注入 String keyWords = desc或者asc String sql = "select ename = from emp order by ename " + keyWords; 6.账户转账演示事务 sql脚本 drop table if exists t_act; create table t_act( actno bigint, balance double(7,2) //注意:7表示有效数字,2表示小数位个数 ); insert into t_act(actno,balance) values(111,20000); insert into t_act(actno,balance) values(222,0); commit; select * from t_act; 重点三句: conn.setAutoCommit(false); conn.commit(); conn.rollback(); public class HelloWorld { public static void main(String []args) { Connection conn = null; PreparedStatement ps = null; try{ //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333"); //将自动提交机制改为手动提交 conn.setAutoCommit(false);//开启事务 //获取预编译的数据库操作系统 String sql = "update t_act set balance = ? where actno = ?"; ps = conn.prepareStatement(sql); //给替换符赋值 ps.setDouble(1,10000); ps.setInt(2,111); int count = ps.executeUpdate(); ps.setDouble(1,10000); ps.setInt(2,222); count +=ps.executeUpdate(); //程序到这里表示成功 conn.commit(); //提交事务 Syste.out.println(count == 2 ?"转账成功":"转账成功"); }catch(Exception e) { if(conn != null) { try{ //回滚事务 conn.rollback(); }catch(SQLException e) { e.printStackTrace(); } } e.printStackTrace(); } } } 7.JDBC工具类封装 import java.sql.*; public class DBUtil { private DBUtil() { } //工具类的构造方法是私有的; //因为工具类的方法是静态的,不需要实例化 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取数据库连接对象 //@return 连接对象 public static PreparedStatement createStatement(String sql) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "333"); PreparedStatement ps = conn.prepareStatement(sql); return ps; } //关闭资源 //conn 连接对象 //ps 数据库操作对象 //rs 结果集 public static void close(Connection conn, Statement ps, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

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

Go Reflect 理解

最近在看一些go语言标准库以及第三方库的源码时,发现go的reflect被大量使用,虽然反射的机制大多数语言都支持,但好像都没有go一样这么依赖反射的特性。个人觉得,reflect使用如此频繁的一个重要原因离不开go的另一个特性,空接口interface{},reflect配合空接口,让原本是静态类型的go具备了很多动态类型语言的特征。 另外,虽然反射大大增加了go语言的灵活性,但要完全掌握它的原理和使用也还是有一点难度的。 go的reflect库有两个重要的类型: reflect.Type reflect.Value Type,Value分别对应对象的类型和值数据 还有两个重要的函数: reflect.TypeOf(i interface{}) Type reflect.TypeOf()返回值的类型就是reflect.Type。 reflect

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

Dockerfile的理解

Dockerfile文件详解 Docker镜像的制作有docker commit 和Dockerfile,官方推荐使用Dockerfile来制作 通过一个实例来看下docker镜像的制作过程: 1、创建一个Dockerfile的文件 2、在文件中写入下面代码: 1 2 FROMubuntu RUNapt-get install -yvim 3、执行docker bulid命令来构建镜像 1 dockerbuild-tnew-ubuntu. 这条命令-t参数指定新的镜像的名称;点“.” 代表的是Dockerfile文件的路径,由于案例的Dockerfile就在当前目录下面所以就用点符号来标识 从这个输出中我们可以看到真正的构建过程 首先 Docker 将 build context 中的所有文件发送给 Docker daemon。build context 为镜像构建提供所需要的文件或目录。 Dockerfile 中的 ADD、COPY 等命令可以将 build context 中的文件添加到镜像。 此例中,build context 为当前目录 /root,该目录下的所有文件和子目录都会被发送给 Docker daemon。 所以,使用 build context 就得小心了,不要将多余文件放到 build context,特别不要把 /、/usr 作为 build context,否则构建过程会相当缓慢甚至失败。 Dockerfile文件中的其他关键字 FROM是基于那个基础镜像 RUN需要安装的软件 MAINTAINER镜像创建者的信息 CMD:容器启动时需要执行的命令;但是在一个Dockerfile文件中只能有一个CMD命令,如果有多个,只执行最后一个CMD命令 如果在启动容器的时候指定了命令,那么这个命令会替换掉容器镜像中默认写的CMD命令 ENTRYPOINT: container启动时执行的命令,但是一个Dockerfile中只能有一条ENTRYPOINT命令,如果多条,则只执行最后一条 ENTRYPOINT没有CMD的可替换特性 USER:使用那个用户跑容器 例如: ENTRYPOINT ["memcached"] USER daemon EXPOSE:容器内部开启的端口,主机上使用还得在启动容器的时候做端口映射 docker run -p 80:80 xxx ENV: 设置环境变量 例如: ENV LANG en_US.UTF-8 ENV LC_ALL en_US.UTF-8 ADD:将文件<src>拷贝到container的文件系统对应的路径<dest> 所有拷贝到container中的文件和文件夹权限为0755,uid和gid为0 如果文件是可识别的压缩格式,则docker会帮忙解压缩 如果要ADD本地文件,则本地文件必须在 docker build <PATH>,指定的<PATH>目录下 如果要ADD远程文件,则远程文件必须在 docker build <PATH>,指定的<PATH>目录下。比如: docker build github.com/creack/docker-firefox docker-firefox目录下必须有Dockerfile和要ADD的文件 注意:使用docker build - < somefile方式进行build,是不能直接将本地文件ADD到container中。只能ADD url file. ADD只有在build镜像的时候运行一次,后面运行container的时候不会再重新加载了。 VOLUME 可以将本地文件夹或者其他container的文件夹挂载到container中。 WORKDIR 切换目录用,可以多次切换(相当于cd命令),对RUN,CMD,ENTRYPOINT生效 ONBUILD ONBUILD指定的命令在构建镜像时并不执行,而是在它的子镜像中执行 本文转自 kesungang 51CTO博客,原文链接:http://blog.51cto.com/sgk2011/1923972,如需转载请自行联系原作者

资源下载

更多资源
Nacos

Nacos

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

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文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册