一、理论基础,项目结构(架构演进历史)

在这里插入图片描述
单体应用架构:
当网站流量很小时,我们只需要将所有功能都集中在一个应用上,这样可以节省部署节点,从而节省成本

垂直应用架构:
当流程逐渐增加,可以将应用根据业务拆分成多个应用,这些应用之间的通信机制一般为RESTful

分布式服务
当垂直应用越来越多,应用之间的交互不可避免,因此,我们可以将核心业务服务抽取出来,作为独立的服务进行部署,供多个垂直应用调用

微服务基础架构:
当服务越来越多,容量的评估,服务资源的管理等问题就需要增加一个服务调度中心来对服务进行管理。
当流量达到一定规模后,更多的问题会出现和需要我们来解决,比如注册中心,限流,熔断等功能,都需要考虑到
目前,Dubbo,SpringCloud是典型的代表

1、单体服务(All in One)

(服务内部模块访问比例不同,升级,没法按需求升级,一个模块问题,就要整个项目升级)
模块内部调用(当流量上来了,系统访问就会慢,先考虑垂直升级(扩大服务器性能,内核+内存))最大都不能了;
水平升级+堆服务器;
服务器多了:(nginx)
(还有就是数据库服务的压力(redis,主从复制,读写分离))

2、垂直拆分

在这里插入图片描述

根据项目的边界去拆分,业务模块;
一个模块一个服务,构成集群;
(Nginx反向代理,实现服务的负载均衡)
分布式节点;
节点与节点通信;
服务与服务的调用,跨JVM调用;
Apache Http Client提供服务与服务的调用
(conntroller-》service(进程内))(同一个JVM)

3、水平拆分

(SOFAboot水平与垂直以及rpc)
(controller-》service(进程与进程之间))(不同JVM)
(web,view,controller,service)
服务与服务拆分后,有各个层级,service服务层复用
(controller暴露服务接口)

服务与服务的调用(Ribbon实现负载均衡)

(服务相关问题:服务动态变化,服务的压力分配,服务的)

(Dubbo,SpringCloud)
(spring的一些产品可能不是spring创造的,只是用了一些主流框架进行封装)

1,RPC的特点

随着移动互联网的高速发展,面对不断增长的用户量及海量的请求,后端基本是规模庞大的分布式集群
其中,RPC(远程过程调用),便是其中的核心技术
RPC是一种通过网络,向远程计算机请求服务,而不需要了解其底层网络技术的协议。
RPC协议,以传输协议为基础,为两个不同的应用程序间传递数据。
RPC采用客户端/服务端工作模式。
2,基于http调用restful服务和基于TCP协议封装的RPC框架调用服务有什么区别?

调用RESTful服务时,我们需要采用HttpClient的方式发送请求,同时需要对返回的数据去解析状态(200,500),返回值(Json解析)等等
采用RPC的方式调用服务,则如同调用本地服务一样,不必关心网络通信的细节(直接service使用)
3,基于TCP协议封装的RPC框架的工作原理

Socket套接字

网络上的两个程序,通过一个双向的通信连接,实现数据的交换,这个连接的一端就称为套接字
Socket包含两部分(IP地址+端口号)
Java为我们提供的Scoket分为客户端和服务端,分别是Socket和ServerScoket
本地调用是如何实现的?

首先,程序被编译成具体CPU提供的机器指令

然后,在调用本地程序时,先将下一条指令的地址压入堆栈,并将控制权转移到当前调用程序的地址
当被调用的程序完成时,它会发出一个返回指令,并从栈顶弹出之前保存的地址,并将控制权转移回来。
A->B->C
(JVM内直接JVM指令调用)
远程调用会遇到的问题

以上的本地调用机制在RPC是不可行的,因为编译器无法通过编译的方法实现远程过程调用机制
因此,RPC远程调用是构建在语言级别上的,必须使用Socket来完成。
(不同JVM之间方法的调用)

所以RPC的实现=本地方法调用+Scoket网络通信技术
具体如何实现?

关键是创建“客户端存根”,存根就像是代理模式中的代理,在生成代理代码后,代理的代码就可以跟远程服务端通信了
具体通信的图如下:
在这里插入图片描述

4,主流的RPC框架

阿里巴巴的HSF(好舒服),Dubbo(开源)
Facebook的Thrift(开源)
Google的gRPC(开源)
Twitter的Finagle(开源)
微博平台的Motan
mRPC—
5,RPC框架带来的好处

我们编写分布式程序将变得简单,无需关注底层的通讯机制,套接字,端口,数据转换等细节问题
6,Java与RPC

Java RMI(Remote Method Invocation,远程方法调用),是java专有的RPC协议和框架。

二、软件安装

0、RabbitMQ安装

CentOS7安装步骤
https://www.rabbitmq.com/install-rpm.html

官网太慢
(1、安装yum install socat logrotate -y)
可以先安装,也可以下载安装;
可以先:
2、方法一
https://packagecloud.io/rabbitmq/erlang/
查看对应版本下载安装

3、方法二
需要官网导入验证
然后:
手动下载安装 前提联网
yum localinstall erlang-22.3.4.10-1.el7.x86_64.rpm
然后:
(官网查看)
rpm --import https://www.rabbitmq.com/rabbitmq-release-signing-key.asc
yum localinstall rabbitmq-server-3.8.8-1.el7.noarch.rpm
(访问参考)
https://blog.csdn.net/datouniao1/article/details/100130085

相关命令
service rabbitmq-server start
service rabbitmq-server stop
service rabbitmq-server restart
rabbitmq-server detached
systemctl start rabbitmq-server
systemctl status rabbitmq-server -l
journalctl -xe

