今天威哥给大家解析一道源自阿里一面的面试题,什么是 socket? 接下来我们就开始解析这道面试题。 socket 是基于应用层和 tcpip 协议组之间的一个抽象,他将 tcpip 协议里面复杂的通信逻辑进行封装,对用户来说,只要通过一组简单的 api 就可以实现网络的连接和通信。 接下来让我们看一下 socket 的通信过程。首先服务端出手按 sever socket, 然后对指定的端口进行绑定,接着对端口进行监听, 通过调用 except 方法进行主色。此时如果客户端有一个 socket 连接到服务端,那么服务端通过监听和 except 方法 可以与客户端进行连接。注意,在通信编程里, several socket 并不负责具体的网络读写,他仅负责接收客户端的连接后掀起一个 socket 来和客户端进行通信。服务端每接收一个客 客户端连接,就会产生一个 sock 的接口实力,和客户端的 sock 进行通信,有多个客户端连接,自然就有多个 sock 的接口实力。接下来的拓展知识部分,威哥整理了 sock 的服务端和客户端的代码实现,有兴趣的小伙伴可以自行参考笔记,小伙伴们关注威哥,更多精品内容持续与你分享!
粉丝2721获赞9367

零零的用户太进程间通信有几种主要的方式?那这个是大家出去面试时啊,经常被问到的一个问题,这里呢我们统一回答一下,共有七种,第一种叫做管道,管道呢,可以用于具有父子关系的进程间通信。 第二种有名管道呢,克服了管道没有名字的限制,因此呢,不具有管道所具有的功能外,他还允许无千元关一的进程间的空气。第三种是信号,用于通知接收进程,有某种事件发生了, 除了用于进程电路线,他还可以发送信号给进程本身。第四种就是消息对列,消息对列呢,是消息的链接表,遵循了先进先出的传输方式。第五种叫共享内存,使得多个进程可以同时 访问同一块内存空间,他呢是最快的进程间通信方式。第六种呢是限号量,主要作为进程间以及同一进程不同线程之间的 同步手段。第七种就是套间 soft 啊,也就是我们常说的网络编程,可以实现不同主机上的两个进程间的通信。

