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

2023-11-27 14:43:13 浏览数 (2)

分布式架构

系统架构

垂直项目架构

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

结构图

缺点

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

优点:结构简单

SOA架构

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

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

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

代码语言:javascript复制
特点:
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
代码语言:javascript复制
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系统
  1. 解压缩压缩包 tar -zxvf zookeeper-3.4.6.tar.gz
  2. 进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg mv zoo_sample.cfg zoo.cfg
  1. 进入bin目录,启动服务输入命令 ./zkServer.sh start
  1. 查看状态 ./zkServer.sh status

关闭服务 ./zkServer.sh stop 关闭防火墙 systemctl stop firewalld.service

Duboo调用Zookeeper实例

  1. 创建Maven工程
  1. 引入依赖
代码语言:javascript复制
  <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配置文件
代码语言:javascript复制
<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配置文件
代码语言:javascript复制
<?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

  1. 编写消费方 创建Maven web项目
  1. 引入pom依赖
代码语言:javascript复制
  <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配置文件
代码语言:javascript复制
<!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配置文件
代码语言:javascript复制
<?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
  1. 配置tomcat启动 注意端口号
  2. 创建service接口和提供方一样
  1. 在Controller注入service

注意:要使用alibaba的duboo注解

  1. 先启动提供方 后启动消费方测试

通过消费方的Controller调用提供方的方法

注意事项
  1. zookeeper的端口
  2. Linux的ip地址
  3. linux防火墙关闭
  4. 提供方和消费方的端口
  5. 注解使用alibaba的注解

0 人点赞