1、JDK安装
查看rpm -qa|grep java
卸载rpm -e --nodeps 【包名】

下载Linux环境下的jdk1.8
解压 tar -zxvf jdk-8u181-linux-x64.tar.gz
rm -f jdk-8u181-linux-x64.tar.gz
配置 vim /etc/profile

export JAVA_HOME=/usr/local/myapp/jdk1.8.0_181  #jdk安装目录
 
export JRE_HOME=${JAVA_HOME}/jre
 
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib:$CLASSPATH
 
export JAVA_PATH=${JAVA_HOME}/bin:${JRE_HOME}/bin
 
export PATH=$PATH:${JAVA_PATH}

使配置生效 source /etc/profile
java -version 查看

2、Tomcat安装

.IllegalArgumentException
<Connector URIEncoding=“UTF-8” port=“8080” protocol=“org.apache.coyote.http11.Http11NioProtocol”
useBodyEncodingForURI=“false”
enableLookups=“false”
connectionTimeout=“20000”

           redirectPort="8443" maxHttpHeaderSize="8192"/>

1、tomcat下载

解压apache-tomcat-7.0.68.tar.gz到当前目录下

tar zxvf apache-tomcat-7.0.68.tar.gz
配置环境变量

vim /etc/profile
 

添加环境变量
export CATALINA_HOME=/usr/local/apache-tomcat-7.0.68
./startup.sh
3、zookeeper安装

下载
解压
/usr/local/myapp/zookeeper-3.4.12/conf
配置 cp zoo_sample.cfg zoo.cfg
zookeeper 中的zoo_sample.cfg文件参数详解:
tickTime=2000

tickTime这个时间是作为zookeeper服务器之间或客户端与服务器之间维持心跳的时间隔,也就是每到tickTime时间就会发送一个心跳。

initLimit=10

initLimit这个配置项是用来配置Zookeeper接收客户端(这里所说的客户端不是用户链接Zookeeper服务器的客户端,而是Zookeeper服务器集群中连接到leader的Follower服务器)初始化连接是最长能忍受多少个心跳的时间间隔数。当已经超过10个心跳的时间(也就是tickTime)长度后Zookeeper服务器还没有收到客户端返回的信息,那么表明这个客户端连接失败。总的时间长度就是10*2000=20秒

syncLimit=5

syncLimit这个配置项标识leader与follower之间发送消息,请求和应答时间长度,最长不能超过多少个tickTime的时间长度,总的时间长度就是5*2000=10秒。

dataDir=/home/leantaot/zookeeper/zookeeper-3.4.7/node-03/data
dataDir顾名思义就是Zookeeper保存数据的目录,默认情况下Zookeeper将写数据的日志文件也保存在这个目录里

clientPort=2181

clientPort这个端口就是客户端(应用程序)连接Zookeeper服务器的端口,Zookeeper会监听这个端口接受客户端的访问请求。

server.1=leantaot-zk-01:2881:3881
1是一个数字,标识这个是第几号服务器

leantaot-zk-01是这个服务器的IP地址(或者是与IP地址做了映射的主机名)

2881第一个端口用来集群成员的信息交换,标识这个服务器与集群中的leader服务器交换信息的端口

3881是在leader挂掉时专门用来进行选举leader所用的端口

注意:如果是伪集群的配置方式,不同的Zookeeper实例通信端口号不能一样,所以要给它们分配不同的端口号。
systemctl status firewalld
service firewalld restart
ls /
ls /dubbo
rmr /dubbo

./bin/zkServer.sh start
./bin/zkServer.sh stop
./bin/zkServer.sh restart
 ./zkCli.sh -server localhost:2181
 sh zkCli.sh

4、Dubbo安装

Dubbo Admin
0.3.0
下载然后IDEA打开,mvn,clean,package
否则要配置mvn config
(这里可能无法识别,然后下载到.m2默认位置,还是IDEA生成架包(jar)可执行,war部署Tomcat)
下载过慢导致构建失败:如果是已经安装了
npm,node,cnpm
只需要

npm 修改为国内镜像地址

npm config set registry https://registry.npm.taobao.org

配置后可通过下面方式来验证是否成功

npm config get registry

npm info express

(安装过的可以不用,如果不行再次安装)全局 cnpm 安装

npm install cnpm -g --registry=https://registry.npm.taobao.org

No proxy was configured, downloading directly
问题:
看到不能下载https://nodejs.org/dist/v9.11.1/node-v9.11.1-win-x64.zip,那我就自己在浏览器中下载,然后手动放到对应的maven目录中

1,安装监控中心

上传,解压
配置 vim conf/dubbo.properties,设置zookeeper注册中心的地址

启动服务
./bin/server.sh start
./bin/server.sh stop
./bin/server.sh restart

查看日志
tail -f logs/stdout.log
访问服务,查看具体信息
2,安装服务管理平台(后者具备了监控中心的能力,所以安装一个即可)

安装tomcat
修改tomcat启动端口
启动tomcat服务

删除Root目录的内容
上传dubbo.war,将dubbo.war解压到Root目录下
unzip dubbo.war -d webapps/ROOT

修改配置文件,配置zookeeper注册中心地址
vim webapps/ROOT/WEB-INF/dubbo.properties
启动tomcat
在这里插入图片描述

三、项目demo

自己github上面,dubbo-admin,服务管理界面,直接,构建
在linux进行部署;
https://github.com/EmailChenli/dubbo_customer.git

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