作为前宇宙场的程序员面试官,你猜我在面试中问的最多的是啥? socket 到底是什么?看完这个视频,你不仅能搞清楚概念,还能弄明白 socket 的内核。实现故事要从一个插头说起, 当我将插头插入插座,那看起来就像是将两者连起来了,而插座的英文又叫 socket。 巧了,我们程序员搞网络编程时,也会用到一个叫 sock 的东西,其实两者非常相似,通过 sock, 我们可以与某台机子建立连接。如果我们想要在两端之间传份数据,就需要像上面这样, 两端各自执行 socket 方法。得到 fd 聚柄之后,对于服务端依次执行 bind、 lason、 accept 方法,然后坐等客户端的连接请求。执行 connect 方法,向服务端发起建立连接的请求。连接建立完成后,客户端可以执行 sand 方法发送消息,服务端可以执行 receive 方法接收消息。反过来,服务器也可以执行 send 发送消息,客户端执行 receive 接收消息。这就是我们大部分程序员最熟悉的使用场景。 现在我们见过也用过 socket 了,但对大部分程序员来说,他依然是个黑盒。那既然是黑盒,我们索性假设我们忘了 socket, 重新设计一个内核网络传输功能。网络传输从操作上来看,无非就是两段之间互相收发数据,也就是对应读数据和写数据。 写过代码的都知道,为了实现某些功能,我们一般会需要定一个新的数据结构,这个数据结构叫 sock。 由于接收端和发送端可能不止一个,因此我们加入 ip 和端口坐下区分 ip 用来定位是哪台电脑, 端口用来定位是这台电脑上的哪个进程。另外,发送端和接收端的传输方式有很多区别,可以是可靠的 tcp 协议,也可以是不可靠的 udp 协议,甚至还需要支持基于 icnp 协议的拼命令。虽然这些协议各不相同, 但还是有一些功能相似的地方,比如收发数据时的一些逻辑,完全可以附用按面相对象编程的思想,我们可以将不同的协议当成是不同的对象类或结构体,将公共的部分提取出来,通过继承的方式服用功能。 于是我们将功能重新划分下,定义了一些数据结构。 sock 是最基础的结构,维护一些任何协议都有可能会用到的收发数据缓冲区。 next sock 特指用了网络传输功能的 sock, 在 sock 的基础上还加入了 ttl、 ip、 地址、端口这些跟网络传输相关的自断信息。 说到这里大家就蒙了,难道还有不用网络传输的?有,比如 your next domain socket, 用于本机进程之间的通信,直接读写文件,不需要经过网络协议战。 net connection stop 是指面相连接的 stop, 在 next stop 的基础上加入面相连接的协议里相关自断,比如 accept 队列、数据包、分片大小、握手失败、重试次数等。 虽然我们现在提到面相连接的协议就是指 tcp, 但从设计上, lay next 需要支持扩展其他面相连接的新协议,比如 sctp 协议,不了解也没关系,我们跳过 tcp 下划线 sock 就是正儿八经的 tcp 协议专用的 sock 结构了。在 next connection sock 基础上,还加入了 tcp 特有的滑动窗口、拥塞避免等功能。好了,现在有了这套数据结构,每个数据结构实现自己职责范围内的功能,然后再将它们 硬件网卡对接一下,就实现了网络传输的功能。可以想象到这里面的代码肯定非常复杂,同时还操作了网卡硬件,需要比较高的操作系统权限,再考虑到性能和安全,于是决定将它放在操作系统内盒里。 既然跟远端服务端进程收发数据,可以抽象为读和写,操作文件也可以抽象为读和写。正好有句话叫 lay next 里一切皆是文件,那我们索性将内核的 sock 结构封装成文件就好了。 创建 soc 的同时也创建一个文件,文件有个具柄 fd, 说白了就是个文件系统里的身份证号码,通过他可以唯一确定是哪个 soc。 将 fd 聚柄暴露给用户之后,用户操作这个聚柄文件,系统就会将操作指向内和 sock 结构。有了 socksd 聚柄之后,我们将这部分功能抽象成一个个简单的 api 接口,让用户 更方便的实现特定的网络编唱功能。以后别人只需要调用这些 api 接口,就可以驱动我们写好的这一大堆复杂的数据结构去发送数据。这些 api 接口我们列了一下,发现需要有 send、 receive, bind、 listen、 connect 这些。到这里, 我们的内核网络传输功能就算设计完成了。现在是不是眼熟了,上面这些接口方法其实就是 socket 提供出来的接口,所以说 socket 其实就是个代码库或接口层,它介于内核和应用程序之间,提供了一些高度封装过的接口,让我们去使用内核网络的传输功能。到这里 我们应该明白了,我们平时写的应用程序的代码里,虽然用了 socket 实现了收发数据包的功能,但其实真正执行网络通信功能的不是应用程序,而是 linex。 内核相当于应用程序通过 sock 提供的接口,将网络传输的这部分工作外包给了 linx 内核。这听起来像不像我们最熟悉的前后端分离的服务架构?虽然这么说不太严谨,但看上去 linx 就像是被分成了应用程序和内核两个服务 内核,就像是后端暴露了好多个 api 接口,其中一类就是 soccer, the sand 和 receive 这些方法。应用程序就像是前端负责调用内核提供的接口来实现想要的功能。 看到这里,我担心大家会有点混乱,来做个小的总结。在操作系统内和空间里实现网络传输功能的结构是 suck, 基于不同的协议和应用场景,会被泛化为各种类型的 suck, 他们结合硬件共同实现了网络传输功能。 为了将这部分功能暴露给用户空间的应用程序使用,于是引入了 sak 层,同时将 sak 嵌入到文件系统的框架里。 sock 就变成了一个特殊的文件,用户就可以在用户空间使用文件具柄,也就是 socketfd 来操作内和 salt 的网络传输能力。这个 socketfd 是一个 into 类型的数字,现在回去看 socket 的中文翻译套接字,我将它理解为一套用于连接的数字,是不是就觉得特别合理了? 上面关于 socket 怎么实现网络通信功能这一块一笔带过了,现在我们来聊聊。我们以最常用的 tcp 协议为例,简单了解下它是怎么实现网络传输功能的。 我将它分为两阶段,分别是建立连接和数据传输。在客户端代码执行 socket 提供的 connect 方法,传入 socket 和 ip 端口时, 内核会通过 socksd 句柄找到对应的文件,再根据文件里的信息找到内核的 sock 结构,通过这个 sock 结构主动发起三次握手,至此连接就算准。 准备好了之后就可以开始传输数据了。为了实现发送和接收数据的功能, suck 结构题里带了一个发送缓冲区和一个接收缓冲区。说是缓冲区,但其实就是个链表,上面挂着一个个准备要发送或接收的数据。 当应用执行 send 方法发送数据时,同样也会通过 sockfd 句柄找到对应的文件。根据文件指向的 soft 结构,找到这个 soft 结构里带的发送缓冲区。将数据放到发送缓冲区,然后结束流程内核,看心情决定什么时候将这份数据发送出去。 接收数据流程也类似,当数据送到 linax 内核后,数据不是立马给到应用程序的,而是先放在接收缓冲。剧中数据静静躺着,卑微的等待应用程序什么时候执行。 receive 方法来拿一下,就像我的视频,躺在你的推流列表里,卑微的等一个点赞、关注、转 转发三连。看到这里,问题又来了,服务端类似的时候,那么多数据包发到一个类似 socket 上,服务端是怎么区分多个客户端的?客户端发来的数据包上会有原 ip 地址和端口,以及目的 ip 地址和端口这四个元素构成一个四元组,可以用于唯一标记一个客户端。 服务端会创建一个新的内核 sock, 并用四元组声成一个 hasht, 将它放入到一个 hash 表中。下次再有消息进来的时候,通过消息自带的四元组声成 hasht, 再到这个 hash 表里重新取出对应的 sock 就好了。 所以说服务端是通过四元组来区分多个客户端的。最后遗留一个问题,大家都知道 linx 内核是新语言实现的,而新语言既没有累也没有继承的特性,是怎么做到继承的效果的呢?欢迎评论区讨论。想要文字版的笔记,可到我的报上 回复关键字扫即可获取!老规矩,总结的事情就交给你们了!

那你说一下这个 socket 和 vivo socket 之间有什么区别?这不是一个东西吗?有什么区别呢? 我们都知道呢, osi 呢,有七层国旗,其中呢下三层是进行一个数据通信的,和上三层呢,是数据 处理的,中间呢有一个传输层,它是上三层和下三层之间的一个桥梁。而我们的这个 socket 呢,它严格意义来说它不是一个协议,它只是一个数据的一个接口,就是 两个服务之间进行一个数据传输的一个数据组装的一个接口。而我们的这个 wind, suki 等呢,它才是一种协议,它是一种应用成的一个典型的协议, 运用在我们的 tcp 协议上的一个全双工通信一个协议。所以呢,我们说这个 socket, 它是一种数据组装的一种借口,而这个 web socket 才是一种应用程的一个协议,记住全双工的协议。

