分布式 Dubbot + Zookeeper + SpringBoot

一、分布式原理

1、什么是分布式?

分布式就是多个计算机(服务器)的集合,但是对于一个用户来说就是当个的系统。

:淘宝的订单系统,需要经过一系列的操作才能交易成功。把其中的几个模块给拿出来交给一个服务器管理。

注意】多只有当单个节点的处理能力无法满足业务需求时,才用分布式系统,因为它会带来很多的问题,如:引入更多的机制、协议的问题

分布式服务架构

当垂直应用(MVC)越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。

二、RPC协议

1、什么时RPC?

rpc协议与http协议一样都是用来通信的。

rpc(Remote Procedure Call)也叫远程过程调用,为了解决通信问题和远程控制调用问题,在这之前先讲讲什么是本地调用

本地调用:

通俗来说就是你在一个计算机里A方法调用B方法

远程过程调用:

相对于本地调用,远程过程调用是一个计算机的A方法去调用另一个计算机的B方法。

推荐阅读文章:https://www.jianshu.com/p/2accc2840a1b

RPC基本原理

img

步骤解析:

img
RPC两个核心模块:通讯,序列化。

【序列化】为了方便传输

Dubbo+Zookeeper开发步骤:

前提:打开Zookeeper服务

【意】Apache Dubbo |ˈdʌbəʊ| 是一款高性能、轻量级的开源Java RPC框架,它提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现。

1、两个不同的引用,一个为提供者一个为使用者

2、导入依赖

    <!-- Dubbo Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
            <version>2.7.3</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
        <!-- 引入zookeeper -->
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
            <version>2.12.0</version>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.14</version>
            <!--排除这个slf4j-log4j12-->
            <exclusions>
                <exclusion>
                    <groupId>org.slf4j</groupId>
                    <artifactId>slf4j-log4j12</artifactId>
                </exclusion>
            </exclusions>
        </dependency>

3、配置提供者的application与服务

配置文件:

server.port=8002

#服务应用名字
dubbo.application.name=provider-server
#注册中心地址 本机地址
dubbo.registry.address=zookeeper://192.168.43.203:2181 
#哪些服务器被注册
dubbo.scan.base-packages=com.li.service

服务:

//zookeeper:服务注册与发现

@Service //可以被扫描到,在项目启动就自动注册到注册中心
@Component //因为dubbo也有个service注解,所有为了区分用Component
public class TicketServiceImpl implements TicketService {
    @Override
    public String getTicket() {
        return "《独依栏窗》";
    }
}

4、配置使用者application与服务

配置文件:

server.port=8001

#消费者去哪里拿服务,需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心的地址
dubbo.registry.address=zookeeper://192.168.43.203:2181

服务:

@Service
public class  UserService {
    //我们需要去拿去注册中心的服务
    @Reference //引用
    TicketService ticketService;   //正常开发引用,pom坐标,也可以定义路径相同的接口名

    public void setTicketService(){
        System.out.println("在注册中心拿到"+ticketService.getTicket());
    }
}

5、运行打包成jar到Dubbo-admin 查看服务信息