All

rpc-commons

这个模块主要是定义一些通信协议类,工具类。

rpc-register

注册中心,这里使用zookeeper来实现。

生产者在启动服务时,将自己实现的服务注册到注册中心。

消费者调用服务时,来注册中心查找,返回调用服务实例的地址信息。

并且为了适应不同的注册实现,我们将功能定义为接口,在替换实现时在配置文件中进行替换即可。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
public interface RpcRegister {
	/**
	 * 注册服务
	 * @param serviceDescriptor
	 * @param responseServiceDescription
	 */
	void register(ServiceDescriptor serviceDescriptor, ResponseServiceDescription responseServiceDescription);
	/**
	 * 根据服务名称查询实例地址
	 * @param serviceDescriptor
	 * @return
	 */
	ResponseServiceDescription lookup(ServiceDescriptor serviceDescriptor);
}

rpc-transport

这个模块是有在观看消息队列高手课中的rpc示例完成的。

网络传输模块,这里使用netty来进行实现。

生产者调用来指定端口启动服务。

1
2
3
4
public interface TransportServer {
	void start(int port) throws InterruptedException;
	void stop();
}

题目描述

给定一个单链表,其中的元素按升序排序,将其转换为高度平衡的二叉搜索树。

本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 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的项目的调用流程:

  1. 通过@Autoware注解注入另外的类
  2. 在需要调用的地方直接调用即可

当需要调用其他功能的接口时,比如调用其他公司的接口,或者调用自己公司内部的其他业务或功能接口。这时一般需要使用http来进行网络调用。

那么使用http调用其他的功能接口算不算是rpc调用呢?我感觉也是算的,因为这也是一种通过网络从计算机程序上请求服务的过程。

只不过由于调用的功能不严格意义上属于一个大项目,所以不算一个程序直接的内部调用,所以这里只讨论 一个大项目拆分成不同模块后,不同模块直接调用的过程。

RPC是原来一个程序分为多个不同的程序,分别运行在不同的jvm上。部署在多台机器上后,就涉及到网络通信,需要将调用的信息发送到被调用的机器上,调用完成后再进行返回。

rpc的流程图如下所示,

RPC调用流程

牵扯到网络请求,那么就可以使用之前的http请求,但是由于http请求需要封装一些对于我们而言无用的信息,所以使用http的方式可以采用,比如springcloud就采用了http来进行通信的方式,而这次我准备使用其他的网络通信方式,这一篇中先使用bio来实现网络通信。

还有一个序列化过程,它主要是将信息进行编解码,然后通过网络传输,因为网络传输中都是传输的二进制字节码文件,所以我们需要定义规则,将信息进行转换,消费者发送出去的信息生产者能明白其调用的内容,消费者也能明白生产者返回的信息。这一篇文章中也不去使用复杂的序列化方式,直接实现java中的Serializable接口。

二分查找及几种变形
2020 年 03 月 05 日

二分查找

前置要求:数组有序

时间复杂度:log(n)

几种常见的问题:

  1. 数组中查找target
  2. 数组中有重复,查找第一个target
  3. 数组中有重复,查找最后一个target
  4. 查找等于target或第一个小于target的值
  5. 查找等于target或第一个大于target的值
几种排序方式
2020 年 03 月 04 日

这篇文章主要记录几种排序方式,描述他们的排序过程,复杂度,代码实现,使用比较。

主要包括以下几种:

二叉树的层序遍历
2020 年 03 月 03 日
二叉树展开为链表
2020 年 03 月 03 日
树的几种遍历方式
2020 年 03 月 03 日

主要记录一下对于二叉树,进行遍历的几种方式,包括:

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 深度优先遍历
  • 广度优先遍历

我们以下面的这个二叉树结构为例,分别描述一下这几种遍历的方式有什么不同,以及给出java实现的代码。