面试题, volatile 关键字三连问你都能回答上来吗?哈喽,大家好,我是架构师奶爸。第一问,什么是 volatile 关键字? volatile 是 job 虚拟机提供的最轻量级的同步机制。 当一个变量被定义成 volatile 之后,具备两种特性,一、保证此变量对所有线程的可见性。当一条线程修改了这个变量的值, 新职对于其他县城是可以立即得知的,而普通变量做不到这一点。二、禁止指令重排序优化。普通变量仅仅能保证在该方法执行过程中 得到正确结果,但是不保证程序代码的执行顺序。第二问,为什么基于 volatile 变量的运算在并发下不一定是安全的? volatile 变量在各个县城的工作内存 不存在一致性问题?各个县城的工作内存中, volatile 变量每次使用前都要刷新到主内存,但是闸板里面的运算并非原子操作,导致 volatile 变亮的运算在并发下一样是不安全的。 第三问,为什么使用 volato? 在某些情况下, volato 同步机制的性能要优于所 synchronized 关键字,但是由于虚拟机对所实行的许多消除和优化, 所以并不是很快。 water 变量读操作的性能消耗与普通变量几乎没有差别,但是写操作则可能慢一些,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。三连问, 你都答上来了吗?欢迎评论区留言,想了解更多 java 架构师岗位知识,请关注我,架构师奶爸,共同筑基 java 架构师。

那你说一下骚客和外婆骚客有什么区别吧?这好像是一个东西吧。那么通常 osia 网络有七层模型,下三层结构呢,偏向于数据通信,上三层呢,偏向于数据处理 中间的传输层解释连接上三层和下三层的一个桥梁,上三层依赖下层的协议。那么骚 k 的其实并不是一个协议,它是一种接口,两个服务之间进行数据通信的时候,骚 k 的会去组织数据,以便符合指定的协议。 而外部骚客则是一个典型的应用层协议,是工作在 tcp 连接上的全双工通讯协议。简单的来说,骚客的组装底层的数据实现接口,外部骚客是应用层的全双工通讯协议,你明白了吗?

哈喽,大家好,今天我们看一下这样一道经典的面试题,说一下县城之间是如何通信的。呃,这里可以列举两种方式啊,常见的有两种方式,第一种是通过共享内存 啊,这种情况下是通通过,比如说两个县城,他在呃定一个共享的一个变量, 就说当前现成的话,比如说现成一,将当前的变量修改后,然后同步更新到共享的内存中啊,相差的话啊,他会从那个最新的这个呃从内存中取得最新的一个共享变量, 这样你看就可以取到呃两个县城之间的共享变量。呃,这种情况通常是什么情况呢?就是说,比如说县城一级,县城二的话,比如说县城一,呃在做 动作做完之后线长二的话,比如说有一个标识位啊,这样的话可以通过这个线程一去去修改,有个指通知啊,呃线长,呃,当然的话,你可以通过呃如何保证两个呃 共享内存的数据是一定是保持强一致的呢?可以通过加关键字 volatile 啊,这个我们在之前的这个呃面试题讲解中也说过了,可以参考我往期的一些视频。 第二种通信方式,通过外体和 load file, 这种情况就是通过一个同步的一个机制,我们知道在 seekonas 在同步快中,我们可以呃通过一个锁,对吧?一个 ob 键,然后呃当我在这个当前需要去呃睡一段时间之后,比如说,呃 主赛当前线程,通过这个到 ob 界点点外的方法啊,当然的话,其他线程的话,比如说他也是去获取同一把锁的话,那这个线程的话就会啊,当他 第一个线程调用外的方法之后,第二个线程它自动就获取锁了啊,这通过这种方式来保证线程之间的一个同步 啊,总总而言之吧,不管是你是第一种方式还是第二种方式啊,一种是通过共享变量的方式,第二种是通过那个外界 notifi 的方式,都可以有效的保证我们县城之间啊,同心。好了,今天的分享就到这里。

