首页 文章 精选 留言 我的

精选列表

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

《Kafka成神之路》之三图搞懂分区、组消费模式

1 分区消费模式 直接由客户端(任一语言编写)使用Kafka提供的协议向服务器发送RPC请求获取数据,服务器接受到客户端的RPC请求后,将数据构造成RPC响应,返回给客户端,客户端解析相应的RPC响应获取数据。 Kafka支持的协议众多,使用比较重要的有: 获取消息的FetchRequest和FetchResponse 获取offset的OffsetRequest和OffsetResponse 提交offset的OffsetCommitRequest和OffsetCommitResponse 获取Metadata的Metadata Request 和 Metadata Response 生产消息的 ProducerRequest 和 ProducerResponse 1.1 分区消费模式服务器端源码过程 2 组消费者模式 2.1 流程 3 总结 3.1 分区消费模式特点 指定消费topic、partition和offset通过向服务 器发送RPC请求进行消费 需要自己提交offset 需要自己处理各种错误,如:leader切换错误 需自行处理消费者负载均衡策略 3.2 组消费模式特点 最终也是通过向服务器发送RPC请求完成的(和分区消费模式一样) 组消费模式由Kafka服务器端处理各种错误,然后将消息放入队列再封装为迭代器(队列为FetchedDataChunk对象),客户端只需在迭代器上迭代取出消息 由Kafka服务器端周期性的通过scheduler提交当前消费的offset,无需客户端负责 Kafka服务器端处理消费者负载均衡 监控工具Kafka Offset Monitor和Kafka Manager均是基于组消费模式 所以,尽可能使用组消费模式,除非需要 自己管理offset,比如想实现消息投递的其他语义 自己处理各种错误,根据自己业务的需求 本文转载自微信公众号「 JavaEdge」,可以通过以下二维码关注。转载本文请联系 JavaEdge公众号。

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

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源创计划”,欢迎正在阅读的你也加入,一起分享。

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

10 张图聊聊线程的生命周期和常用 APIs

