• 分布式架构Duboo+Zookeeper的基础使用


    系统架构

    垂直项目架构

    特点
    	不管项目多复杂,有多少个模块,全在一个项目中编写
    	项目部署在一个web容器上,适合于 访问量小,用户数不多的业务
    

    结构图
    在这里插入图片描述
    缺点

    1. 耦合度比较高
      所有功能模板代码都放到了一起,
    2. 不利于扩展
      写好了, 测试完了,想要加一个模块非常的困难
      如果果某个功能出错有问题,所有的功能都需要再重新打包编译,部署效率极低。
      上线时, 把项目停掉
    3. 不利于团队协作维护
      团队协作难度高,如多人使用SVN/git很可能在同一个功能上,多人同时进行了修改,作为一个大而全的项目,可能个人只是需要开发其中一个小的模块的需求,却需要导入整个项目全量的代码。

    优点:结构简单

    SOA架构

    SOA(Service-Oriented Architecture)它是一种支持面向服务的架构。(分布式架构)

    特点:将传统项目中的一个模块,拆分成一个一个项目
    优点
    1. 降低模块之间的耦合度
    2. 利于扩展
    3. 利于维护

    缺点
    1. 结构复杂
    2. 对于小型项目 ,成本比较高

    特点:
    1. 模块的拆分
    	如果某一个系统访问量比较大时, 可以多部署几台tomcat,
    	当出现高并发的时候 , 通过nigix负载均衡,进行分配访问
    	如果今后, 想要再添加 一个模块, 可以直接在写一个项目,弄台新机器,直接上线
    2. 业务功能的拆分
    	除了把对应模块拆成一个系统外, 还可以把我们的三层架构拆成对应的服务,把Controller做为一个系统,Dao和Service做为一个系统
    	如果调用多了,一台不够用户了, 可以多部署几台
    3. 存在的问题
    	在以前Controller调用Service,通过注入进行调用,注入属于是Spring的
    	当Controller在一个服务器中, Service在另一台服务器,是没有办法注入的
    	此时, 可以采用一个技术叫Dubbox,可以实现跨tomcat 注入 远程调用
    	Dubbo是的跨服务器,注入的技术,这么多服务,到底是认认证调用谁,怎么知道的呢
    	通过zookeeper注册中心,所有的服务都到zookeeper当中注册一下, 注册后, 
    	今后服务之间的调用,就可以通过zookeeper找到对应的服务,通过Dubbo进入注入
    

    Dubbo

    什么是Dubbo

    概述

    Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源。
    由于Dubbo在阿里内部经过广泛的业务验证,在很短时间内,Dubbo就被许多互联网公司所采用,并产生了许多衍生版本,如网易,京东,新浪,当当等等。
    由于阿里策略变化,2014年10月Dubbo停止维护。随后部分互联网公司公开了自行维护的Dubbo版本,比较著名的如当当DubboX,新浪Motan等。
    经过三年的沉寂,在2017年9月,阿里宣布重启Dubbo项目,并决策在未来对开源进行长期持续的投入。随后Dubbo开始了密集的更新,并将停摆三年以来大量分支上的特性及缺陷修正快速整合。
    2018.2月,阿里将Dubbo捐献给Apache基金会,Dubbo成为Apache孵化器项目。

    基于rpc

    rpc远程过程调用协议 是JDK底层提出的协议,Dubbo只是对这个协议的实现的一个框架技术 rpc协议就是跨服务器,跨tomcat ,可以从一个项目调用另一个项目中的方法

    作用

    跨项目调用方法
    从一个项目中的Controller可以调用另一个项目中的service方法

    同类型的技术有哪些

    1. Dubbo
    2. DubboX
      优点:传输效率快
      缺点:Controller和Service两个项目必须都是Java语言实现
    3. springCloud
    4. webService技术
      cfx:使用的soap协议,传输的是xml数据

    如何使用

    1. 服务层注解
      service实现类上写@service注解
      写此注解的时候,注意先包,选的是阿里dubbo下的包

    2. Controlle注入
      使用@refrence注解来进行注入
      选择也是dubbo下的

    3. pojo传输
      如果Controller和service之间传输pojo实体类,
      那么实体类必须实现Java的序列化接口

      序列化

    网络传输,是通过插在电脑上的网线(双绞线)进行
    网线当中传输入的是模拟信号,波浪形式的信号,有高电位和底电位
    可以使用高底电位 代表 0 或 1 网线是插在电脑网卡上,网卡我们又称数模转换器 数字信号和模拟信息进行转换 网络传输是模拟信息 计算机处理时, 数字信号
    转换成数字信号后, 进入操作系统, 再根据相应的端口号找到对应的服务处理
    在Java中只要告诉它,实现序列化接口,
    JVM就会自动的把实现类转换成对应的信号进行传输

    Dubbo调用流程

    1. 所有的服务都要在Zookeeper注册中心当中进入注册
      每一个服务都有自己的配置文件,
      在配置文件当中配置好自己端口号和地址
      然后把端口号和地址注册在zookeeper注册中心统一管理
    2. Zookeeper注册中心 ,管理服务提供方服务器的ip和端口,并知道哪台机器启动了,哪台机器关闭了
    3. 服务调用方Controller项目询问ZooKeeper可以提供服务的IP和端口
    4. Zookeeper返回可以使用的IP和端口号给Controller
    5. Controller使用IP+端口+接口+方法调用,到指定的服务中调用对应的方法
    6. 服务返回对应的结果
      在这里插入图片描述

    Zookeeper

    概述

    Zookeeper 是 Apacahe Hadoop 的子项目
    是一个树型的目录服务,支持变更推送
    最早是用在大数据当中
    适合作为Dubbox 服务的注册中心

    作用

    zookeeper 注册中心
    注册中心负责服务地址的注册与查找,相当于目录服务
    服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。

    安装

    在Linux环境下安装
    确保Linux网络环境正常

    1. 安装JDK
    rm -f /var/run/yum.pid
    yum -y install java-1.8.0-openjdk.x86_64
    java -version
    

    进入Root用户
    在这里插入图片描述
    执行安装jdk
    yum -y install java-1.8.0-openjdk.x86_64
    在这里插入图片描述
    查看版本号
    java -version
    在这里插入图片描述

    1. 把 zookeeper 的压缩包,上传到Linux系统
      在这里插入图片描述
    2. 解压缩压缩包
      tar -zxvf zookeeper-3.4.6.tar.gz
    3. 进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
      mv zoo_sample.cfg zoo.cfg在这里插入图片描述
    4. 进入bin目录,启动服务输入命令
      ./zkServer.sh start
      在这里插入图片描述
    5. 查看状态
      ./zkServer.sh status
      在这里插入图片描述
      关闭服务
      ./zkServer.sh stop
      关闭防火墙
      systemctl stop firewalld.service

    Duboo调用Zookeeper实例

    1. 创建Maven工程
      在这里插入图片描述
    2. 引入依赖
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    
        <!-- Spring -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
    
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jms</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>5.2.7.RELEASE</version>
        </dependency>
        <!-- dubbo相关 -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>dubbo</artifactId>
          <version>2.6.6</version>
        </dependency>
        <dependency>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.4.6</version>
        </dependency>
        <dependency>
          <groupId>com.github.sgroschupf</groupId>
          <artifactId>zkclient</artifactId>
          <version>0.1</version>
        </dependency>
        <dependency>
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.11.0.GA</version>
        </dependency>
        <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-all</artifactId>
          <version>4.1.32.Final</version>
        </dependency>
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>4.0.1</version>
        </dependency>
    
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-recipes</artifactId>
          <version>4.0.1</version>
        </dependency>
      </dependencies>
    
    1. 添加web.xml配置文件
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!-- 加载spring容器 -->
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext*.xml</param-value>
      </context-param>
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
    </web-app>
    
    
    1. 在resouces中添加applicationContext-service.xml配置文件
    <?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:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--  给当前项目服务起个名字 -->
        <dubbo:application name="dubboxdemo-service"/>
        <!-- 配置连接zookeeper的IP和端口 -->
        <dubbo:registry address="zookeeper://192.168.0.108:2181"/>
        <!-- 配置包扫描, 在这个包下面的实现类中使用@Service注解才会生效 -->
        <dubbo:annotation package="com.dj.service"/>
    </beans>
    
    
    1. 编写提供方
      在这里插入图片描述
      测试启动Tomcat
      在这里插入图片描述
    2. 编写消费方
      创建Maven web项目
      在这里插入图片描述
    3. 引入pom依赖
      <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.7</maven.compiler.source>
        <maven.compiler.target>1.7</maven.compiler.target>
        <spring.version>5.2.7.RELEASE</spring.version>
      </properties>
    
      <dependencies>
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
        <!-- Spring -->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-beans</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-webmvc</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-aspects</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jms</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context-support</artifactId>
          <version>${spring.version}</version>
        </dependency>
        <!-- dubbo相关 -->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>dubbo</artifactId>
          <version>2.6.6</version>
        </dependency>
        <dependency>
          <groupId>org.apache.zookeeper</groupId>
          <artifactId>zookeeper</artifactId>
          <version>3.4.6</version>
        </dependency>
        <dependency>
          <groupId>com.github.sgroschupf</groupId>
          <artifactId>zkclient</artifactId>
          <version>0.1</version>
        </dependency>
        <dependency>
          <groupId>javassist</groupId>
          <artifactId>javassist</artifactId>
          <version>3.11.0.GA</version>
        </dependency>
    
        <dependency>
          <groupId>io.netty</groupId>
          <artifactId>netty-all</artifactId>
          <version>4.1.32.Final</version>
        </dependency>
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-framework</artifactId>
          <version>4.0.1</version>
        </dependency>
    
        <dependency>
          <groupId>org.apache.curator</groupId>
          <artifactId>curator-recipes</artifactId>
          <version>4.0.1</version>
        </dependency>
    
      </dependencies>
    
    1. 添加web.xml配置文件
    <!DOCTYPE web-app PUBLIC
            "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
            "http://java.sun.com/dtd/web-app_2_3.dtd" >
    
    <web-app>
      <display-name>Archetype Created Web Application</display-name>
      <!-- 解决post乱码 -->
      <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
          <param-name>encoding</param-name>
          <param-value>utf-8</param-value>
        </init-param>
        <init-param>
          <param-name>forceEncoding</param-name>
          <param-value>true</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
    
      <!-- 配置springMvc前端控制器  -->
      <servlet>
        <servlet-name>springmvc</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载-->
        <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:applicationContext-web.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
      </servlet>
      <servlet-mapping>
        <servlet-name>springmvc</servlet-name>
        <!-- 拦截所有,不包括jsp,包含.js .png.css     建议使用  -->
        <url-pattern>/</url-pattern>
      </servlet-mapping>
    
    </web-app>
    
    
    
            
    
    1. 在resouces中添加applicationContext-web.xml配置文件
    <?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:p="http://www.springframework.org/schema/p"
           xmlns:context="http://www.springframework.org/schema/context"
           xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc"
           xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
            http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
    
        <!--注解扫描-->
        <context:component-scan base-package="com.dj"/>
    
        <!-- 注解驱动 -->
        <mvc:annotation-driven >
            <!-- 将传输的字符串强制转换成utf-8编码, 防止中文乱码  -->
            <mvc:message-converters register-defaults="false">
                <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                    <constructor-arg value="UTF-8" />
                </bean>
            </mvc:message-converters>
        </mvc:annotation-driven>
    
        <!-- 给当前项目服务起个名-->
        <dubbo:application name="dubboxdemo-web" />
        <!-- 配置连接zookepper  -->
        <dubbo:registry address="zookeeper://192.168.0.108:2181"/>
        <!-- 配置包扫描, 只有在这个包下面才可以注入service -->
        <dubbo:annotation package="com.dj.controller" />
    </beans>
    
    
    1. 在Java文件夹中, 创建Controller
      在这里插入图片描述

    2. 配置tomcat启动 注意端口号

    3. 创建service接口和提供方一样
      在这里插入图片描述

    4. 在Controller注入service
      在这里插入图片描述
      注意:要使用alibaba的duboo注解

    5. 先启动提供方 后启动消费方测试
      在这里插入图片描述
      通过消费方的Controller调用提供方的方法

    注意事项

    1. zookeeper的端口
    2. Linux的ip地址
    3. linux防火墙关闭
    4. 提供方和消费方的端口
    5. 注解使用alibaba的注解
  • 相关阅读:
    北航OO第三单元总结
    北航OO第二单元总结
    提问回顾和个人总结
    Unity 制作不规则形状button
    Unity 3D手游对不同分辨率屏幕的UI自适应
    软工结队作业
    CSDN app分析
    软工作业——求交点
    软工第一次作业
    软工热身作业
  • 原文地址:https://www.cnblogs.com/joker-dj/p/13409763.html
Copyright © 2020-2023  润新知