一、问题的集合
1.1启动服务提供者一直没有响应?
和zk 相关!
这是因为你的zk 挂了,或者你的zookeeper 没有连接成功!
因为超时时间是:
解决方案:
就是设置连接的超时时间,已经重启你的zookeeper ,2181 的端口放行
1.2找不到ConsumerService对象
发生在启动服务的消费者:
从ioc 容器里面无法找到该对象:
1 没有包扫描
2 你没有添加@Service 注解
1.3输入的集合为空(负载均衡时)
怎么引起这个原因的?
服务发现失败,没有发现服务提供者
启动的顺序或者时间相关:
- 你同时启动服务提供者或服务消费者
服务提供者还没有来得及注册,你就去服务的发现,肯定为null - 你先启动服务的消费者,后启动服务的提供者
服务提供者还没有来得及注册,你就去服务的发现,肯定为null - 你没有添加包扫描和注解
能服务发现成功的原因:服务已经注册成功了,只有你看zk 上面有没有你的机器
有同学发现没有注册成功:服务提供者启动了,但是没有注册成功
没有添加@ExposeService 或者没有包扫描也不行
二、回顾Link
2.1 基于接口编程的方式(场景)
-
Mapper(mybatis/ plus) UserMapper-> 如何实现对数据库操作的?
Public interface UserMapper{
int insert(User user) ;
}
代理对象:
想一想,Mybatis 底层是怎么实现的?
-
dubbo 也是如此,注入的也是代理对象
-
link 也是如此,注入的也是代理对象
基于接口的编程方法基本上都是动态代理完成的
2.2 编码的理解
为什么需要写一个编码器?
因为socket(网络IO) 不能直接发生一个对象,只能发送字节的数组
之前我们使用jdk的序列化实现了编码器,那好不好?
Jdk的序列化效果一般,因为它序列化出来的字节数组比较大!
若能字节数组小,并且速度快,那就比jdk的序列化更好。
有: 在dubbo 里面,它使用的时Hession
大家在缓存里面:json
2.3 对于负载均衡的理解
从一个列表里面选择一个出来!
我们写的是:随机的负载均衡!
但是dubbo:轮询的,最小响应的!
2.4 对方法调用的理解
对于服务的提供者而言:它会某种方法,他具备某种功能,->有实现类->我就可以直接调用实现类对象(本地调用)
对于服务的消费者而言:他需要使用某种方法/功能(接口的定义),但是他不会。,只有接口->只能去求别人(远程调用)
本地调用和远程调用的相同点都是:调用某个方法,得到一个结果!
调用某个方法:必须的参数:
- 方法的名称
- 方法的参数对象
- 接口的名称
2.4.1 本地调用
我需要得到实现类的对象,就能完成调用
Object: 怎么得到该对象
Method:怎么得到该方法
method.invoker(object,args);
我们的所有对象都交给ioc 去管理了,得到对象,一般也就是从ioc 里面去获取
Ioc.getBean(接口)
方法得到:只需要方法的名称和参数就可以得到了
2.4.2 远程调用
没有实现类对象,所以无法完成调用,只能求别人调用
给别人发短信,说我需要调用你的那个方法,参数是那些,别人给你计算好了后,把答案发给你,这就是远程调用:
你->Socket->Request->localMethodInvoke->Result->Socket->你
2.5 网络的功能
网络就是一个数据的通道。具备输入和输出
服务端和客户端:服务端和客户端写数据的流程相同,但是获取输入流和输出流有点不同:
我们的socket 现在有什么问题?
2.6 谈谈对Socket 里面Io的理解?
1 serverSocket.accept(); // 接受客户端连接
2 inputStream.read(); // 从输入流里面读取数据
3 outputStream.write(); // 从输入流里面写数据
三、对并发的理解
3.1 现在的模式:
我们消费端只有一个线程去消费了提供者
While(true) 代表一直是在一个线程里面轮询
那怎么变成多线程:
3.2 就按照我们现在的代码,能不能实现一个并发的访问?
我们现在服务的消费者去调用服务提供者的方法,服务提供者里面,只有一个线程能供我们使用!
我们的服务端只有一个线程:
所以我们的服务端,是个单线程的,阻塞的方法,只能让一个服务的消费者消费完毕后,其他的消费者才能去执行!(Redis)
单线程模型并不好:因为没有利用到多核的优势,我们需要把他改进为多线程模型!
为什么redis 不改进:因为redis 是内存操作,他的速度非常快!
为什么我们需要改进,因为在我们的java 的大多数业务逻辑里面,都在数据库的操作,数据库是文件io的操作!
? 我们怎么实现一个多线程的rpc 框架?
3.3 线程池的复习:
面试的重点:(背会)
int corePoolSize :核心的线程数 -3
int maximumPoolSize: 最大的线程数 5
long keepAliveTime:线程的存活时间,当并发小了,有5 个线程,其中有的线程一直空着,空keepAliveTime ,会自动销毁线程,来释放内存,直到达到corePoolSize
TimeUnit unit :上面时间的单位
BlockingQueue