什么是县城通讯?如何实现县城通讯?大家好,我是磊哥,一个有着十几年工作经验的程序员,那么今天给大家来分享一个并发编程当中 几乎是必问的一个问题,如何实现现成通讯?什么是现成通讯?那么大家呢,先点赞后观看,以后再看找得见。 那么县城通讯呢,它是指多个县城之间通过共享内存或者是消息传递的方式啊,来进行协调和同步他们之间的操作的 啊,那这个呢,显示通讯啊,在多县城编程当中非常的常见,他是多个县城在共同需要完成某个任务的时候,哎,他们就要进行通讯了,这样呢才能保证这个任务啊能够顺利的 执行。所以说呢,县城通讯啊有两种实现的方式,一种呢是通过共享内存啊,另一种呢就是通过消息传递。 好,那么咱们啊,来看一下县城通讯啊,他的常见场景有哪些?比如说啊,比如说,那么有一个爬城啊,爬冲程序,他呢需要多个县城啊,共同去抓取不同的网页,然后呢再点,再把这些结果呢进行一个合并 放到数据库当中,那这个时候呢,就需要各个县城协调执行顺序和共享数据了, 对吧?啊,他们共同是完成这样的一个操作的啊,抓取网页的操作的,那还有呢,比如说,哎,你去避免线程冲突啊,避免线程冲突,比如多个线程在进行 写一个文件,哎,或者是写一个数据库的时候,那就要干嘛了,就要使用县城通讯来保证县城之间的 数据访问的顺序的啊,这样的话可以避免那资源的一个使用上的冲突,对吧?还有保证他的顺序和县城之间的这个互斥和同步 啊,那这些呢,都是需要进行县城之间通讯,那才能够去实现和完成的工作呀,对吧?只有县城, 哎,这个县城告诉了那个县城,或者是那个县城告诉了这个县城啊,实现了通讯之后,那这个时候 ok, 那其他的县城才知道我接下来要怎么样去做吗?啊?这就是县城实现他的一些场景。好,那么咱们需要知道的一个重点的内容是, 他现成通讯是如何实现的,对吧?那现成通讯的实现方法呢?总共有这么四类 啊。第一类呢,是通过等待和通知机制啊,就比如说 object, 呃,里面提供的这个 wait 方法和 notifi 方法,对吧? wait 方法呢,就是让这个县城呢执行的时候啊,停下来, 直到呢有一个县城 notifi 了啊,唤醒他了,那么另一个县城啊,那个等待的县城啊,才能够进行执行, 对吧?那这就是县城的通讯机制啊。啊,一个通,一个县城在等待两,然后另一个县城去唤醒他吗?对吧?这是标标准的县城通讯的实现方法。那还有啥呢?还有通过这个信号量机制啊,比如说加二里面提供的 c m pro 啊,那这个类呢, 可以实现线程之间的同步和互斥啊,就是这个 sim pro, 它提供的是一个计数器的功能,提供的是一个计数器的功能啊,这个计数器呢,会, 会通过发令牌的方式来控制总共有多少个县城可以共享操作资源。 那这个时候呢?如果说,哎,比如说啊,呃,我的这个 sympo 它呢提供了哎,两个令牌, 那这个时候呢,就是允许最多有两个县城共同去访问啊,如果你有第三个县城过来了,抱歉,等待啊,你只能去等待,直到有人,怎么样?有人不用了啊,有人把这个令牌呢给释放掉,那么另一个县城啊,他才能够进来,对吧?所以你可以看到 他呢,就比较像停车场啊,停车场的那种机制,比如说呢啊,外面的车有五辆,对吧?咱们经常看医院呢,排队的那些车,其实他都是在等待别人出来,对吧?比如说停车场呢,他只有两个位置,那这时候呢?外面有五个车,那我只能放两个车进来 啊,直到呢,这两个车其中有一个离开了,或者是两个一块离开了,那么后面的车才能进来啊,这就是 sum pro, 它的一个实线。 好,那么第三种实现呢?是通过栅栏啊,通过栅栏,那 java 里面提供的栅栏有啥呢?有 sickleberry 啊, sickleberry, 那它呢?诶,就是 循环屏障,也叫做栅栏,放一成中文也叫做栅栏的一个意思啊,他指的是啥呢?哎,指的是我让这 个县城啊,让这个县城多个县城指定啊,有多少个县城,然后出发到了某一个位置之后,然后接着再继续往下去执行啊,比如说啥呢?就给大家去举个例子,就比如说现在的田径比赛 啊,那天津比赛,那天津比赛呢?我需要等到啊,就是裁判再去宣布成绩的时候,需要这一组人员,所有人都到达重点之后,这个时候我再去宣布他的一个排名 和他的一个成绩,对吧?啊?一定是所有人都达到终点,那我这个时候才会进行下一个动作啊,这个就是 seekley berry 啊,它的一个作用和它的一个机制。那么第四种呢,就是通过锁机制来实现啊,锁机制来实现,比如说咱们唠嗑里面,家里面唠嗑 里面提供的,呃, condition 这个接口啊,这个接口呢,它就提供了同步啊和互吃的操作, 也就说他和咱们的 wait 和 notifi 方法是比较像的啊,他有呢等待和唤醒的方法, 对吧?他俩比较像啊,但是,呃,他们的所处的对象还是不一样的, wait 和 notified 它是属于 object 啊, 卡丁审他是属于 lock 接口的好,那么这就是他常见的四种实现方式啊,那咱们底下也提供了具体的代码实现了,那咱们就简单来看一下,简单快速的过一下 好,比如说咱们第一种等待和通知地址啊,那他通过的就是 wait 和 notty five, 对吧?好,那就说,哎,我刚开始的时候,我这个县城我先执行,然 然后执行的时候,你可以看到这个,这两个他枷锁枷锁都是一个对象,也就说同一个时间啊,只有一个县城能执行啊,比如说这个时候呢,县城一先去执行,那执行执行。哎,执行到这一块了之后,遇到了 wait 方法之后啊,他就不执行了, 他就不执行了,他就等待,直到谁呢?直到有人去唤醒他啊,这个时候呢,他会释放自己的锁,然后释放自己的锁之后呢,咱们的现成币啊,就得到了锁, 锁到了锁之后呢,他就继续往下去执行了,然后执行的楼梯 five 方法啊,这个时候呢,哎,再继续往下去执行,对吧?啊?然后执行完之后呢,锁释放了,那这个时候 啊,被唤醒的这个锁它会继续去执行,所以最终程序的一个打印,你可以看到它是先 a 呃, start, 然后呢再 b start, 然后 b enter 之后把锁释放了, a 才能继续去 执行啊,一方面是锁释放了,另一方面呢是我执行了 notefif 方法啊,如果我只是释放了锁,但是没有执行这个唤醒方法,那么 ok 他也是不能执行的,因为他呢就是休眠之后必须得有一个 notefif 或者是 notefifer 二啊,他才能继续去执行的, 这是咱们等待通知实现的现成通讯啊,那信号量的一个实现呢?啊? simple, 那它的实现就是这样啊,首先呢,我定一下停车场,它的一个位置啊,它它有多少个? 呃,空闲的位置啊,可以让停几辆车,比如说,哎,我现在停车场就是两辆车啊,但是这不是停车场,这是令牌,对吧?我最多有两个县城能够同时执行,哎,这时候呢,来了五个县城对吧?来了五个县城之后呢,那么只有啊,那每个 每个车啊,每个这五辆车呢,首先他们得竞争去拿这个令牌,得到令牌的人呢,就去执行啊,执行,直到呢,其他的没有得到的三辆啊,三辆车,他就在外面排队等待了,直到有人释放了这个令牌,那其他县城才能继续去执行的 啊,这就是咱们信号量实现现成通讯的一种方式。好,继续往下去看啊, secret barry 啊,那它的一个实线,那你可以看到呢,它的这个实线里面啊,它是定义了,诶, 啊,我这比赛有三名选手,只有这三名选手同时到达终点,我才执行这个方法的,对吧?好,这时候呢,哎,给他去添加三个线程,然后三个线程呢?都去执行啊,都去执行,那么执行到这他就会停下来,为啥呀?因为这块呢,有一个 of it 啊,有一个 weight, 他 都会停下来啊,直到满足了三个,因为他定义的是三个啊,直到满足了三个之后呢,执行这个方法,然后呢,他们再分别去这三个县城,分别再继续往下去执行,所以最终的一个打印呢,大家可以看到啊,一二三先来了, 对吧?他呢?这个是执行了这样的一个方法,一二三,他先来了啊,来完之后呢,哎,又执行了这样的一个方法,对吧?啊?这两个都执行了,执行完了之后呢,大家可以看到啊,这块呢,执行了一个,哎,这个二 thread 啊,那就是执行了这个方法, 对吧?为啥呢?因为他们满足了循环栅栏,所有人都到达终点了啊,这个呢,就是,哎,所有人都到达终点了之后,我就触发这个方法,然后呢,这个时候其他的三个县城才能继续往下去执行,所以 最后你看到的, ok, 这是这三个线程怎么样?继续去执行了,这就是 think liberia, 它的一个实现了。好,咱们继续往下去,咱们继续往下去执行。然后最后一个呢,是所机制 啊, condition, 对吧?那 condition 呢?它是来自于 lock, 对吧?来自于 lock 接口。那可以看到,首先呢,我先定义了一个 lock, 然后再从 lock 里面,诶,搞了这样的一个,呃, 定义了一个新的啊, condition 对吧?啊? condition, 然后呢?哎,这个 condition 里面它有什么方法呢?它里面有 oat, oat 呢,就是我执行的时候我先等待啊,我先等待,对吧?执行到这 我呢就等待了,直到是啥呢,出现了这样的一个唤醒操作啊, single on 啊,这个时候呢,那之前 oate 等待的 等待的这些线程呢,才能继续的往下去执行,所以他俩啊,这个方法和咱们的上面的那个 object 的 wait 方法和农推翻译方法比较像,但是他俩不同的一点是,大家可以看到他是可以指定唤醒的 啊,我是指定某一个对象,某一个县城进行唤醒的,他有这样的一个作用。而咱们的 way 特呃 和 notifi 方法呢,它的唤醒是如果枷锁的是同一个对象的话啊,有多个对象都进行 wait 了,那这个时候 他的唤醒是随机的,而咱们这块呢,哎,定义的是这一个对象,所以他在进行唤醒的时候呢,他是指定唤醒的啊,但是这个呢,也不是咱们关注的一个重点,反正你知道啊,他在进行通信的时候,思政方式 啊,这四种方式呢,都可以实现通讯操作啊,通讯操作对吧?好, ok, 咱们简单总结一下,咱们说县城通讯呢,指的是多个县城经啊,通过共享内存或者是消息传递的方式来 协调和同步他们之间的一个执行。那么实现线中通讯的方法呢?有很多,比如说 a object 它的 wait 和 notifi 方法,那还比如说呢,信号量机制,还有咱们的这个循环啊,栅栏的机制以及 condition 啊所机制它都是能够实现现成的通讯的。那么今天的内容呢?到这里就结束了,大家不要忘记一键私连,关注我,获取更多 java 知识。

