All
rpc-commons
这个模块主要是定义一些通信协议类,工具类。
rpc-register
注册中心,这里使用zookeeper来实现。
生产者在启动服务时,将自己实现的服务注册到注册中心。
消费者调用服务时,来注册中心查找,返回调用服务实例的地址信息。
并且为了适应不同的注册实现,我们将功能定义为接口,在替换实现时在配置文件中进行替换即可。
|
|
rpc-transport
这个模块是有在观看消息队列高手课中的rpc示例完成的。
网络传输模块,这里使用netty来进行实现。
生产者调用来指定端口启动服务。
|
|
题目描述
给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。
本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1。
示例:
给定的有序链表: [-10, -3, 0, 5, 9],
一个可能的答案是:[0, -3, 9, -10, null, 5], 它可以表示下面这个高度平衡二叉搜索树:
0 -3 9 -10 5答案不唯一,只要满足平常二叉树的特性即可。
题目中给出的数组已经按升序排序,我们需要将其转换为平衡二叉树。
前言
现在微服务体系流行,而RPC框架作为微服务中重要的一环,为了弄明白RPC的整体过程,决定要自己动手实现一个RPC框架。
我们先了解一下什么是RPC,RPC全程是Remote Procedure Call,翻译过来就是远程过程调用,我们先思考一下没有使用rpc的项目的调用流程:
- 通过
@Autoware注解注入另外的类 - 在需要调用的地方直接调用即可
当需要调用其他功能的接口时,比如调用其他公司的接口,或者调用自己公司内部的其他业务或功能接口。这时一般需要使用http来进行网络调用。
那么使用http调用其他的功能接口算不算是rpc调用呢?我感觉也是算的,因为这也是一种通过网络从计算机程序上请求服务的过程。
只不过由于调用的功能不严格意义上属于一个大项目,所以不算一个程序直接的内部调用,所以这里只讨论 一个大项目拆分成不同模块后,不同模块直接调用的过程。
RPC是原来一个程序分为多个不同的程序,分别运行在不同的jvm上。部署在多台机器上后,就涉及到网络通信,需要将调用的信息发送到被调用的机器上,调用完成后再进行返回。
rpc的流程图如下所示,

牵扯到网络请求,那么就可以使用之前的http请求,但是由于http请求需要封装一些对于我们而言无用的信息,所以使用http的方式可以采用,比如springcloud就采用了http来进行通信的方式,而这次我准备使用其他的网络通信方式,这一篇中先使用bio来实现网络通信。
还有一个序列化过程,它主要是将信息进行编解码,然后通过网络传输,因为网络传输中都是传输的二进制字节码文件,所以我们需要定义规则,将信息进行转换,消费者发送出去的信息生产者能明白其调用的内容,消费者也能明白生产者返回的信息。这一篇文章中也不去使用复杂的序列化方式,直接实现java中的Serializable接口。
二分查找
前置要求:数组有序
时间复杂度:log(n)
几种常见的问题:
- 数组中查找target
- 数组中有重复,查找第一个target
- 数组中有重复,查找最后一个target
- 查找等于target或第一个小于target的值
- 查找等于target或第一个大于target的值
主要记录一下对于二叉树,进行遍历的几种方式,包括:
- 前序遍历
- 中序遍历
- 后序遍历
- 深度优先遍历
- 广度优先遍历
我们以下面的这个二叉树结构为例,分别描述一下这几种遍历的方式有什么不同,以及给出java实现的代码。
