
分布式通信
文章平均质量分 70
本人开发基于RPC的分布式TCP网络通信框架项目,用C++实现,项目基于muduo高性能网络库+Protobuf开发。用ZooKeeper分布式一致性协调服务应用以及编程。
林林林ZEYU
坚持
展开
-
897-了解微服务网关
一、前言随着微服务的兴起,基于其业务耦合性低、负载能力强、服务边界清晰等优点,大家纷纷使用微服务架构来实现新系统或进行老系统的改造。微服务在带来诸多好处的同时,也有一些问题需要解决,比如:如何做到有效拆分、减少服务间调用,如何统一管理所有服务的接口,如何进行自动化部署等。本文阐述微服务的API网关的一些主要功能,并例举了几种常用的网关,最后结合spring cloud微服务框架对网关做一些简要的论述。二、API网关简介API网关,顾名思义,是统一管理API的一个网络关口、通道,是整个微服务平台所有请求原创 2021-12-04 20:52:16 · 438 阅读 · 0 评论 -
888-CAP定理
CAP定理在分布式系统的发展中,影响最大的莫过于CAP定理了,是分布式系统发展的理论基石。1、2000年,加州大学的计算机科学家 Eric Brewer提出了CAP猜想2、2002 年,麻省理工学院的 Seth Gilbert 和 Nancy Lynch 从理论上证明了 CAP 猜想,CAP猜想成为了CAP定理「CAP定理,简单来说就是分布式系统不可能同时满足Consistency 一致性、Availability 可用性、Partition Tolerance 分区容错性三个要素」Consis原创 2021-11-30 21:17:20 · 260 阅读 · 0 评论 -
837-学习分布式锁
学习分布式锁从最初的单机部署,到我们现在的分布式,微服务,随着开发场景越来越复杂,也随之产生了很多很多以前没有遇到过的问题,比如今天我们今天的话题-----分布式锁,而这个话题也可以说是面试中必问的一个问题了,当然,实现分布式锁的方式有很多种,比如mysql,zookeeper等,读完这篇文章你将学到:什么是分布式锁?简而言之,就是控制我们现在分布式环境下某一个资源的唯一开关,它是控制分布式系统之间互斥访问共享资源的一种方式。为什么会出现分布式锁?说为何会分布式锁之前我们先给大家说下我们经常见的单原创 2021-11-19 09:50:32 · 372 阅读 · 0 评论 -
661-Zookeeper总结
Zookeeper总结1.Zookeeper 是什么?能做什么?Zookeeper 是一个开源的,是用于维护配置信息,命名,提供分布式同步和提供组服务的集中式服务。可以基于 Zookeeper 实现诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Master 选举、分布式锁和分布式队列等功能。Zookeeper 最常用的一个使用场景就是作为注册中心,生产者将自己提供的服务注册到 Zookeeper,然后消费者从 Zookeeper 中拿到生产者的服务列表信息,然后再去调用生产原创 2021-09-29 20:55:01 · 305 阅读 · 0 评论 -
380-mprpc框架项目总结
首先,我们在使用框架的时候,框架体现出3个模块。1个是RPC服务的调用方(mprpcchanne)。1个是RPC服务的提供方(mprpcprovider)。1个是ZooKeeper,作为服务配置中心。提供服务的节点先启动,和ZK创建会话(session),然后在里面维护了一个RPC方法的map表,想发布服务会调用notifyservice函数,把发布服务的对象和RPC方法写到map表,然后通过ZKclient把这些服务和方法都注册在ZK上,放在相应的znode节点,可以看一下图右边的根目录形式的写.原创 2021-08-03 19:49:37 · 1105 阅读 · 0 评论 -
379-封装zookeeper的客户端类和在项目上的实践
封装zookeeper的客户端类我们在src的include下创建头文件:zookeeperutil.h#pragma once#include <semaphore.h>#include <zookeeper/zookeeper.h>#include <string>//封装的zk客户端类class ZkClient{public: ZkClient(); ~ZkClient(); //zkclient启动连接zkserve原创 2021-08-03 19:10:51 · 543 阅读 · 0 评论 -
378-Zookeeper分布式协调服务
Zookeeper是在分布式环境中应用非常广泛,它的优秀功能很多,比如分布式环境中全局命名服务,服务注册中心,全局分布式锁(针对临界区代码段的编写,假如,我们是一个分布式系统,两个服务分别运行在两台机器上,这两台机器要竞争一个资源,这个资源是不能让同时2个RPC节点去访问的,这时候需要一把分布式锁)等等。Zookeeper相当于动物园的管理员,也负责协调各种动物之间的。ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是大数据生态中的重要组件原创 2021-08-03 11:35:10 · 751 阅读 · 0 评论 -
377-logger日志系统设计与实现
logger日志系统的设计图中画圆圈的是我们实现的mprpc框架,这个框架是给别人使用的,把本地的服务发布成远程的RPC服务,框架里最重要的两个成员就是RpcProvider和RpcChannel,他们在运行的过程中会有很多正常的输出信息和错误的信息,我们不可能都cout它们到屏幕上,因为运行时间长了,屏幕上输出的信息特别多,如果万一有什么问题,我们也不好定位,真正用起来的话不方便。所以,一般出问题,我们最直接的方式就是看日志!!!日志可以记录正常软件运行过程中出现的信息和错误的信息,当我们定位问题,原创 2021-08-02 21:08:15 · 807 阅读 · 0 评论 -
376-RpcController控制模块的实现和使用
框架需要用到RpcController的地方下图是RPC服务的调用方的调用步骤实际上,这个RPC请求不一定是成功的,当我们用代理对象stub调用GetFriendList方法的时候,最终都是转到channel的CallMethod方法里面,CallMethod就是做我们RPC请求的序列化,网络发送,接收响应,反序列化。才体现RPC的调用和响应完成了,然后我们才调用response.result().errcode()看响应码。在CallMethod方法里面,每个步骤都有判断。如果一开始的获取参原创 2021-08-02 12:09:19 · 895 阅读 · 0 评论 -
375-mprpc框架的应用示例
mprpc框架的应用示例1(新增register注册)我们在之前演示了登录。现在我们演示一下注册!我们打开user.proto新增 注册(register)syntax = "proto3";package fixbug;option cc_generic_services = true;//开启message ResultCode//打包失败类{ int32 errcode = 1; //错误代码 bytes errmsg = 2;//错误消息}messag原创 2021-08-02 11:13:29 · 396 阅读 · 0 评论 -
374-点对点的RPC通信功能测试
我们先对之前的项目工程编译点对点的RPC通信功能测试我们打开2个终端我们先启动provider然后我们启动consumer运行成功因为我们的login函数设置返回的是false原创 2021-08-02 09:55:29 · 301 阅读 · 0 评论 -
373-实现RPC方法的调用过程(RpcChannel)
我们先完善好calluserservice.cc(RPC消费者)#include <iostream>#include "mprpcapplication.h"#include "user.pb.h"#include "mprpcchannel.h"int main(int argc, char **argv){ //整个程序启动以后,想使用mprpc框架来享受rpc服务调用,一定需要先调用框架的初始化函数(只初始化一次) MprpcApplication::Ini原创 2021-08-01 11:32:30 · 524 阅读 · 0 评论 -
372-RpcChannel的调用过程
RPC调用方(caller)的调用(消费)过程caller就是按照提供rpc服务的那一方(callee)提供的proto协议,发起调用我们在caller下创建文件:calluserservice.ccUserServiceRpc_Stub的构造函数必须要有RpcChannel参数我们知道,里面那些方法最终都是调用channel的CallMethod方法。这个RpcChannel是一个抽象类,new不了对象,我们得在框架上定义一个类从RpcChannel继承而来,然后重写CallMethod.原创 2021-07-31 21:55:47 · 496 阅读 · 0 评论 -
371-RpcRrovider分发rpc服务(OnMessage和Closure回调)
完善mprpcprovider.cc的OnConnection//新的socket连接回调void RpcProvider::OnConnection(const muduo::net::TcpConnectionPtr &conn){ if (!conn->connected()) { //和rpc client的连接断开了 conn->shutdown();//关闭文件描述符 }}完善mprpcprovider.c原创 2021-07-31 20:46:36 · 527 阅读 · 0 评论 -
370-开发RpcProvider的发布服务(NotifyService)
我目前完成了mprpc框架项目中的以上的功能。我作为rpcprovider的使用者,也就是rpc方法的发布方,main函数如下:首先我们init调用框架的init,然后启动一个provider,然后向provider上注册服务对象方法,即userservice的login方法,当做一个可以远程调用的rpc方法,然后启动run,run相当于是一个网络服务器。首先,如果远端有RPC请求的话,RpcProvider的网络模块(muduo)会帮助我们去接收数据,就是接收一个RPC请求,RPC请求里面有.原创 2021-07-31 13:01:43 · 829 阅读 · 0 评论 -
369-开发RpcProvider的网络服务
我的项目代码工程目录如下:开发RpcProvider的网络服务(muduo库)我们首先更改src的CMakeLists.txt的内容为:aux_source_directory(. SRC_LIST)add_library(mprpc ${SRC_LIST})target_link_libraries(mprpc muduo_net muduo_base pthread )我们打开mprpcprovider.h#include <muduo/net/TcpServer.h>原创 2021-07-31 10:45:49 · 369 阅读 · 0 评论 -
368-boost库和muduo库的安装(Ubuntu)
muduo库是基于boost开发的,所以需要先在Linux平台上安装boost库。boost库的安装Boost::asio还没有正式的成为C++标准库,因此如果使用Boost::asio进行网络I/O编程,需要先在当前系统平台上(linux)安装boost库相关的头文件和lib库文件,我们采用的是boost库源码编译安装。WIndows和Linux平台的boost源码包下载云盘链接(zip是Windows版,tar.gz是Linux版,你也可以去boost官网下载最新版本):链接:https://p原创 2021-07-31 09:35:00 · 640 阅读 · 0 评论 -
367-mprpc框架的配置文件加载
我们先把之前的项目代码工程编译好,然后进入bin里面,执行./provider显示我们之前编的代码正确了!接下来,我们开始mprpc框架的配置文件加载我们在src的include中创建头文件:mprpcconfig.h#pragma once//防止头文件被重复包含 #include<unordered_map>//键值对,方便读取这个key值项 ,配置文件不会一直改变 #include<string>//用于存放rpcserverip rpcserver原创 2021-07-30 20:49:43 · 409 阅读 · 0 评论 -
366-完成mprpc框架的初始化操作
完成 MprpcApplication::Init(argc, argv);我们打开userservice.cc中,查看主函数int main(int argc, char **argv)//需要配置文件{ //调用框架的初始化操作 MprpcApplication::Init(argc, argv);//整个框架的初始化操作,日志,配置等等。 //provider是一个rpc网络的服务对象。把UserService对象发布到rpc节点上。 RpcProvider p原创 2021-07-30 19:24:24 · 295 阅读 · 0 评论 -
365-mprpc框架项目的静态库编译
首先完善mprpc目录下的CMakeLists.txt然后我们在src底下增加一个CMakeLists.txtaux_source_directory(. SRC_LIST)add_library(mprpc ${SRC_LIST})然后我们打开callee下的CMakeLists.txtset(SRC_LIST userservice.cc ../user.pb.cc)add_executable(provider ${SRC_LIST})target_link_libraries(原创 2021-07-30 13:45:32 · 293 阅读 · 0 评论 -
364-mprpc框架基础类的设计
mprpc框架怎么用?在上一节,我们完成了如何把本地服务发布成RPC服务。我们打开example下callee下的userservice.cc#include <iostream>#include <string>#include "user.pb.h"/*UserService原来是一个本地服务,提供了两个进程内的本地方法,Login和GetFriendLists*/class UserService : public fixbug::UserServiceRp原创 2021-07-30 12:51:32 · 475 阅读 · 0 评论 -
363-如何把本地服务发布成RPC服务
如何本地服务发布成RPC服务?example文件夹作为我们框架项目的使用实例,在example文件夹下创建callee和caller两个文件夹callee是RPC服务的提供者。我在callee创建一个文件:userservice.cc我们有没有这样一个框架,把这个UserService这个类生成的Login方法直接变成一个RPC远程方法?让在其他进程,其他机器都可以调用这个方法?在这里我们使用protobuf进行参数和调用方法标识的序列化和反序列化。我们在example下再建一个文件:use原创 2021-07-30 10:46:04 · 654 阅读 · 0 评论 -
358-protobuf的实践
关于protobuf的安装配置在之前的博客已经阐述。接下来我们打开Ubuntu下的vscode下图是我的项目代码工程。我们在test创建protobuf文件夹。然后在protobuf文件下创建main.cc和test.proto进行我们的实践。protobuf的实践(1)我们先在test.proto定义消息类型(message)注意:里面的类型都是谷歌protobuf定义的类型,和C++的类型相似我们用bytes定义字符串类型,多字节存储,处理的是字节,省时省消耗syntax = "pro原创 2021-07-29 13:38:33 · 728 阅读 · 0 评论 -
357-项目代码工程部署(mprpc)
我的项目代码工程结构(mprpc)Ubuntu打开VScode我的项目名称为 mprpc项目工程目录如下:bin:可执行文件 build:项目编译文件lib:项目库文件src:源文件test:测试代码example:框架代码使用范例CMakeLists.txt:顶层的cmake文件README.md:项目自述文件autobuild.sh:一键编译脚本...原创 2021-07-29 10:32:00 · 479 阅读 · 0 评论 -
356-protobuf安装配置(Ubuntu)
Protobuf介绍protobuf(protocol buffer)是google 的一种数据交换的格式,它独立于平台语言。 google 提供了protobuf多种语言的实现:java、c#、c++、go 和 python,每一种实现都包含了相应语言的编译器以及库文件。 由于它是一种二进制的格式,比使用 xml(20倍) 、json(10倍)进行数据交换快许多。可以把它用于分布式应用之间的数据通信或者异构环境下的数据交换。作为一种效率和兼容性都很优秀的二进制数据传输格式,可以用于诸如网络传输、配置文件原创 2021-07-29 10:13:51 · 591 阅读 · 0 评论 -
349-RPC通信原理和项目解析
我们最终合理地通过对大型软件的合理划分,划分成不同模块,按需求(硬件需求,高并发需求)进行分布式,一台机器上的模块不能单独构成聊天系统,所有机器上的模块构成一个聊天系统。RPC通信原理RPC(Remote Procedure Call Protocol)远程过程调用协议。...原创 2021-07-28 12:49:49 · 554 阅读 · 0 评论 -
348-单机,集群和分布式
集群:每一台服务器独立运行一个工程的所有模块。分布式:一个工程拆分了很多模块,每一个模块独立部署运行在一个服务器主机上,所有服务器协同工作共同提供服务,每一台服务器称作分布式的一个节点,根据节点的并发要求,对一个节点可以再做节点模块集群部署。我们以服务聊天器为例子,来讲解单机,集群,分布式单机服务器聊天服务器取名为server。把用户管理,好友管理,群组管理,消息管理,后台管理等模块构成我们的聊天服务器。每个模块都包含了很多特定的业务。特定的业务:用户管理模块有用户登录,用户注册,用户注销,用户原创 2021-07-28 10:43:18 · 618 阅读 · 0 评论