Fork me on GitHub
雨正来【一路奔跑的人】


  • 首页

  • 归档

  • 分类

  • 标签

  • top

  • 关于

  • 搜索

RPC (Remote Procedur call ) 远程服务调用

发表于 2020-03-09 | | 阅读次数:
| 字数统计: 1.7k

RPC (Remote Procedur call ) 远程服务调用

什么是rpc?

举个小河上的桥例子.

rpc的作用?
  • 屏蔽远程调用和本地的区别,让我们感觉像本地调用
  • 隐藏底层网络通信的复杂性
联想网络通信本质是啥?

netty 网络通信的框架

一个完整的rpc会涉及到哪些过程?
  • 数据传输,保证其可靠性通常都是TCP来传输,常用的http协议就是在其基础之上

  • 网络数据肯定是二进制数据,那么就会涉及到序列化和反序列化. 这里也会产生数据通信之间的协议.

    • 数据格式的约定内容叫协议.协议包括请求头和请求体.

      请求头: 一般用于身份识别、协议标识、数据大小、请求类型、序列化类型

      消息体 : 请求业务参数信息和扩展信息

协议

http 协议和rpc 协议都属于应用层协议.

Rpc 数据请求通过网络,二进制格式传输,写入本地socket 通过网卡发到另外的设备上.

数据也不是一次把数据全部传递过去,中间可能需要拆包,合并请求等(合并的前提是同一个tcp连接上的数据)

这些取决于tcp的窗口大小,系统参数配置.

协议 也是给请求一个参考边界. 例如数据大小,结尾格式等.可以联想到redis 的resp协议使用#key#value 这样的分割方式.

为啥还要rpc自己的协议? http协议不能满足要求吗? 他们有什么样的区别?

http协议属于无状态协议,而且协议本身有很多无用的内容,比如换行符、回车符、请求头导致数据多.

无法实现请求跟响应关联,每次都需要重新建立连接,响应完成关闭连接.

rpc 是如果和实现请求和响应关联的呢?

dubbo 是消费者发出请求,Atomiclong 产生消息id,,之后底层IO是异步发送消息,dubbo发送请求后,需要阻塞等待消费者返回消息.消费者id存储在map结构里,服务提供者返回附带请求消息id,之后dubbo 通过消息id就能对应上请求和响应啦.

怎么完成自定义的协议呢?

  • 协议的边界

    给一个固定大小的长度表示数据长度,之后在根据数据的大小进行读取数据.

  • 数据的序列化方式

    如果不指定序列化方式的话,那么也解析不出来数据的格式啊?

得出结论,数据大小,序列化的方式这些 固定下来的数据空间,我们可以放到协议头上,具体的请求内容放置在协议体.

bit offset 0-15 16-47 48-63 64-71 72-79 80-87
0 魔术位 数据长度 消息id 请求和响应关联 协议版本 消息类型 序列化方式
协议体 请求接口 请求参数 可变长度

可扩展的协议?

阅读全文 »

mybatis复习

发表于 2020-03-09 | | 阅读次数:
| 字数统计: 157

1
MapperScan --> MapperScannerRegistrar
1
2
3
ClassPathMapperScanner
org.mybatis.spring.mapper.ClassPathMapperScanner#setSqlSessionFactory
org.mybatis.spring.mapper.ClassPathMapperScanner#setSqlSessionTemplate
1
org.mybatis.spring.mapper.MapperScannerConfigurer#postProcessBeanDefinitionRegistry

阅读全文 »

mysql的性能优化

发表于 2020-02-10 | 分类于 mysql | | 阅读次数:
| 字数统计: 528

mysql 优化查询

show full processlist ;
关注下state 一般为query ,不排除有update 和delete 。 time 是查询时间 ,之后info 哪里会出现sql语句。
之后可以反复执行下这个sql语句看看是否因为业务代码中的锁产生的,排除偶然因素。之后就可以explain sql 看看

explain select * from jiaofu7_cms_ic.cms_activity;
基本确认这个sql性能上是有问题的,或者说不太合格的sql。

  • 确认type=ALL
  • key 是否使用索引
  • rows 影响的行数