好,咱们来说一下第八题啊, view 是如何进行组建通信的?也就是组建船只啊,它有这样一些情况,比如说第一种呢,富船子,富船子 父传子,第二种呢,子昌父 自传父,第三种呢就是兄弟, 第四种,哎,主要就是这三种啊,当然最后一个呢,不是怎么穿,而是说咱们的一个方案就是 viox 进行穿纸, vilx 穿纸, ok, 那么我们先来说复 传子,副传子的话,他就是通过一块把子组件引入到自己的组件里面,然后在副组件里面的通过呃 condpoint 的属性进行一个注册,然后子组件就可以使用标签,哎,写到副组件的页面当中了。 那么第一种方法是什么呢?就是 pros, 好这种方法,这个呢是呃,子组件呢,它可以通过 pros 呢来接收副组件的数数据,明白了吗?它是单向的啊, 也就是说只能副组件向子组件传递,不能子组件向副组件传递,听明白了吧? okay, 那他是怎么做的呢?是副组件,副组件使用自定 定义属性,然后紫紫金使用,嗯嗯, props ok, 那还有什么方法呢?还有还有一个方法,咱们先来看一下 props 是怎么传的,比如说 副组件,对吧?他要先把子组件引进来,然后进行一个注册,注册完之后呢,他绑定上自定义属性 msg, 是吧? msg, 然后这里呢也绑定了 msg, 那么词组件呢,它就可以通过 props, 可以通过 props 来进行一个接收了,这个呢就是复传词,那还有什么方法呢?还可以使用 dollar r e f, 到了 r e f 呢,他就是呃被用来就是给元素或者说子组件,呃注册引用信息的,那么引用的信息呢?会被注册在副组件的 r e f s 对象上面,好吧,那他是,呃呃给大家写一下吧。 呃引用信息,引用信息,对,哎,注册三, 嗯,棒 dollar r e f s。 对,向上, ok, 那它具体是怎么用的呢?来咱们看一下 r a f 这复 组件对吧?副组件来,嗯,我们先来看啊,子组件呢?他是,哎,我看一下啊。副组件,嗯, 我们作用到了,就是这 r e f 呢,它是作用到了子组件身上,那么它指向的就是子组件的实力,在我们副组件身上它是要通过呃 r e f s 来获取到,那这里呢? r e f 是在子组件身上的, 明白吧?那么我们子组建呢,他就可以通过这个方法来拿到咱们这个给他传递过来的数据, ok, 这个呢就是,呃 r e f 船只,那么子船父呢? 子传父的话咱们用到的是 dollar e meet e m i t。 好,他呢就是绑定一个自定义事件,那么这个呢,自定义事件被执行的时候他会把参数数据传递给副组件,副组件呢需要通过事件呢来进行监听绑定子组件绑定 时间触发,呃执行, 呃,传给复字键,复字键需要用,嗯试键监听 来接收。具体怎么用的呢?我们来看这一个小案例啊。 首先是子传父,对吧?咱们用刀轮以 meet 传过来,那么父组件呢?他就要自己绑定一个事件去监听这个数据 的一个变化。好,就是这个意思啊,那么兄弟穿纸呢? 兄弟传旨的话,咱们用到的是一个事件总线啊,事件中心,哎,都可以英文的 bus, 他呢就是你有了一个新的 vivo 实力,然后用他自身的 以 meet 和 on 来实现一个中心的呃状态管理来接收和发布消息, 变回一个新的新的猎食力 二和 unit 来对数据。 ok, 那他是怎么实现的呢?哎,我们首先呢,要有一个事件种线,对吧?你有一个 will, 然后 它里面有一文的 bus, 对吧?好,然后呢,我 a 组件要给 b 组件 传递数据,就要用英文的 bus dollar 已 met 已 met 给它传,是吧?然后这里我事件触发了它,那么在 b 组件里面呢,我们就要用 dollar on 来 接收这个参数,然后让它显示出来,就是这个样子。 ok, 那么这个呢,就是,呃,以 meet 呃这个 bus 英文的 bus 来进行传旨的。 那么 vivox 呢?它适用于各种传直呃方式,因为它是数据共享吗?对吧?这里呢,咱们就不再过多的介绍了。好,那么这些呢,就是可以来实现 vivo 组建之间的一个通信的一个内容了。