今天我们来说一下线程的生命周期和常用 APIs:我们需要非常清楚的知道线程的各种状态,比如排查程序运行慢的原因时,就需要看下是不是哪里被阻塞了;另外它也是面试时非常喜欢问的,如果基础内容都答不好,恐怕直接就挂了。 本文分为两大部分, 1.线程的 6 大状态; 2.多线程常用的 APIs: join() wait() notify() yield() sleep() currentThread() getName() getId() getPriority() setPriority() stop() 线程状态 关于线程的状态,网上各种说法都有,比较流行的是 5 种或者 6 种。关于 5 种状态的那个版本我没有找到理论依据,如果有小伙伴清楚的也欢迎留言指出。 我这里所写的是根据 java.lang.Thread 的源码,线程有以下 6 大状态: publicenumState{ NEW, RUNNABLE, BLOCKED, WAITTING, TIMED_WAITTING, TERMINATED; } 先上图,我们再依次来看。 1. New A thread that has not yet started is in this state. 就是指线程刚创建,还没启动的时候,比如刚 new 了一个 thread。 MyThreadmyThread=newMyThread(); 2. Runnable A thread is executing in the Java virtual machine but it may be waiting for other resources from the operating system such as processor. 那么接下来,自然就是要启动线程了,也就是调用 thread 的 start() 方法。 myThread.start(); 启动之后,线程就进入了 Runnable 状态。 此时所有的线程都会添加到一个等待队列里,等待“CPU 调度”。 如果抢占到 CPU 的资源,那就执行;如果没抢到,就等着呗,等当前正在执行的线程完成它能执行的时间片之后,再次抢占。 要注意这里在等待的一般是系统资源,而不是锁或者其他阻塞。 3. Blocked Thread state for a thread blocked waiting for a monitor lock. A thread in the blocked state is waiting for a monitor lock to enter a synchronized block/method or reenter a synchronized block/method after calling wait() Object. 这里给出了非常明确的 use case,就是被锁在外面的才叫阻塞。所以这里必须要有至少 2 个线程。 4. Waiting A thread in the waiting state is waiting for another thread to perform a particular action. 那具体有哪些原因呢? A thread is in the waiting state due to calling one of the following methods: Object.wait with no timeout Thread.join with no timeout LockSupport.park 所以说,当调用了 wait(), join(), park() 方法之后,线程进入等待状态。 这里的等待状态是没有时间限制的,可以无限的等下去... 所以需要有人来唤醒: 如果是通过 wait() 进入等待状态的,需要有 notify() 或者 notifyAll() 方法来唤醒; 如果是通过 join() 进入等待状态的,需要等待目标线程运行结束。 比如在生产者消费者模型里,当没有商品的时候,消费者就需要等待,等待生产者生产好了商品发 notify()。下一篇文章我们会细讲。 5. Timed_waiting 导致这个状态的原因如下: Thread.sleep Object.wait with timeout Thread.join with timeout LockSupport.parkNanos LockSupport.parkUntil 其实就是在上一种状态的基础上,给了具体的时间限制。 那么当时间结束后,线程就解放了。 6. Terminated A thread that has exited is in this state. 这里有 3 种情况会终止线程: 执行完所有代码,正常结束; 强制被结束,比如调用了 stop() 方法,现在已经被弃用; 抛出了未捕获的异常。 线程一旦死亡就不能复生。 如果在一个死去的线程上调用 start() 方法,那么程序会抛出 java.lang.IllegalThreadStateException。 接下来我们说说多线程中常用的 11 个 APIs。 APIs 1. join() join() 方法会强制让该线程执行,并且一直会让它执行完。 比如上一篇文章的例子是两个线程交替执行的,那么我们这里该下,改成调用小齐线程.join(),那么效果就是先输出 小齐666。 publicclassMyRunnableimplementsRunnable{ @Override publicvoidrun(){ for(inti=0;i<100;i++){ System.out.println("小齐666:"+i); } } publicstaticvoidmain(String[]args)throwsInterruptedException{ Threadt=newThread(newMyRunnable()); t.start(); t.join(); for(inti=0;i<100;i++){ System.out.println("主线程"+i+":齐姐666"); } } } 所以 join() 能够保证某个线程优先执行,而且会一直让它执行完,再回归到公平竞争状态。 join() 方法其实是用 wait() 来实现的,我们来看下这个方法。 2. wait() and notify() wait() 其实并不是 Thread 类的方法,而是 Object 里面的方法。 该方法就是让当前对象等待,直到另一个对象调用 notify() 或者 notifyAll()。 当然了,我们也可以设定一个等待时长,到时间之后对象将会自动苏醒。 4. yield() yield 本身的中文意思是屈服,用在这里倒也合适。 yield() 表示当前线程主动让出 CPU 资源一下,然后我们再一起去抢。 注意这里让一下真的只是一下,从“执行中”回到“等待 CPU 分配资源”,然后所有线程再一起抢占资源。 5. sleep() 顾名思义,这个方法就是让当前线程睡一会,比如说, myThread.sleep(1000);//睡眠1秒钟 它会抛出一个 InterruptedException 异常,所以还要 try catch 一下。 6. currentThread() Returns a reference to the currently executing thread object. 该方法是获取当前线程对象。 注意它是一个 static 方法,所以直接通过 Thread 类调用。 比如打印当前线程 System.out.println(Thread.currentThread()); 前文的例子中,它会输出: Thread[Thread-0,5,main] Thread[main,5,main] 没错,它的返回值也是 Thread 类型。 7. getName() 该方法可以获取当前线程名称。 这个名称可以自己设置,比如: Threadt=newThread(newMyRunnable(),"壹齐学"); 8. getId() 该方法是获取线程的 Id. 9. getPriority() 线程也有优先级的哦~ 虽然优先级高的线程并不能百分百保证一定会先执行,但它是有更大的概率被先执行的。 优先级的范围是 1-10,我们来看源码: /** *Theminimumprioritythatathreadcanhave. */ publicfinalstaticintMIN_PRIORITY=1; /** *Thedefaultprioritythatisassignedtoathread. */ publicfinalstaticintNORM_PRIORITY=5; /** *Themaximumprioritythatathreadcanhave. */ publicfinalstaticintMAX_PRIORITY=10; 如果不在这个范围,JDK 抛出 IllegalArgumentException() 的异常。 10. setPriority() 当然啦,我们也是可以自己设置某个线程的优先级的。 设置的优先级也需要在规定的 1-10 的范围内哦,如果不在这个范围也会抛异常。 11. stop() 最后我们来说下 stop() 方法,也是前文提到过的强制停止线程的一种方式,但现在已被弃用,因为会引起一些线程安全方面的问题。 好了,以上就是有关线程状态和常用 API 的介绍了。相信大家看完之后对线程的整个流程应该有了清晰的认识,其实里面还有很多细节我没有展开,毕竟这是多线程的第 2 讲,更深入的内容我们慢慢来。 本文转载自微信公众号「 码农田小齐」,可以通过以下二维码关注。转载本文请联系 码农田小齐公众号。

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