一般情况下可以进行增加索引,但是alter table 表 add index(列)是阻塞操作的,对表的添加更新都进行阻塞操作了,这个时候要小心!
如果再次执行 explain sql

  • type =ref
  • key 和key-len 都有值
  • ref =const row=1

    show create table 表
    show table status like ‘表’

show full processlist ;

关注下state 一般为query ,不排除有update 和delete 。 time 是查询时间 ,之后info 哪里会出现sql语句。
之后可以反复执行下这个sql语句看看是否因为业务代码中的锁产生的,排除偶然因素。之后就可以explain sql 看看

explain select * from cms_activity;

基本确认这个sql性能上是有问题的,或者说不太合格的sql。
1.确认type=ALL
2 key 是否使用索引
3 rows 影响的行数

一般情况下可以进行增加索引,但是alter table 表 add index(列)是阻塞操作的,对表的添加更新都进行阻塞操作了,这个时候要小心!
show create table cms_activity;

show table status like ‘cms_activity’ ;

阅读全文 »

rocketmq学习

发表于 2019-12-12 | | 阅读次数:
| 字数统计: 149

阅读全文 »

未命名

发表于 2019-11-24 | | 阅读次数:
| 字数统计: 591

#并发编程的bug源头

cpu 内存 磁盘

核心矛盾就是三者的速度差别 cpu > 内存 > 磁盘

  • 为了解决cpu 增加缓存
  • 操作系统增加进程,线程
  • 编译器优化计算机的指令
    如果有2个线程同时访问cpu中的数据,在单核场景下A线程修改值,B就能发现,这就是可见性。但是要知道一个问题,cpu中是拿到的内存的缓存副本。
    阅读全文 »

mysql中的锁

发表于 2019-08-23 | | 阅读次数:
| 字数统计: 632

mysql中的全局锁和表锁,行锁


mysql5.5版本后,表级的锁是 MDL(metadata lock)
虽然 MDL 锁是系统默认会加的,读写不冲突.给一个表加字段,或者修改字段,或者加索引,需要扫描全表的数据.
所以给表加字段时候要多加小心.information_schema 库的 innodb_trx 表中,你可以查到当前执行中的事务。如果你要 做 DDL 变更的表刚好有长事务在执行,要考虑先暂停 DDL,或者 kill 掉这个长事务.
如果是热点表,那么除非是mysql开源的alisql 或者MariaDB.
alert table table_name wait on N add column.

在 InnoDB 中,innodb_lock_wait_timeout 的默认值是 50s,还有就是设置死锁检测innodb_deadlock_detect 默认值就是on
开启默认死锁检测的, 这样也会导致,大量并发的线程,每次都要进行检测,并发上不去的原因.cup使用率过高.

热点表,关闭掉死锁的检测是业务有损的,另外一种就是控制并发度.如果没有中间件和修改源码的能力..
原理是 在同时修改一个表中的同一条记录时候,进行排队…
总之从减少修改同表同记录的次数..

阅读全文 »

kafka 复习系列-1

发表于 2019-07-19 | 分类于 消息中间键 | | 阅读次数:
| 字数统计: 212


kafka的每个分区partition 默认都有多个副本,这个副本的数量是根据broker 中配置default.replication.factor(默认大小为 1).
也可以在创建 topic 的时候通过 –replication-factor ${num} 显式指定副本的数量(副本因子)
前期在配置了auto.create.topic.enable 为 true 的时候

阅读全文 »

lambda java-8

发表于 2019-07-08 | | 阅读次数:
| 字数统计: 333


JEP126 & JSR335
> JSR 335=lambda 表达式 + 接口改进(默认方法)+ 批量数据操作
- 外部迭代VS 内部迭代
- foreach 方法的使用
- Stream API
- 中间与终点

接口与抽象类到底有哪些不同?
相同点

  1. 都是抽象类型;
  2. 都可以有实现方法(以前接口不行);
  3. 都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实现)
    不同点
  4. 抽象类不可以多重继承,接口可以(无论是多重类型继承还是多重行为继承);
  5. 抽象类和接口所反映出的设计理念不同。其实抽象类表示的是 “is-a” 关系,接口表示的是 “like-a” 关系;
  6. 接口中定义的变量默认是 public static final 型,且必须给其初值,所以实现类中不能改变其值;抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。
    阅读全文 »

