微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SpringBoot-13-分布式系统

1、分布式理论

什么是分布式系统?

​ 在《分布式系统原理与泛型》一书中有如下定义,“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像个简单系统”

​ 分布式系统是由一组通过网络进行通信。为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的,普通的机器完成单个计算机无法完成的计算,存储任务。起目的是利用更多的机器,处理更多的数据、

dubbo文档

​ 随着物联网的发展,网站应用的规模不断扩大,常规的垂直应用框架已经无法应对。分布式服务架构以及流动计算架构势在必行,

在这里插入图片描述

什么是dubbo?

​ Apache dubbo是一款高性能,轻量级的开源 Java RPC框架,它提供了三大核心能力,面向接口的远程方法使用,智能容错和负载均衡,以及服务自动注册和发现。

运行原理图:

在这里插入图片描述

  • Provider(服务提供者):暴露服务的服务提供方,服务提供者在启动时,想注册中心注册自己需要的服务。
  • Consumer(服务消费者):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己需要的服务,服务消费者,从服务提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用
  • Registry注册中心):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长链接推送变更数据给消费者
  • Monitor(监控中心):消费服务者和消费提供者,在内存中累计调用次数调用时间,定时每分钟发送一次统计数据到监控中心。

通信Http和RPC

Http和RPC都是基于网络的通信协议

RPC【Remote Procedure Call】指远程过程调用,是一种进程间通信方式,而不是一种规范。

zookeeper

​ zookeeper是一个分布式的开放源码的分布式应用程序协调服务。

2、安装

zookeeper安装

https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz

在config文件下在复制zoo_sample.cfg更名为zoo.cfg

进bin文件下运行zkServer.cmd运行服务,运行zkCli.cmd执行

可能出现闪退,用记事本打开添加 pause暂停

dubbo安装

gitHub下载地址:https://github.com/apache/dubbo-admin/tree/master

在目录dubbo-admin-master下执行打包命令dubbo-admin

mvn clean package -Dmaven.test.skip=true

生成dubbo/target生成jar包dubbo-admin-0.0.1-SNAPSHOT.jar

开启zookeeper服务运行此jar包可访问localhost:7001

认账号:root,密码:root。

3、运行测试

1、创建环境

  1. 创建Empty Project空项目

  2. 新建模块【SpringBoot项目】

    1. 消费者【consumer-server】
    2. 提供者【provider-server】
  3. 在提供者【provider-server】中创建服务

    public interface TicketService {
        public String getTicket();
    }
    
  4. 在消费者【consumer-server】创建业务

    public class UserService {}
    

2、运行zookeeper和dubbo

  1. 打开apache-zookeeper-3.6.2-bin运行zkServer.cmd开启zookeeper服务
  2. 运行dubbo-adminjar包(用管理员身份运行)
  3. 打开注册中心localhost:7001用户名和密码:root

3、配置服务

无论提供者【provider-server】还是 消费者【consumer-server】后需要导入相同的jar包依赖

<!-- 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>
  1. 提供者【provider-server】

    1. 实现服务接口

      import org.apache.dubbo.config.annotation.Service;
      import org.springframework.stereotype.Component;
      @Service //将服务发布出去
      @Component //放在容器中
      public class TicketServiceImpl implements TicketService {
          @Override
          public String getTicket() {
              return "Aaron in leaning";
          }
      }
      

      注意:用@Service将服务发不出去,这里的@Service是dubbo包下的依赖。为了避免错误所以这里用@Component注解装配Spring。

    2. 编写配置,创建application.yaml配置文件

      server:
        port: 8001
      
      dubbo:
      # 设置服务名
        application:
          name: provider-server
      # 设置注册中心地址
        registry:
          address: zookeeper://127.0.0.1:2181
      #  设置要提供服务的扫描包
        scan:
          base-packages: com.aaron.service
      
  2. 消费者【consumer-server】

    1. 创建与提供者的服务相同的文件,地址也必须相同。(因为本地没有此服务,所以要创建空的假象)

      public interface TicketService {
          public String getTicket();
      }
      
    2. UserService自动导入服务

      @Reference
      TicketService ticketService;
      
      public void byTicket(){
          String ticket = ticketService.getTicket();
          System.out.println("在注册中心拿到票"+ticket);
      }
      

      注意:@Autowired是本地的自动装配。@Reference是远程自动装配

    3. 编写配置,创建新的yaml文件也可。在properties文件写也可。

      # 应用服务 WEB 访问端口
      server.port=8002
      # 服务名字
      dubbo.application.name=provider-server
      # 注册中心地址
      dubbo.registry.address=zookeeper://127.0.0.1:2181
      

      注意:这里是消费者的配置,所以不需要指定要提供服务的扫描包!

  3. 依次运行提供者和消费者服务,查看注册中心的变化。

    在这里插入图片描述

    在这里插入图片描述

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