首页 文章 精选 留言 我的

精选列表

搜索[图数据库],共10000篇文章
优秀的个人博客,低调大师

每日一博 | 6 张图循序渐进讲透 Kubernetes Ingress 资源对象

Kubernetes Ingress 只是 Kubernetes 中的一个普通资源对象,需要一个对应的 Ingress 控制器来解析 Ingress 的规则,暴露服务到外部,比如 ingress-nginx,本质上来说它只是一个 Nginx Pod,然后将请求重定向到其他内部(ClusterIP)服务去,这个 Pod 本身也是通过 Kubernetes 服务暴露出去,最常见的方式是通过 LoadBalancer 来实现的。同样本文我们希望用一个简单清晰的概述,让你来了解 Kubernetes Ingress 背后的东西,让你更容易理解使用的 Ingress。 我们可以使用 Ingress 来使内部服务暴露到集群外部去,它为你节省了宝贵的静态 IP,因为你不需要声明多个 LoadBalancer 服务了,此次,它还可以进行更多的额外配置。下面我们通过一个简单的示例来对 Ingress 进行一些说明吧。 简单 HTTP server 首先,我们先回到容器、Kubernetes 之前的时代。 之前我们更多会使用一个(Nginx)HTTP server 来托管我们的服务,它可以通过 HTTP 协议接收到一个特定文件路径的请求,然后在文件系统中检查这个文件路径,如果存在则就返回即可。 例如,在 Nginx 中,我们可以通过下面的配置来实现这个功能。 location/folder{root/var/www/;indexindex.html;} 除了上面提到的功能之外,我们可以当 HTTP server 接收到请求后,将该请求重定向到另一个服务器(意味着它作为代理)去,然后将该服务器的响应重定向到客户端去。对于客户端来说,什么都没有改变,接收到的结果仍然还是请求的文件(如果存在的话)。 同样如果在 Nginx 中,重定向可以配置成下面的样子: location/folder{proxy_passhttp://second-nginx-server:8000;} 这意味着 Nginx 可以从文件系统中提供文件,或者通过代理将响应重定向到其他服务器并返回它们的响应。 简单的 Kubernetes 示例 使用 ClusterIP 服务 在 Kubernetes 中部署应用后,我们应该先去了解 Kubernetes Service 服务(前文中讲解的)。比如我们有两个 worker 节点,有两个服务 service-nginx 和 service-python,它们指向不同的 pods。这两个服务没有被调度到任何特定的节点上,也就是在任何节点上都有可能,如下图所示: 在集群内部我们可以通过他们的 Service 服务来请求到 Nginx pods 和 Python pods 上去,现在我们想让这些服务也能从集群外部进行访问,按照前文提到的我们就需要将这些服务转换为 LoadBalancer 服务。 使用 LoadBalancer 服务 当然使用 LoadBalancer 服务的前提是我们的 Kubernetes 集群的托管服务商要能支持才行,如果支持我们可以将上面的 ClusterIP 服务转换为 LoadBalancer 服务,可以创建两个外部负载均衡器,将请求重定向到我们的节点 IP,然后重定向到内部的 ClusterIP 服务。 我们可以看到两个 LoadBalancers 都有自己的 IP,如果我们向 LoadBalancer 22.33.44.55 发送请求,它请被重定向到我们的内部的 service-nginx 服务去。如果发送请求到 77.66.55.44,它将被重定向到我们的内部的 service-python 服务。 这个确实很方便,但是要知道 IP 地址是比较稀有的,而且价格可不便宜。想象下我们 Kubernetes 集群中不只是两个服务,有很多的话,我们为这些服务创建 LoadBalancers 成本是不是就成倍增加了。 那么是否有另一种解决方案可以让我们只使用一个 LoadBalancer 就可以把请求转发给我们的内部服务呢?我们先通过手动(非 Kubernetes)的方式来探讨下这个问题。 手动配置 Nginx 代理服务 我们知道 Nginx 可以作为一个代理使用,所以我们可以很容易想到运行一个 Nginx 来代理我们的服务。如下图所示,我们新增了一个名为 service-nginx-proxy 的新服务,它实际上是我们唯一的一个 LoadBalancer 服务。service-nginx-proxy 仍然会指向一个或多个 Nginx-pod-endpoints(为了简单没有在图上标识),之前的另外两个服务转换为简单的 ClusterIP 服务了。 可以看到我们只分配了一个 IP 地址为 11.22.33.44 的负载均衡器,对于不同的 http 请求路径我们用黄色来进行标记,他们的目标是一致的,只是包含的不同的请求 URL。 service-nginx-proxy 服务会根据请求的 URL 来决定他们应该将请求重定向到哪个服务去。 在上图中我们有两个背后的服务,分别用红色和蓝色进行了标记,红色会重定向到 service-nginx 服务,蓝色重定向到 service-python 服务。对应的 Nginx 代理配置如下所示: location/folder{proxy_passhttp://service-nginx:3001;}location/other{proxy_passhttp://service-python:3002;} 只是目前我们需要去手动配置 service-nginx-proxy 服务,比如新增了一个请求路径需要路由到其他服务去,我们就需要去重新配置 Nginx 的配置让其生效,但是这个确实是一个可行的解决方案,只是有点麻烦而已。 而 Kubernetes Ingress 就是为了让我们的配置更加容易、更加智能、更容易管理出现的,所以在 Kubernetes 集群中我们会用 Ingress 来代替上面的手动配置的方式将服务暴露到集群外去。 使用 Kubernetes Ingress 现在我们将上面手动配置代理的方式转换为 Kubernetes Ingress 的方式,如下图所示,我们只是使用了一个预先配置好的 Nginx(Ingress),它已经为我们做了所有的代理重定向工作,这为我们节省了大量的手动配置工作了。 这其实就已经说明了 Kubernetes Ingress 是什么,下面让我们来看看一些配置实例吧。 安装 Ingress 控制器 Ingress 只是 Kubernetes 的一种资源对象而已,在这个资源中我们可以去配置我们的服务路由规则,但是要真正去实现识别这个 Ingress 并提供代理路由功能,还需要安装一个对应的控制器才能实现。 kubectlapply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/mandatory.yamlkubectlapply-fhttps://raw.githubusercontent.com/kubernetes/ingress-nginx/nginx-0.24.1/deploy/provider/cloud-generic.yaml 使用下面的命令,可以看到安装在命名空间 ingress-nginx 中的 k8s 资源。 我们可以看到一个正常的 LoadBalancer 服务,有一个外部 IP 和一个所属的 pod,我们可以使用命令 kubectl exec 进入该 pod,里面包含一个预配置的 Nginx 服务器。 其中的 nginx.conf 文件就包含各种代理重定向设置和其他相关配置。 Ingress 配置示例 我们所使用的 Ingress yaml 例子可以是这样的。 #justexample,nottestedapiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:annotations:kubernetes.io/ingress.class:nginxnamespace:defaultname:test-ingressspec:rules:-http:paths:-path:/folderbackend:serviceName:service-nginxservicePort:3001-http:paths:-path:/otherbackend:serviceName:service-pythonservicePort:3002 和其他资源对象一样,通过 kubectl create -f ingress.yaml 来创建这个资源对象即可,创建完成后这个 Ingress 对象会被上面安装的 Ingress 控制器转换为对应的 Nginx 配置。 如果你的一个内部服务,即 Ingress 应该重定向到的服务,是在不同的命名空间里,怎么办?因为我们定义的 Ingress 资源是命名空间级别的。在 Ingress 配置中,只能重定向到同一命名空间的服务。 如果你定义了多个 Ingress yaml 配置,那么这些配置会被一个单一的Ingress 控制器合并成一个 Nginx 配置。也就是说所有的人都在使用同一个 LoadBalancer IP。 配置 Ingress Nginx 有时候我们需要对 Ingress Nginx 进行一些微调配置,我们可以通过 Ingress 资源对象中的 annotations 注解来实现,比如我们可以配置各种平时直接在 Nginx 中的配置选项。 kind:Ingressmetadata:name:ingressannotations:kubernetes.io/ingress.class:nginxnginx.ingress.kubernetes.io/proxy-connect-timeout:'30'nginx.ingress.kubernetes.io/proxy-send-timeout:'500'nginx.ingress.kubernetes.io/proxy-read-timeout:'500'nginx.ingress.kubernetes.io/send-timeout:"500"nginx.ingress.kubernetes.io/enable-cors:"true"nginx.ingress.kubernetes.io/cors-allow-methods:"*"nginx.ingress.kubernetes.io/cors-allow-origin:"*"... 此外也可以做更细粒度的规则配置,如下所示: nginx.ingress.kubernetes.io/configuration-snippet:|if($host='www.qikqiak.com'){rewrite^https://qikqiak.com$request_uripermanent;} 这些注释都将被转换成 Nginx 配置,你可以通过手动连接(kubectl exec)到 nginx pod 中检查这些配置。 关于 ingress-nginx 更多的配置使用可以参考官方文档相关说明: https://github.com/kubernetes/ingress-nginx/tree/master/docs/user-guide/nginx-configuration https://github.com/kubernetes/ingress-nginx/blob/master/docs/user-guide/nginx-configuration/annotations.md#lua-resty-waf 查看 ingress-nginx 日志 要排查问题,通过查看 Ingress 控制器的日志非常有帮助。 使用 Curl 测试 如果我们想测试 Ingress 重定向规则,最好使用 curl -v [yourhost.com](http://yourhost.com) 来代替浏览器,可以避免缓存等带来的问题。 重定向规则 在本文的示例中我们使用 /folder 和 /other/directory 等路径来重定向到不同的服务,此外我们也可以通过主机名来区分请求,比如将 api.myurl.com 和 site.myurl.com 重定向到不同的内部 ClusterIP 服务去。 apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:simple-fanout-examplespec:rules:-host:api.myurl.comhttp:paths:-path:/foobackend:serviceName:service1servicePort:4200-path:/barbackend:serviceName:service2servicePort:8080-host:website.myurl.comhttp:paths:-path:/backend:serviceName:service3servicePort:3333 SSL/HTTPS 可能我们想让网站使用安全的 HTTPS 服务,Kubernetes Ingress 也提供了简单的 TLS 校验,这意味着它会处理所有的 SSL 通信、解密/校验 SSL 请求,然后将这些解密后的请求发送到内部服务去。 如果你的多个内部服务使用相同(可能是通配符)的 SSL 证书,这样我们就只需要在 Ingress 上配置一次,而不需要在内部服务上去配置,Ingress 可以使用配置的 TLS Kubernetes Secret 来配置 SSL 证书。 apiVersion:networking.k8s.io/v1beta1kind:Ingressmetadata:name:tls-example-ingressspec:tls:-hosts:-sslexample.foo.comsecretName:testsecret-tlsrules:-host:sslexample.foo.comhttp:paths:-path:/backend:serviceName:service1servicePort:80 不过需要注意的是如果你在不同的命名空间有多个 Ingress 资源,那么你的 TLS secret 也需要在你使用的 Ingress 资源的所有命名空间中可用。 总结 这里我们简单介绍了 Kubernetes Ingress 的原理,简单来说:它不过是一种轻松配置 Nginx 服务器的方法,它可以将请求重定向到其他内部服务去。这为我们节省了宝贵的静态 IP 和 LoadBalancers 资源。 另外需要注意的是还有其他的 Kubernetes Ingress 类型,它们内部没有设置 Nginx 服务,但可能使用其他代理技术,一样也可以实现上面的所有功能。 原文: https://codeburst.io/kubernetes-ingress-simply-visually-explained-d9cad44e4419 翻译: 感谢阳明老师的翻译与分享。 👉 15 个 Kubectl 现有命令使用技巧 - 拿来即用 👉 2020年最高效的10款Kubernetes助力神器 👉 最流行的五款Kubernetes交互式可视化工具 👉 K8s节点故障:资源控制器会触发哪些动作 👉 没有集群照样学Ansible:托管的容器环境(实用) 👉 GitLab CICD与Kubernetes实践·部署Flask Web服务 👉 GitlabCI与Kubernetes实践·部署GitLab-Runner 👉 Gitlab CICD 与Kubernetes实践·部署GitLab 👉 从GitLabCE CI/CD方法论中探索实践 👉 Jenkins在kubernetes上的初体验 👉 走进Network Namespace学会容器网络调试 👉 实践 | Kubernetes守护进程集之DaemonSet 👉 神奇!如何快速成为一名优秀的YAML工程师? 👉 ab压力测试模拟实现kubernetes Pod水平自动伸缩 👉 用Prometheus对业务服务进行监控 👉 Prometheus监控系列-监控篇 👉 kubernetes炼气期之掌握Kubernetes的背景 👉 Prometheus监控系列-部署篇 👉 写给孩子看的Kubernetes动画指南 👉 kubernetes的ingress控制器比较(traefik2.0.5安装指南) 👉 kubernetes深度探究Node和Pod的亲和性和反亲和性 你可能还喜欢点击下方图片即可阅读 本文分享自微信公众号 - 云原生生态圈(CloudNativeEcoSystem)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

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

唯利是图还是政治阴谋?黑客攻击新冠疫苗冷链企业

IBM X-Force专家警告说,黑客正在将与COVID-19疫苗冷链相关的企业组织作为攻击目标。 专家发现自2020年9月以来,一直存在大规模的网络钓鱼活动。相关的网络钓鱼活动遍及六个国家,主要针对可能与疫苗联盟的冷链设备优化平台(CCEOP)计划Gavi相关的组织。 黑客假冒生物医学公司Haier Biomedical,并向参与疫苗存储和运输的管理人员及全球组织发出鱼叉式网络钓鱼信息。Haier Biomedical是COVID-19疫苗供应链的合法企业,也是CCEOP计划的合格供应商。 冷链相关企业在即将发布的COVID-19疫苗分发过程中,起着至关重要的作用。因为运送疫苗时,必须将温度保持在低温,如辉瑞公司生产的一种疫苗需零下70摄氏度的环境,Moderna研发的疫苗则需要在零下20摄氏度的温度环境中。 黑客已经将鱼叉式网络钓鱼电子邮件发送给销售,采购,信息技术和财务部门的某些高管。此攻击活动还在组织范围内扩展到包括目标组织的帮助和支持页面。 欧洲委员会税收和关税同盟总司,以及能源,制造和IT相关企业都是此次攻击活动的目标受害者。攻击者通过网络钓鱼活动攻击了总部位于德国,意大利,韩国,捷克共和国的企业,旨在收集帐户凭据,以用于对相同企业组织进一步攻击。 美国国土安全部CISA发布了警告:黑客冒充生物医学公司,正在向参与疫苗存储和运输的高管和全球组织发送网络钓鱼和钓鱼电子邮件,以获取帐户凭据。 IBM X-Force的报告认为,这场网络攻击活动是由有民族国家背景的黑客发起的。 “虽然归因目前未知,但受攻击为精确目标及特殊性质,可能表明这是一起民族国家背景的黑客活动。因为通常来说,没有一条明确的兑现途径,网络犯罪分子不可能花费大量时间和资源来执行具有如此众多相互关联且遍布全球的,其如此有计划的行动。” “的确,疫苗运输的相关问题可能会成为热门的黑市商品,但值得注意的是,疫苗的购买和流通会影响生命和全球经济,这还可能是一个国家的高价值、高优先级目标。” 参考来源: https://securityaffairs.co/wordpress/111858/apt/covid-19-cold-chain-attacks.html

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

面试官问我什么是「栈」,我随手画了10张图来解释

关注、星标公众号 ,直达精彩内容 ID:技术让梦想更伟大 作者:李肖遥 栈的概念 栈(stack)是限定仅在表的一端进行操作的数据结构,且栈是一种先进后出的数据结构,允许操作的一端称为栈顶,不允许操作的称为栈底,如下图所示: 之前我们讲到了链表,我们只能够对其链表的表尾结点进行操作,并且只能进行插入一个新的结点与删除最末尾的这个结点两个操作,而这样强限制性的‘链表’,就是我们所说的栈。 就像是一个死胡同一样,只有一个出口,如图所示,有个概念: 栈的结点设计 栈分为数组栈和链表栈,其区别如下: 数组栈使用数组进行功能的模拟,实现较为快速和便利; 链表栈使用链表的思路去设计,实现相比较说较为麻烦,但是其稳定,且不易出错; 在链表栈中又分为静态链表栈和动态链表栈,其区别如下: 静态链表栈给定栈的空间大小,不允许超过存储超过给定数据大小的元素; 动态栈使用的是自动创建空间的方法进行创建,只要符合机器的硬件要求以及编译器的控制,其理论上是极大的。 数组栈 其实际就是用一段连续的存储空间来存储栈中的数据元素,有以下特点: 元素所占的存储空间必须连续,这里的连续是指的逻辑连续,而不是物理连续。 元素在存储空间的位置是按逻辑顺序存放的 我们来举例说明,鉴于C语言数组下标都是0开始,并且栈的使用需要的空间大小难以估计,所以初始化空栈的时候,不应该设定栈的最大容量。 我们先为栈设定一个基本容量,在应用过STACK_程当中,当栈的空间不够用时,再逐渐扩大。 设定2个常量,STACK_INIT_SIZE(存储空间初始化分配量)和STACK_INCREMENT(存储空间分配增量),宏定义如下 #defineSTACK_INIT_SIZE1000//数值可以根据实际情况确定#defineSTACK_INCREMENT10//数值可以根据实际情况确定 栈的定义如下 typedefstruct{void*base;void*top;intstackSize;}SqSTACK; base 表示栈底指针 top 表示栈顶指针 stackSize 表示栈当前可以使用的最大容量 若base的值是NULL,表示栈结构不存在;top初始值指向栈底,即top = base; 每当插入新的元素时,指针top就增1,反之删除就减1,非空栈中的栈顶指针始终在栈顶元素的下一个指针上面。 数据元素和栈顶指针的关系如下图所示: 链表栈 我们以链表栈的动态链表栈为例子,进行栈的设计。 首先是栈的结点,设计出两个结构体,一个结构体Node表示结点,其中包含有一个data域和next指针,如图所示: Node 其中data表示数据,next指针表示下一个的指针,其指向下一个结点,通过next指针将各个结点链接。 接下来是我们设计的重点,为这个进行限制性的设计,我们需要额外添加一个结构体,其包括了一个永远指向栈头的指针top和一个计数器count记录元素个数。 其主要功效就是设定允许操作元素的指针以及确定栈何时为空,如图所示: Stack 这里我采用的是top和count组合的方法。其代码可以表示为: //栈的结点设计//单个结点设计,数据和下一个指针typedefstructnode{intdata;structnode*next;}Node; 利用上面的结点创建栈,分为指向头结点的top指针和计数用的count typedefstructstack{Node*top;intcount;}Link_Stack; 栈的基本操作—入栈(压栈) 入栈的基本顺序可以用以下图所示: 入栈(push)操作时,我们只需要找到top所指向的空间,创建一个新的结点,将新的结点的next指针指向top指针指向的空间,再将top指针转移,并且指向新的结点,这就是是入栈操作。 其代码可以表示为: //入栈pushLink_Stack*Push_stack(Link_Stack*p,intelem){if(p==NULL)returnNULL;Node*temp;temp=(Node*)malloc(sizeof(Node));//temp=newNode;temp->data=elem;temp->next=p->top;p->top=temp;p->count++;returnp;} 栈的基本操作—出栈 出栈(pop)操作,是在栈不为空的情况下,重复说一次,一定要进行判空操作,将栈顶的元素删除,同时top指针,next向下进行移动即可的操作。 其代码可以表示为: //出栈popLink_Stack*Pop_stack(Link_Stack*p){Node*temp;temp=p->top;if(p->top==NULL){printf("错误:栈为空");returnp;}else{p->top=p->top->next;free(temp);//deletetemp;p->count--;returnp;}} 栈的基本操作—遍历 这个就很常见了,也是我们调试必须的手段。 栈的遍历相对而言比较复杂,由于栈的特殊性质,其只允许在一端进行操作,所以遍历操作操作永远都是逆序的。 简单一点描述,其过程为,在栈不为空的情况下,一次从栈顶元素向下访问,直到指针指向空(即到栈尾)为结束。 其代码可以表示为: //遍历栈:输出栈中所有元素intshow_stack(Link_Stack*p){Node*temp;temp=p->top;if(p->top==NULL){printf("");printf("错误:栈为空");return0;}while(temp!=NULL){printf("%d\t",temp->data);temp=temp->next;}printf("\n");return0;} 栈数组与栈链表的代码实现 最后呢,我们使用代码来帮助我们了解一下: 栈数组 数组栈是一种更为快速的模拟实现栈的方法,这里我们不多说。 模拟,就是不采用真实的链表设计,转而采用数组的方式进行模拟操作。 也就是说这是一种仿真类型的操作,其可以快速的帮助我们构建代码,分析过程,相应的实现起来也更加的便捷。 其代码如下: #include<stdio.h>#include<stdlib.h>#include<string.h>#definemaxn10000//结点设计typedefstructstack{intdata[maxn];inttop;}stack;//创建stack*init(){stack*s=(stack*)malloc(sizeof(stack));if(s==NULL){printf("分配内存空间失败");exit(0);}memset(s->data,0,sizeof(s->data));//memset操作来自于库文件string.h,其表示将整个空间进行初始化//不理解可以查阅百度百科https://baike.baidu.com/item/memset/4747579?fr=aladdins->top=0;//栈的top和bottom均为0(表示为空)returns;}//入栈pushvoidpush(stack*s,intdata){s->data[s->top]=data;s->top++;}//出栈popvoidpop(stack*s){if(s->top!=0){s->data[s->top]=0;//让其回归0模拟表示未初始化即可s->top--;}}//模拟打印栈中元素voidprint_stack(stack*s){for(intn=s->top-1;n>=0;n--){printf("%d\t",s->data[n]);}printf("\n");//习惯性换行}intmain(){stack*s=init();intinput[5]={11,22,33,44,55};//模拟五个输入数据for(inti=0;i<5;i++){push(s,input[i]);}print_stack(s);/////////////pop(s);print_stack(s);return0;} 其编译结果如下: 栈链表 #include<stdio.h>#include<stdlib.h>//栈的结点设计//单个结点设计,数据和下一个指针typedefstructnode{intdata;structnode*next;}Node;//利用上面的结点创建栈,分为指向头结点的top指针和计数用的counttypedefstructstack{Node*top;intcount;}Link_Stack;//创建栈Link_Stack*Creat_stack(){Link_Stack*p;//p=newLink_Stack;p=(Link_Stack*)malloc(sizeof(Link_Stack));if(p==NULL){printf("创建失败,即将退出程序");exit(0);}else{printf("创建成功\n");}p->count=0;p->top=NULL;returnp;}//入栈pushLink_Stack*Push_stack(Link_Stack*p,intelem){if(p==NULL)returnNULL;Node*temp;temp=(Node*)malloc(sizeof(Node));//temp=newNode;temp->data=elem;temp->next=p->top;p->top=temp;p->count++;returnp;}//出栈popLink_Stack*Pop_stack(Link_Stack*p){Node*temp;temp=p->top;if(p->top==NULL){printf("错误:栈为空");returnp;}else{printf("\npopsuccess");p->top=p->top->next;free(temp);//deletetemp;p->count--;returnp;}}//遍历栈:输出栈中所有元素intshow_stack(Link_Stack*p){Node*temp;temp=p->top;if(p->top==NULL){printf("");printf("错误:栈为空");return0;}while(temp!=NULL){printf("%d\t",temp->data);temp=temp->next;}printf("\n");return0;}intmain(){//用主函数测试一下功能inti;Link_Stack*p;p=Creat_stack();intn=5;intinput[6]={10,20,30,40,50,60};/////////////以依次入栈的方式创建整个栈//////////////for(i=0;i<n;i++){Push_stack(p,input[i]);}show_stack(p);////////////////////出栈///////////////////////Pop_stack(p);show_stack(p);return0;} 编译结果如下: 关于栈的总结 栈-它是一种运算受限的线性表,在数制转换,括号匹配的检验,表达式求值等方面都可以使用,并且较为简便的解决问题。 今天栈基础就讲到这里,下一期,我们再见! 推荐阅读: 嵌入式编程专辑 Linux 学习专辑 C/C++编程专辑 关注 微信公众号『技术让梦想更伟大』,后台回复“ m ”查看更多内容,回复“ 加群 ”加入技术交流群。 长按前往图中包含的公众号关注 本文分享自微信公众号 - 技术让梦想更伟大(gh_f7effb2fbc1c)。如有侵权,请联系 support@oschina.cn 删除。本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

资源下载

更多资源
腾讯云软件源

腾讯云软件源

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

Nacos

Nacos

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

Sublime Text

Sublime Text

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

WebStorm

WebStorm

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

用户登录
用户注册