其实我们在实际的开发当中呢,我们不太会去使用这个原声的 a p i, 其实原声 a p i 里面呢,功能是绝对齐全的,大家可以去看这个 m d n 的文档,这里边有完整的就是它里边的用法啊,一些属性啊,方法其实也不多啊,也不多,但它功能肯定是齐全的,但为什么我们平时不太呃喜欢使用这个原声的 a p i 呢? 原声的接口呢,虽然简单,但是呢在实际应用中啊,会造成很多的麻烦。什么麻烦呢?比方说哈,我们现在考虑一个聊天场景这个页面呢,他有聊天,有实时聊天,同时呢也有开线, 于是呢,可能我们服务器啊,当然客户端那边也可能不断的发送消息给服务器,服务器呢,那边呢,也可能有不同,不停的有新消息过来,那么他的消息呢,比方说发了这么一些内容,你看一下,你能看懂他啥意思吗?这些内容全部全部在哪里接收,所以全部在 unic 里边接收,对吧?这里所有的消息都在这里统一接收,那这个接收消息到底是什么消息,你分不 清楚啊?那么这个数据就会造成这样的一个问题,连接双方可以在任何时候任发送任何的数据类型数据,另一方呢,必须要清楚这个数据到底是什么东西,对吧?那么福气可能可能给我发的是聊天啊,聊天的时候有哪些,聊天室里面有哪些人,对吧?然后呢,也有可能发的是一一个用户的发布的一个新的聊天内容, 也有可能呢发布的是呃,那个 k 线的最新价格,也有可能呢,有人离开了那个聊天室,那么他会把个聊天室里面的人重新更新,更新之后呢,再重新发给我们,就你分不清楚, 那么回忆一下啊,像如果说我们以前学的 atp, 那么 atp 是如何来解决这个问题的? atp 解决,解决这个问题的话是不是非常简单?怎么解决?是通过 pass 解决,你请求不同的路径,那么就表示你要不同的东西,对吧?这里是登录把,这里是获得新闻列表,通过路径来进行区分,但是很严 遗憾的是脱离了 attp 协议了,现在他没有路径了。哪有路径?他这个东西你看一下我们这里,那村口这里哪有什么路径啊?一旦握手完成之后就是全是这种消息了,哪有什么路径呢?什么头啊?那些东西全部没了啊,只有握手阶段在用 attp 协议的时候才有一个头,握手完成之后的消息再也没有什么头啊。题啊,这些东西都没有了, 那我如何来区分呢?朋友们可以想想办法啊。其实这个办法呢还是挺好想的,最简单的办法就是使用一些第三方库来帮我们解决这个问题。这个第三方库是什么呢? socket i o 啊,这是一个非常有名的微博收费者的第三方库,他是这样处理的啊,把不同的消息呢放到不同的事件里边。他这个事件呢,有哪些事件你需要自行约定?服务器跟客户端之间需要自行约定,他通过监听和触发事件来实现对不同消息的处理。什么意思?我现在下面一张图啊,比方说客户端这边他监听了三个事件, 那么我们这里比方说客户端和服务器之间约定了,我们一共有三个时间,一个是成员更新,就聊天室里边有哪些人啊?然后呢?是监听聊天消息,有没有新的聊天消息过来,然后呢监听最新的价格,贴心的最新价格,约定了有这么三个时间,客户端这边负责什么?负责监听 好服务器那边呢?就负责触发事件。触发事件什么意思?就是发送消息的时候呢?顺带我告诉你这个消息是哪个事件的, 那么比方说这个消息他就告诉你,哎,看这个颜色啊,我就告诉你这是一个成员共情世界,于是这个消息发到客户端那边,客户端那边就会触发这个事件的处理。客户端那边他写的代码呢?尾代码啊,可能是这个样子,也说服务器在触发时间,客户端在监听时间啊,服务器触发事件本质上就是发一个消息过来,附带一个事件类型, 那么他就会触发到这个事件,这个事件就会运行这个函数,对吧?然后第二次发了一个,你好,这是一个聊天消息事件,他就会触发这个函数。而第三次呢, 发了一个最新价格,他就会触发这个。第四次呢,发送那个又是一个成员更新,他又会触发成员更新这个,这个函数啊,他是这么一种逻辑,那是不是所有的事件都是客户端监听服务器触发呢?不是的,完全有可能,非常非常有可能服客户端那边也会发消息给服务器,对吧?那么客户端发消息给服务器,那就是客户端触发事件, 服务器又在监听客户端的时间,对吧?这双方他们地位是一样的,不存在说谁高一点,谁低一点,地位完全是一样的。所以说我们在一个微博 socket 的典型场景里边啊,像这种 socket io 的典型场景里边, 任何一方都有可能既监听事件,监听对方的事件,也会自己触发事件,自己发送消息。监听就是收,触发就是发啊,你理解清楚这个东西就行了。那么这样子做了过后呢,这个模型就比较完善了啊,我们就可以利用这种事件的机制,对不同的消息进行不同的处理,那么这个事件是 首要客户端和服务器双方事先约定好,那么这里呢,我们看看一下我们的聊天室接口,握手完成之后呢,他就靠事件啊,事件,你看这里有这么一些事件,需要在接口文档里边,或者是双方私下把他事件约定好。 sopetio 啊,就就这么一个第三方库,他就是实现这么一个效果,他为了实现这些要求呢,他对消息的格式啊,进行了特殊的处理, 他的格式呢,可能跟大家想象的不是一个普通的对象那么简单啊,他做了一些特殊的处理,那我说这一点是什么意思呢?就是如果说你服务器使用了 sokisio 这个库来进行触发事件发送消息,你客户端那边也必须使用这个库 啊。同样道理,你客户端那边是用 socket i o 来发送消息,服务器也必须使用 socket i o 啊,不能,不能说服务器用这个客户端就用这个,理论上是可以的啊,因为我 socket i o 本质上也就在调用这个,这个 a p i 理论上是可以的,但是这个就很麻烦了,因为 你要理解为手机 io 的他那个消息格式,那个很复杂的消息格式是怎么组成的啊,就有点分析就更麻烦了,所以说要用的话就双方一起使用,使用这个手机的 io 其实是非常简单的啊。这里呢,我先给大家说一下手机的 io 的一些注意的事项。使用的时候呢,我们要自行的约定事件,那么肯定要给事件取名字,但是有一些名字呢,你不能取, 有一些名字他是已经定义好的,叫做 message 啊,让 conte 这种名字有些特殊的名字啊,比方说这个 message 呢,就表示他对应到这个 websoke 里边的这种 message 啊,所以说有些事件名字呢是不能用的, 那我们在取事件的名字的时候呢,我们一般来说会加一个前缀,或者是你这个工程的名字啊,或者是怎么样,那我这里呢,比方说加一个多乱符号,这样子,避免跟那些预先定义好的事件名字发生冲突。把这个地方我给大家说一下。另外个地方大家了解一下, socket io 啊,功能非常强大呃,它不仅支持 服务器,还支持客户端,都支持啊,同时呢,他还对一版本的浏览器进行了兼容处理,就是如果说他发现这个版本,你这个浏览器版本太老了,比方说现在什么 i 浏览器,对吧?像版本太老的浏览器呢,如果说你不支持,我也不 socket, 那怎么办呢?他会转而使用长文询, 整个的那个 a p i 都是一样的,就是你不用改带嘛,他会转而使在内部,转而使用长轮循,他会有判断的啊。 然后手机的 io 还有很多的高级功能可以参与官方文章啊,我们这节课就不愁了,关注都已剪辑号的同学打断一下啊,我是袁老师,总听我讲短视频,这回呢,来听听我讲的大课。 我给大伙呢专门录制了一套大吃课,现在呢,免费送给你们,不管你手上现在看的是什么样的资料,都应该先停下来,先来看一看我这套大吃课。一方面呢,这套课程里边的内容都是前端最核心的 知识,其他的知识都是在这个基础上生长出来的,你先掌握好了这个,再学啥都事半功倍。而且呢,自此以后,你对前端技术的理解不会存在任何的障碍。 另一方面呢,这套课还能够提升你的眼光,让你具备分辨好坏的能力。看过大师课之后啊,有一些不入流的资料,课程 博客论坛你就看不上眼了,这种能分辨好坏的能力,也能够为你将来的学习省下不少的时间。所以呢,还没有领到课程的同学,赶快抓住免费领取的机会,进评论区第一条,加入粉丝群,然后根据提示领取就可以了。