十张图看懂SDN与NFV的区别与联系?

专业的人说的很准确但是普通人难以理解,常常记不住,分不清,不专业的人往往又说的差点意思。无意间,笔者在领英上看到一个介绍SDN/NFV区别的公开文档,内容详实,简明扼要。 这里我将这个文档精彩的部分分享给大家。 开篇鸣谢:原作者是Riverbed的产品市场经理JustynaBak。 Page1: SDN有三个核心: 1:将控制平面和数据平面分离,这是最核心的部分,现在经常提到的SDS其核心也是控制和转发分离,这是SDS设计重要原则之一,可见SDN是先于SDS的; 2:SDN使用的都是商用化,通用的路由器和交换机,这是相对于专有的芯片,专有的架构,专有的设备而言的; 3:控制面可编程; 对应的NFV的三大关键点是: 1:将网络设备的功能从网络硬件中解耦出来; 2:将电信硬件设备从专用产品转为商业化产品; 3:数据平面可编程; Page2:起源 SDN起源于园区网,成熟于数据中心; NFV始于运营商,最初主要是大型运营商在搞的; Page3:代表人物 加州大学伯利克分校教授,Nicira创始人,美国工程院院士,SDN运动的主要开创者之一,计算机网络世界最著名的人物之一。熟悉SDN的人都知道的这人,几年前来过一次中国。 爱立信执行副总裁,现任沃达丰CTO。(说实话,笔者对这人不熟) Page4:适用范围 SDN跟NFV最明显的区别是,SDN处理的是OSI模型中的2-3层,NFV处理的是4-7。 SDN主要是优化网络基础设施架构,比如以太网交换机,路由器和无线网络等。 NFV主要是优化网络的功能,比如负载均衡,防火墙,WAN网优化控制器等。 Page5: 类似的转变 这里做了一个特别有意思的类比,类似于C语言面向过程到C++的面向对象的变化。熟悉编程基础的朋友对此非常熟悉,以对象为思考的元素,更容易建立编程逻辑。 SDN的转变是从分布式的,采用复杂协议的专用网络设备,用低级的管理工具管理,转变为用高级管理工具管理商用设备组成的集中式架构系统。 现场工程师配置专用设备变为远程工程师配置虚拟化设备。 Page6:带来的好处 SDN带来的好处: 简化由成千上万来自不同供应商,API接口的物理路由器交换机组成的整个网络的配置过程。 从应用或者策略管理的来看,整个网络大大简化,从而简化了操作。 减少成本,不用再为一些功能强大的贵的硬件花冤枉钱了。 NFV带来的好处: 加快产品和新业务推向市场的速度,因为无需改变硬件,要知道,硬件修改要费尽的多,开发测试周期太长。 由于标准化的作用,带来采购,设计,集成和基础设施的维护的过程大大简化; 由于有了动态分配硬件资源的能力,可以在确定的时间增加网络功能,从而增加了灵活性/扩展; Page7:标准的制定者: SDN是ONF,NFV是ETSI; Page8:SDN为数据中心网络架构带来的变化。 Page9:NFV对运营商网络架构带来的变化; Page10:NFV为终端用户网络架构带来的变化。 Page11:SDN和NFV以及相关技术组成在网络架构中所处的位置。 以上PPT的内容还都比较经典和有参考价值,下载链接如下。 https://www.slideshare.net/pontschek/sdn-and-nfvfriendsorenemies

资源下载

更多资源
Mario

Mario

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

Nacos

Nacos

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

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等操作系统。

用户登录
用户注册