深入理解Link

本文详细探讨了Link框架在实际使用中遇到的问题,包括服务提供者响应超时、ConsumerService对象找不到和负载均衡时输入集合为空等。通过对Link的回顾,解释了基于接口编程、编码理解、负载均衡和方法调用的概念。讨论了并发理解,指出单线程轮询模型的限制,并提出了使用NIO进行系统改造的思路,推荐使用Netty简化网络通信。最后,文章提到了资源关闭的问题,强调正确管理Socket和线程生命周期的重要性。
摘要由CSDN通过智能技术生成

一、问题的集合

1.1启动服务提供者一直没有响应?

在这里插入图片描述

和zk 相关!

这是因为你的zk 挂了,或者你的zookeeper 没有连接成功!
因为超时时间是:
在这里插入图片描述
在这里插入图片描述

解决方案:
就是设置连接的超时时间,已经重启你的zookeeper ,2181 的端口放行

1.2找不到ConsumerService对象

发生在启动服务的消费者:
在这里插入图片描述
从ioc 容器里面无法找到该对象:
1 没有包扫描
在这里插入图片描述
2 你没有添加@Service 注解
在这里插入图片描述

1.3输入的集合为空(负载均衡时)

在这里插入图片描述
怎么引起这个原因的?
服务发现失败,没有发现服务提供者
启动的顺序或者时间相关:

  1. 你同时启动服务提供者或服务消费者
    服务提供者还没有来得及注册,你就去服务的发现,肯定为null
  2. 你先启动服务的消费者,后启动服务的提供者
    服务提供者还没有来得及注册,你就去服务的发现,肯定为null
  3. 你没有添加包扫描和注解
    能服务发现成功的原因:服务已经注册成功了,只有你看zk 上面有没有你的机器
    有同学发现没有注册成功:服务提供者启动了,但是没有注册成功

在这里插入图片描述
在这里插入图片描述
没有添加@ExposeService 或者没有包扫描也不行

二、回顾Link

2.1 基于接口编程的方式(场景)

  1. Mapper(mybatis/ plus) UserMapper-> 如何实现对数据库操作的?
    Public interface UserMapper{
    int insert(User user) ;
    }
    代理对象:
    想一想,Mybatis 底层是怎么实现的?
    在这里插入图片描述

  2. dubbo 也是如此,注入的也是代理对象

  3. link 也是如此,注入的也是代理对象

基于接口的编程方法基本上都是动态代理完成的

2.2 编码的理解

为什么需要写一个编码器?

因为socket(网络IO) 不能直接发生一个对象,只能发送字节的数组
之前我们使用jdk的序列化实现了编码器,那好不好?

Jdk的序列化效果一般,因为它序列化出来的字节数组比较大!
若能字节数组小,并且速度快,那就比jdk的序列化更好。

有: 在dubbo 里面,它使用的时Hession
大家在缓存里面:json

2.3 对于负载均衡的理解

从一个列表里面选择一个出来!
我们写的是:随机的负载均衡!
但是dubbo:轮询的,最小响应的!

2.4 对方法调用的理解

在这里插入图片描述

对于服务的提供者而言:它会某种方法,他具备某种功能,->有实现类->我就可以直接调用实现类对象(本地调用)
对于服务的消费者而言:他需要使用某种方法/功能(接口的定义),但是他不会。,只有接口->只能去求别人(远程调用)

本地调用和远程调用的相同点都是:调用某个方法,得到一个结果!
调用某个方法:必须的参数:

  1. 方法的名称
  2. 方法的参数对象
  3. 接口的名称

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值