大家好,我是图立高的北明,今天我来聊聊这道面试题啊,什么是微服务?哎,微服务之间是如何独立通讯的呢? 首先我们来讲第一个什么是微服务?那么一般我们通常去定义微服务,他指的是我们开发应用所用的一种架构形式,我们或者是说把微服务称之为我们的一种架构风格,那么他也是我们 soa 架构的一种变体啊, 那么我们可以去通过微服务可以把我们一些大型的一些单体用拆分成多个独立的组件,那么每一个组件呢,他都有他自己的一个责任领域, 同时呢,我们每一个组件他都能够去独立部署,那么我们每一个组件之间呢,他是松藕合的,当我们再去处理我们用户的一个请求的时候,哎,那么我们基于我们微服应用,他可能内部呢会调用许多的微服,当我们再去处理一个用户的请求的时候,哎, 那么基于我们微服务的一些应用呢,那么他内部可能会去调许多的微服务来生成一个响应。好,那么我们微服务的一些优势是什么呢?我们再来讲讲。首先第一个敏捷性, 当我们以往的单体应用拆分成我们的微服务了之后,哎,我们每一个微服务他都可以去形成一个小型的独立团队,每一个团队呢只负责自己的一个模块, 这样做的一个好处是能够更加独立和更加快速的去开发我们的任务,他能够去缩短我们的一个开发周期时间,而且我们在吞吐量这一侧也能够得到比较明显的一个收益。 那么第二个灵活扩展,我们可以去通过微服去独立扩展我们各个服务,然后去满足我们应用程序的一些需求。他这样所带来的一个好处是,哎,我们能够去适当的去调整我们基础设施的一些需求,比如说我们服务器啊等等。 当我们的一个并发量持续激增的时候,哎,他还能够保持一个可用性,我们可以横向水平的去扩展我们的服务。那么第三个轻松步数,哎,我们微服务呢,他是支持我们的持续提升和我们的持续交付的,也就是说我们的 csd 他可以去轻松的尝试一些新型的想法, 他的一个试错成本呢是比较低的,当我们出现问题的时候,哎,我们去进行回滚,速度也是非常的快。而那么第四个技术自由,在我们传统的单体架构里面,我们的后端服务如果说我们只用加瓦开发的话,哎,那么我们所有的新型业务呢,都只能用加瓦去开发。 当然我们也能够通过 gni 的方式去写一些 c 呀,或者是说写一些 c 加加的代码,但是他在写业务方面还是不如我们的加油那么好用。当我们拆分成了我们的微服务了之后,哎,我们那么我们就可以不用去遵循这种方案了,那么我们可 这个团队呢,都能选择他们业务册最适合的一门编程语言来去解决他们的一些问题,不论是我们的娇娃 pass 啊,购物 pgp, 那么我们就都可以用了。 来讲第五个可重复使用的代码,当我们把我们的单体架构拆分成多个小型的哎,且明确定义的模块,那么我们在团队里面呢,那么我们的每一个模块,他能用于我们的多种目的,也就是说能够去复用。 当我们团队里面有了一些新业务的时候,哎,我们能够去复印我们以往的一些模块,比如说我们的用户管理等等等等,我们不需要从头去开始写,而这有一个弹性, 在以往我们的架构里面,当我们的一个组件出现了问题的时候,哎,我们整个程序是不是都已经挂了,对吧?当我们采用我们的微服务架构,我们的一个服务出现了故障,他并不会影响我们整个整体。好,那么这个呢,就是我们微服务的一些优势, 那么我们微服务之间他是如何通讯的呢?首先来讲第一种,哎,我们可以通过同步的方式,我们就可以采用我们 rest ltdp 的协议。微服务里面呢,也是一种非常常见的协议啊,它主要呢是依赖于我们的 ltdp, 而我们的 https 在我们 springcolor 的里面,我们服务之间通讯呢,就是用的我们的 fin, 那么它就是采用的我们的 http 协议来去进行通讯的。我们来讲我们的第二种方案就是我们的 rpc, 那么我们采用我们的 rpc 协议呢,那么它会比我们 http 协议的性能呢?会高一些,像我们的 double, 像我们的 swift, 像我们的 grpc, 那么他都是我们的 rpc 协议。好,我们来讲最后一种,我们还能够通过我们的消息中间键来去进行通讯,那么它是一种异部的方式,常用的消息中间键,比如说我们的卡发卡 active mq, robytem q 和我们的 rocket mq, 那么常见的协议呢,有 a, 有 a m q p 啊,有 m q t t p 啊,有 s t o m p 啊,有叉 m p p。 那么对于消息中文件呢,我们就不在这个地方去拓展了啊,那么具体的使用呢,我们可以去看一下官方的一些文档呃,因为今年的金三银四呢,确实行情不是特别的好,那么在这里呢,我特意给大家去准备好了一份金三银四的面试宝典啊, 我们来看一下这篇文档的一个字数啊,我们可以看到在这个位置,在字数统计上面我们有九万七千字,对吧,也就是将近十万字的一个面试宝典。我们再去看一下他的一个大纲啊, 在大纲里面呢,我们是包含了我们的微服务, redis 消息对列、数据库架构设计、 java 基础进阶等等面试题啊,你们有兴趣的话,评论区扣一免费领取啊,我是一锅炖不下的北冥。今天的讲解呢,到这个地方就结束了,我们下期再见。