zoukankan      html  css  js  c++  java
  • 20200222 一、基础知识

    一、基础知识

    1、分布式基础理论

    1.1)、什么是分布式系统?

    《分布式系统原理与范型》定义:

    分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统

    分布式系统(distributed system)是建立在网络之上的软件系统。

    随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。

    1.2)、发展演变

    img

    单一应用架构

    当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。

    img

    适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。

    缺点:

    1. 性能扩展比较难

    2. 协同开发问题

    3. 不利于升级维护

    垂直应用架构

    当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。

    img

    通过切分业务来实现各个模块独立部署,降低了维护和部署的难度,团队各司其职更易管理,性能扩展也更方便,更有针对性。

    缺点: 公用模块无法重复利用,开发性的浪费

    分布式服务架构

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

    img

    流动计算架构

    当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键

    img

    1.3)、RPC

    什么叫RPC

    RPC【Remote Procedure Call】是指远程过程调用,是一种进程间通信方式,是一种技术的思想,而不是规范。它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即程序员无论是调用本地的还是远程的函数,本质上编写的调用代码基本相同。

    RPC基本原理

    img

    img

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

    2、dubbo核心概念

    2.1)、简介

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

    Apache Dubbo是一款高性能Java RPC框架

    官网

    2.2)、基本概念

    img

    服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。

    服务消费者(Consumer): 调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

    注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者

    监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心

    调用关系说明

    • 服务容器负责启动,加载,运行服务提供者。
    • 服务提供者在启动时,向注册中心注册自己提供的服务。
    • 服务消费者在启动时,向注册中心订阅自己所需的服务。
    • 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
    • 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
    • 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

    3、dubbo环境搭建

    这里使用ZooKeeper作为注册中心;

    1. 安装ZooKeeper;

      全部按照默认设置

    2. 安装dubbo-admin管理控制台

      2.1. 下载地址

      2.2. 解压并将dubbo-admin使用Maven命令打包成jar;

      mvn clean package
      

      2.3. 启动控制台

      java -jar .dubbo-admin-0.0.1-SNAPSHOT.jar
      

      2.4. 访问控制台

      http://localhost:7001/
      

    4、dubbo-helloworld

    4.1)、提出需求

    某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;

    我们现在 需要创建两个服务模块进行测试

    模块 功能
    订单服务web模块 创建订单等
    用户服务service模块 查询用户地址等

    测试预期结果:

    ​ 订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。

    4.2)、工程架构

    根据 dubbo《服务化最佳实践》

    1、分包

    建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。

    如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方,只需在 spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml。

    2、粒度

    服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。

    服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。

    不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。

    img

    4.3)、创建模块

    1. gmall-interface:公共接口层(model,service,exception…)
      作用:定义公共接口,也可以导入公共依赖

      1.1. Bean模型

      public class UserAddress implements Serializable{
          private Integer id;
          private String userAddress;
          private String userId;
          private String consignee;
          private String phoneNum;
          private String isDefault;
      }
      

      1.2. Service接口

      /**
       * 用户服务
       * @author lfy
       *
       */
      public interface UserService {
      	
      	/**
      	 * 按照用户id返回所有的收货地址
      	 * @param userId
      	 * @return
      	 */
      	public List<UserAddress> getUserAddressList(String userId);
      
      }
      
    2. gmall-user:用户模块(对用户接口的实现)

      2.1. pom.xml

      <dependency>
          <groupId>com.atguigu.gmall</groupId>
          <artifactId>gmall-interface</artifactId>
          <version>0.0.1-SNAPSHOT</version>
      </dependency>
      
      <!-- 引入dubbo -->
      <!-- https://mvnrepository.com/artifact/com.alibaba/dubbo -->
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>dubbo</artifactId>
          <version>2.6.2</version>
      </dependency>
      <!-- 注册中心使用的是zookeeper,引入操作zookeeper的客户端端 -->
      <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>2.12.0</version>
      </dependency>
      

      2.2. Service实现

      public class UserServiceImpl implements UserService {
      
      	@Override
      	public List<UserAddress> getUserAddressList(String userId) {
      		System.out.println("UserServiceImpl.....old...");
      		
      		UserAddress address1 = new UserAddress(1, "北京市昌平区宏福科技园综合楼3层", "1", "李老师", "010-56253825", "Y");
      		UserAddress address2 = new UserAddress(2, "深圳市宝安区西部硅谷大厦B座3层(深圳分校)", "1", "王老师", "010-56253825", "N");
      		
      		return Arrays.asList(address1,address2);
      	}
      
      }
      

      2.3. dubbo配置

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      		http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
      
          <!-- 1、指定当前服务/应用的名字(同样的服务名字相同,不要和别的服务同名) -->
          <dubbo:application name="user-service-provider"></dubbo:application>
      
          <!-- 2、指定注册中心的位置 -->
          <!-- <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry> -->
          <dubbo:registry protocol="zookeeper" address="127.0.0.1:2181"></dubbo:registry>
      
          <!-- 3、指定通信规则(通信协议?通信端口) -->
          <dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
      
          <!-- 4、暴露服务   ref:指向服务的真正的实现对象 -->
          <dubbo:service interface="com.atguigu.gmall.service.UserService" ref="userServiceImpl"></dubbo:service>
      
          <!-- 服务的实现 -->
          <bean id="userServiceImpl" class="com.atguigu.gmall.service.impl.UserServiceImpl"></bean>
      
      </beans>
      
      

      2.4. 启动类

      public class MainApplication {
      	
      	public static void main(String[] args) throws IOException {
      		ClassPathXmlApplicationContext ioc = new ClassPathXmlApplicationContext("provider.xml");
      		ioc.start();
      		
      		System.in.read();
      	}
      
      }
      
    3. gmall-order-web:订单模块(调用用户模块)

      3.1. pom.xml同2.1.

      3.2. 调用用户模块的服务类

      @Service
      public class OrderServiceImpl implements OrderService {
      
          @Autowired
          UserService userService;
      
          @Override
          public List<UserAddress> initOrder(String userId) {
              System.out.println("用户id:" + userId);
              //1、查询用户的收货地址
              List<UserAddress> addressList = userService.getUserAddressList(userId);
              for (UserAddress userAddress : addressList) {
                  System.out.println(userAddress.getUserAddress());
              }
              return addressList;
          }
      
      }
      

      3.3. dubbo配置

      <?xml version="1.0" encoding="UTF-8"?>
      <beans xmlns="http://www.springframework.org/schema/beans"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:dubbo="http://dubbo.apache.org/schema/dubbo"
             xmlns:context="http://www.springframework.org/schema/context"
             xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
      		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
      		http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
          <context:component-scan base-package="com.atguigu.gmall.service.impl"></context:component-scan>
      
          <dubbo:application name="order-service-consumer"></dubbo:application>
      
          <dubbo:registry address="zookeeper://127.0.0.1:2181"></dubbo:registry>
      
          <dubbo:reference interface="com.atguigu.gmall.service.UserService" id="userService"></dubbo:reference>
      
      </beans>
      

      3.4. 启动类

      public class MainApplication {
      	
      	@SuppressWarnings("resource")
      	public static void main(String[] args) throws IOException {
      		ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("consumer.xml");
      		
      		OrderService orderService = applicationContext.getBean(OrderService.class);
      		
      		orderService.initOrder("1");
      		System.out.println("调用完成....");
      		System.in.read();
      	}
      }
      
    4. 测试验证

      先启动gmall-user,后启动gmall-order-web,成功打印出用户地址;

      查看dubbo-admin管理控制台,可以看到服务信息;

    5、监控中心

    5.1)、dubbo-admin

    图形化的服务管理页面;安装时需要指定注册中心地址,即可从注册中心中获取到所有的提供者/消费者进行配置管理

    5.2)、dubbo-monitor-simple

    简单的监控中心;

    1、安装

    1. 下载 dubbo-ops

    2. 修改配置指定注册中心地址

      进入 dubbo-monitor-simplesrcmain esourcesconf

      修改 dubbo.properties文件

      web服务默认使用8080端口,dubbo通信默认使用7070端口,ZooKeeper地址默认;

    3. 使用Maven命令打包dubbo-monitor-simple

    4. 解压targetdubbo-monitor-simple-2.0.0-assembly.tar.gz

    5. 通过dubbo-monitor-simple-2.0.0assembly.binstart.bat启动

    6. 访问 http://localhost:8080/

    2、监控中心配置

    所有服务配置连接监控中心,进行监控统计

    <!-- 监控中心协议,如果为protocol="registry",表示从注册中心发现监控中心地址,否则直连监控中心 -->
    <dubbo:monitor protocol="registry"></dubbo:monitor>
    

    Simple Monitor 挂掉不会影响到 Consumer 和 Provider 之间的调用,所以用于生产环境不会有风险。

    Simple Monitor 采用磁盘存储统计信息,请注意安装机器的磁盘限制,如果要集群,建议用mount共享磁盘。

    6、整合SpringBoot

    1. pom.xml

      <dependency>
          <groupId>com.alibaba.boot</groupId>
          <artifactId>dubbo-spring-boot-starter</artifactId>
          <version>0.2.0</version>
      </dependency>
      
    2. 配置application.properties

      # 生产者配置:
      dubbo.application.name=gmall-user
      dubbo.registry.protocol=zookeeper
      dubbo.registry.address=192.168.67.159:2181
      dubbo.scan.base-package=com.atguigu.gmall
      dubbo.protocol.name=dubbo
      # application.name就是服务名,不能跟别的dubbo提供端重复
      # registry.protocol 是指定注册中心协议
      # registry.address 是注册中心的地址加端口号
      # protocol.name 是分布式固定是dubbo,不要改。
      # base-package  注解方式要扫描的包
      
      # 消费者配置:
      # dubbo.application.name=gmall-order-web
      # dubbo.registry.protocol=zookeeper
      # dubbo.registry.address=192.168.67.159:2181
      # dubbo.scan.base-package=com.atguigu.gmall
      # dubbo.protocol.name=dubbo
      
      
    3. dubbo注解

      • @com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo

      • @org.springframework.stereotype.Service

        注解在被调用的接口实现上

      • @com.alibaba.dubbo.config.annotation.Reference

        注解在调用服务的声明上

      【如果没有在配置中写dubbo.scan.base-package,还需要使用@EnableDubbo注解】

  • 相关阅读:
    正经学C#_循环[do while,while,for]:[c#入门经典]
    Vs 控件错位 右侧资源管理器文件夹点击也不管用,显示异常
    asp.net core 获取当前请求的url
    在实体对象中访问导航属性里的属性值出现异常“There is already an open DataReader associated with this Command which must be
    用orchard core和asp.net core 3.0 快速搭建博客,解决iis 部署https无法登录后台问题
    System.Data.Entity.Core.EntityCommandExecution The data reader is incompatible with the specified
    初探Java设计模式3:行为型模式(策略,观察者等)
    MySQL教程77-CROSS JOIN 交叉连接
    MySQL教程76-HAVING 过滤分组
    MySQL教程75-使用GROUP BY分组查询
  • 原文地址:https://www.cnblogs.com/huangwenjie/p/12345086.html
Copyright © 2011-2022 走看看