使用 maven 必知必会

发表于 2019-06-24 | 分类于 maven | | 阅读次数:
| 字数统计: 328

maven的scope依赖范围

  • complies 适用于所有阶段(开发、测试、部署、运行),本 jar 会一直存在所有阶段。 默认值
  • provided 开发编译阶段
  • runtime 运行时 数据库驱动
  • test 测试阶段
  • system 类似于provided ,需要显式提供包含依赖的 jar,Maven 不会在 Repository 中查找它。

    maven的传递性

    最短路径原则,例如A依赖B,B依赖C , c中有一个1版本的jar ,B中1版本的jar排除,并增加了2版本的jar ,那么A中依赖的是2版本的jar
    路径相同,先声明优先引用. A依赖B和C ,那么B和C 中都有一个jar 版本分别为1和2,那么需要看A 先声明引用了哪个,如果是B那么jar版本就是1,否则为2.
阅读全文 »

centos 环境配置

发表于 2019-06-23 | 分类于 linux | | 阅读次数:
| 字数统计: 618
虚拟机搭建环境

首先换阿里的yum 源

centos7 修改 yum 源为阿里源,某下网络下速度比较快 首先是到 yum 源设置文件夹里
cd /etc/yum.repos.d
接着备份旧的配置文件
sudo mv CentOS-Base.repo CentOS-Base.repo.bak
下载阿里源的文件
sudo wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
清理缓存
yum clean all
重新生成缓存
yum makecache

scp /home/tmp.log root@host_ip:/root/tmp.log

/home/tmp.log 表示本地上准备上传文件的路径和文件名;

:/root/tmp.log 表示保存在远程服务器上目录和文件名;

4、将本地目录上传到服务器上

scp -P 2222 -r /home/tmp/ root@host_ip:/root/tmp/

/home/tmp/ 表示准备要上传的目录;
5、可能有用的几个参数 :

-v 和大多数 linux 命令中的 - v 意思一样,用来显示进度,可以用来查看连接,认证,或是配置错误;

-C 使能压缩选项;

-4 强行使用 IPV4 地址;

-6 强行使用 IPV6 地址;

-P 选择端口,注意 - p 已经被 rcp 使用;
-r 递归查找;
所以在传输文件夹的时候,要使用 scp -r folder_dir user@host:folder_dir 来传输!!!

export JAVA_HOME=/usr/local/jdk1.8.0_211
export JRE_HOME=/usr/local/jdk1.8.0_211/jre
export MAVEN_HOME=/data/share-vm/maven3
export PATH=${JAVA_HOME}/bin:$PATH
export PATH=${MAVEN_HOME}/bin:$PATH

安装完毕基本东西,
uname-r
yum install docker
service docker start
docker version
sysctl enable docker

docker rm $(docker ps -q -f status=exited)

安装 docker-compose

需要先安装企业版 linux 附加包(epel)

$   yum -y install epel-release

安装 pip

$ yum -y install python-pip

更新 pip

$ pip install –upgrade pip
//国内原加速
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple –upgrade pip

安装 docker-compose

$ pip install docker-compose
//国内原加速
$ pip install -i https://pypi.tuna.tsinghua.edu.cn/simple docker-compose

查看 docker-compose 版本信息

$ docker-compose –version

mysql的compose 文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
version: '3.1'
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
ports:
- 3306:3306
volumes:
- ./data:/var/lib/mysql

adminer:
image: adminer
restart: always
ports:
- 8080:8080

阅读全文 »
12…7
lancecong

lancecong

68 日志
9 分类
32 标签
点下试试
  • 😆 网易云音乐 😆
  • Coldplay Official Website
  • 获取 Elon Musk 的新闻
  • 尼古拉·特斯拉:发明了现代世界的人
© 2017 — 2020 lancecong
微信扫一扫,call me !
0%