分布式架构

目录

  • 分布式架构

  • 系统架构

  • 垂直项目架构

    • SOA架构(分布式架构)

    • Dubbo

    • 什么是Dubbo

      • 作用
      • 同类型的技术有哪些
      • 如何使用
    • Dubbo调用流程

    • 示例图

    • Zookeeper

    • 安装

    • Dubbo实例

      • dubbo_service
      • dubbo_consumer
    • 分别配置tomcat

分布式架构

系统架构

垂直项目架构

1特点 2 不管项目多复杂,有多少个模块,全在一个项目中编写 3 项目部署在一个web容器上,适合于 访问量小,用户数不多的业务 4 5缺点 6 耦合度比较高 7 所有功能模板代码都放到了一起, 8 不利于扩展 9 写好了, 测试完了,想要加一个模块非常的困难 10 如果果某个功能出错有问题,所有的功能都需要再重新打包编译,部署效率极低。 11 上线时, 把项目停掉 12 不利于团队协作维护 13 团队协作难度高,如多人使用SVN/git很可能在同一个功能上,多人同时进行了修改,作为一个大而全的项目,可能个人只是需要开发其中一个小的模块的需求,却需要导入整个项目全量的代码。 14优点 15 结构简单 16

结构图

SOA架构(分布式架构)

1SOA(Service-Oriented Architecture)它是一种支持面向服务的架构。 2 3特点 4 将传统项目中的一个模块,拆分成一个一个项目 5 6优点 7 降低模块之间的耦合度 8 利于扩展 9 利于维护 10缺点 11 结构复杂 12 对于小型项目 ,成本比较高 13特点 14 模块的拆分 15 如果某一个系统访问量比较大时, 可以多部署几台tomcat, 16 当出现高并发的时候 , 通过nigix负载均衡,进行分配访问 17 如果今后, 想要再添加 一个模块, 可以直接在写一个项目,弄台新机器,直接上线 18 业务功能的拆分 19 除了把对应模块拆成一个系统外, 还可以把我们的三层架构拆成对应的服务,把Controller做为一个系统,Dao和Service做为一个系统 20 如果调用多了,一台不够用户了, 可以多部署几台 21 存在的问题 22 在以前Controller调用Service,通过注入进行调用,注入属于是Spring的 23 当Controller在一个服务器中, Service在另一台服务器,是没有办法注入的 24 此时, 可以采用一个技术叫Dubbox,可以实现跨tomcat注入 远程调用 25 Dubbo是的跨服务器,注入的技术,这么多服务,到底是认认证调用谁,怎么知道的呢 26 通过zookeeper注册中心,所有的服务都到zookeeper当中注册一下, 注册后, 27 今后服务之间的调用,就可以通过zookeeper找到对应的服务,通过Dubbo进入注入 28

Dubbo

什么是Dubbo

1概述 2 Dubbo是阿里巴巴内部使用的分布式业务框架,2012年由阿里巴巴开源。 3 由于Dubbo在阿里内部经过广泛的业务验证,在很短时间内,Dubbo就被许多互联网公司所采用,并产生了许多衍生版本,如网易,京东,新浪,当当等等。 4 由于阿里策略变化,2014年10月Dubbo停止维护。随后部分互联网公司公开了自行维护的Dubbo版本,比较著名的如当当DubboX,新浪Motan等。 5 经过三年的沉寂,在2017年9月,阿里宣布重启Dubbo项目,并决策在未来对开源进行长期持续的投入。随后Dubbo开始了密集的更新,并将停摆三年以来大量分支上的特性及缺陷修正快速整合。 6 2018.2月,阿里将Dubbo捐献给Apache基金会,Dubbo成为Apache孵化器项目。 7 8基于rpc 9 rpc远程过程调用协议 10 是JDK底层提出的协议,Dubbo只是对这个协议的实现的一个框架技术 11 rpc协议就是跨服务器,跨tomcat 12 可以从一个项目调用另一个项目中的方法 13

作用

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

同类型的技术有哪些

1Dubbo 2 3DubboX 4 优点 5 传输效率快 6 缺点 7 Controller和Service两个项目必须都是Java语言实现 8 9springCloud 10 11webService技术 12 cfx 13 使用的soap协议,传输的是xml数据 14

如何使用

11.服务层注解 2 service实现类上写@service注解 3 写此注解的时候,注意选包,选的是阿里dubbo下的包 42.Controlle注入 5 使用@refrence注解来进行注入 6 选择也是dubbo下的 73.pojo传输 8 如果Controller和service之间传输pojo实体类, 9 那么实体类必须实现Java的序列化接口 10 序列化 11 网络传输,是通过插在电脑上的网线(双绞线)进行 12 网线当中传输入的是模拟信号,波浪形式的信号,有高电位和底电位 可以使用高底电位 代表 01 13 网线是插在电脑网卡上,网卡我们又称数模转换器 数字信号和模拟信息进行转换 14 网络传输是模拟信息 15 计算机处理时, 数字信号 16 转换成数字信号后, 进入操作系统, 再根据相应的端口号找到对应的服务处理 17 在Java中只要告诉它,实现序列化接口, JVM就会自动的把实现类转换成对应的信号进行传输 18

Dubbo调用流程

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

示例图

Zookeeper

1概述 2 Zookeeper 是 Apacahe Hadoop 的子项目 3 是一个树型的目录服务,支持变更推送 4 最早是用在大数据当中 5 适合作为Dubbox 服务的注册中心 6作用 7 zookeeper 注册中心 8 注册中心负责服务地址的注册与查找,相当于目录服务 9 服务提供者和消费者只在启动时与注册中心交互,注册中心不转发请求,压力较小。 10

安装

1在Linux环境下安装 21.安装JDK 3 rm -f /var/run/yum.pid 4 yum -y install java-1.8.0-openjdk.x86_64 5 java -version 62.把 zookeeper 的压缩包,上传到Linux系统/usr/local目录下 7 cd /usr/local 8 93.解压缩压缩包 10 tar -zxvf zookeeper-3.4.6.tar.gz 11 rm -rf zookeeper-3.4.6.tar.gz 124.进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg 13 cd conf 14 mv zoo_sample.cfg zoo.cfg 155.进入bin目录,启动服务输入命令 16 ./zkServer.sh start 176.查看状态 18 ./zkServer.sh status 197.关闭服务 20 ./zkServer.sh stop 218.关闭防火墙 22 systemctl stop firewalld.service 23

Dubbo实例

dubbo_service

  • 引入pom依赖

1<properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <maven.compiler.source>1.7</maven.compiler.source> 4 <maven.compiler.target>1.7</maven.compiler.target> 5 <spring.version>5.1.7.RELEASE</spring.version> 6</properties> 7 8<dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.11</version> 13 <scope>test</scope> 14 </dependency> 15 16 <!-- Spring --> 17 <dependency> 18 <groupId>org.springframework</groupId> 19 <artifactId>spring-context</artifactId> 20 <version>${spring.version}</version> 21 </dependency> 22 23 <dependency> 24 <groupId>org.springframework</groupId> 25 <artifactId>spring-beans</artifactId> 26 <version>${spring.version}</version> 27 </dependency> 28 29 <dependency> 30 <groupId>org.springframework</groupId> 31 <artifactId>spring-webmvc</artifactId> 32 <version>${spring.version}</version> 33 </dependency> 34 <dependency> 35 <groupId>org.springframework</groupId> 36 <artifactId>spring-jdbc</artifactId> 37 <version>${spring.version}</version> 38 </dependency> 39 <dependency> 40 <groupId>org.springframework</groupId> 41 <artifactId>spring-aspects</artifactId> 42 <version>${spring.version}</version> 43 </dependency> 44 <dependency> 45 <groupId>org.springframework</groupId> 46 <artifactId>spring-jms</artifactId> 47 <version>${spring.version}</version> 48 </dependency> 49 <dependency> 50 <groupId>org.springframework</groupId> 51 <artifactId>spring-context-support</artifactId> 52 <version>${spring.version}</version> 53 </dependency> 54 <!-- dubbo相关 --> 55 <dependency> 56 <groupId>com.alibaba</groupId> 57 <artifactId>dubbo</artifactId> 58 <version>2.6.6</version> 59 </dependency> 60 <dependency> 61 <groupId>org.apache.zookeeper</groupId> 62 <artifactId>zookeeper</artifactId> 63 <version>3.4.6</version> 64 </dependency> 65 <dependency> 66 <groupId>com.github.sgroschupf</groupId> 67 <artifactId>zkclient</artifactId> 68 <version>0.1</version> 69 </dependency> 70 <dependency> 71 <groupId>javassist</groupId> 72 <artifactId>javassist</artifactId> 73 <version>3.11.0.GA</version> 74 </dependency> 75 <dependency> 76 <groupId>io.netty</groupId> 77 <artifactId>netty-all</artifactId> 78 <version>4.1.32.Final</version> 79 </dependency> 80 <dependency> 81 <groupId>org.apache.curator</groupId> 82 <artifactId>curator-framework</artifactId> 83 <version>4.0.1</version> 84 <type>bundle</type> 85 </dependency> 86 87 <dependency> 88 <groupId>org.apache.curator</groupId> 89 <artifactId>curator-recipes</artifactId> 90 <version>4.0.1</version> 91 <type>bundle</type> 92 </dependency> 93</dependencies> 94
  • 添加web.xml配置文件

1<web-app> 2 <display-name>Archetype Created Web Application</display-name> 3 <!-- 加载spring容器 --> 4 <context-param> 5 <param-name>contextConfigLocation</param-name> 6 <param-value>classpath:applicationContext*.xml</param-value> 7 </context-param> 8 <listener> 9 <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 10 </listener> 11</web-app> 12
  • 在resouces中添加applicationContext-service.xml配置文件

1<?xml version="1.0" encoding="UTF-8"?> 2<beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 8 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 <!-- 给当前项目服务起个名字 --> 12 <dubbo:application name="dubboxdemo-service"/> 13 <!-- 配置连接zookeeper的IP和端口 --> 14 <dubbo:registry address="zookeeper://192.168.1.88:2181"/> 15 <!-- 配置包扫描, 在这个包下面的实现类中使用@Service注解才会生效 --> 16 <dubbo:annotation package="com.fmjava.service"/> 17</beans> 18
  • 在Java文件夹中, 创建service

dubbo_consumer

  • 引入pom依赖

1 <properties> 2 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 3 <maven.compiler.source>1.7</maven.compiler.source> 4 <maven.compiler.target>1.7</maven.compiler.target> 5 <spring.version>5.1.7.RELEASE</spring.version> 6 </properties> 7 8 <dependencies> 9 <dependency> 10 <groupId>junit</groupId> 11 <artifactId>junit</artifactId> 12 <version>4.11</version> 13 <scope>test</scope> 14 </dependency> 15 <!-- Spring --> 16 <dependency> 17 <groupId>org.springframework</groupId> 18 <artifactId>spring-context</artifactId> 19 <version>${spring.version}</version> 20 </dependency> 21 <dependency> 22 <groupId>org.springframework</groupId> 23 <artifactId>spring-beans</artifactId> 24 <version>${spring.version}</version> 25 </dependency> 26 <dependency> 27 <groupId>org.springframework</groupId> 28 <artifactId>spring-webmvc</artifactId> 29 <version>${spring.version}</version> 30 </dependency> 31 <dependency> 32 <groupId>org.springframework</groupId> 33 <artifactId>spring-jdbc</artifactId> 34 <version>${spring.version}</version> 35 </dependency> 36 <dependency> 37 <groupId>org.springframework</groupId> 38 <artifactId>spring-aspects</artifactId> 39 <version>${spring.version}</version> 40 </dependency> 41 <dependency> 42 <groupId>org.springframework</groupId> 43 <artifactId>spring-jms</artifactId> 44 <version>${spring.version}</version> 45 </dependency> 46 <dependency> 47 <groupId>org.springframework</groupId> 48 <artifactId>spring-context-support</artifactId> 49 <version>${spring.version}</version> 50 </dependency> 51 <!-- dubbo相关 --> 52 <dependency> 53 <groupId>com.alibaba</groupId> 54 <artifactId>dubbo</artifactId> 55 <version>2.6.6</version> 56 </dependency> 57 <dependency> 58 <groupId>org.apache.zookeeper</groupId> 59 <artifactId>zookeeper</artifactId> 60 <version>3.4.6</version> 61 </dependency> 62 <dependency> 63 <groupId>com.github.sgroschupf</groupId> 64 <artifactId>zkclient</artifactId> 65 <version>0.1</version> 66 </dependency> 67 <dependency> 68 <groupId>javassist</groupId> 69 <artifactId>javassist</artifactId> 70 <version>3.11.0.GA</version> 71 </dependency> 72 73 <dependency> 74 <groupId>io.netty</groupId> 75 <artifactId>netty-all</artifactId> 76 <version>4.1.32.Final</version> 77 </dependency> 78 <dependency> 79 <groupId>org.apache.curator</groupId> 80 <artifactId>curator-framework</artifactId> 81 <version>4.0.1</version> 82 <type>bundle</type> 83 </dependency> 84 85 <dependency> 86 <groupId>org.apache.curator</groupId> 87 <artifactId>curator-recipes</artifactId> 88 <version>4.0.1</version> 89 <type>bundle</type> 90 </dependency> 91 </dependencies> 92
  • 添加web.xml配置文件

1<!DOCTYPE web-app PUBLIC 2 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" 3 "http://java.sun.com/dtd/web-app_2_3.dtd" > 4 5<web-app> 6 <display-name>Archetype Created Web Application</display-name> 7 <!-- 解决post乱码 --> 8 <filter> 9 <filter-name>CharacterEncodingFilter</filter-name> 10 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> 11 <init-param> 12 <param-name>encoding</param-name> 13 <param-value>utf-8</param-value> 14 </init-param> 15 <init-param> 16 <param-name>forceEncoding</param-name> 17 <param-value>true</param-value> 18 </init-param> 19 </filter> 20 <filter-mapping> 21 <filter-name>CharacterEncodingFilter</filter-name> 22 <url-pattern>/*</url-pattern> 23 </filter-mapping> 24 25 <!-- 配置springMvc前端控制器 --> 26 <servlet> 27 <servlet-name>springmvc</servlet-name> 28 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 29 <!-- 指定加载的配置文件 ,通过参数contextConfigLocation加载--> 30 <init-param> 31 <param-name>contextConfigLocation</param-name> 32 <param-value>classpath:applicationContext-web.xml</param-value> 33 </init-param> 34 <load-on-startup>1</load-on-startup> 35 </servlet> 36 <servlet-mapping> 37 <servlet-name>springmvc</servlet-name> 38 <!-- 拦截所有,不包括jsp,包含.js .png.css 建议使用 --> 39 <url-pattern>/</url-pattern> 40 </servlet-mapping> 41 42</web-app> 43
  • 在resouces中添加applicationContext-web.xml配置文件

1<?xml version="1.0" encoding="UTF-8"?> 2<beans xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" 4 xmlns:context="http://www.springframework.org/schema/context" 5 xmlns:dubbo="http://code.alibabatech.com/schema/dubbo" xmlns:mvc="http://www.springframework.org/schema/mvc" 6 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 7 http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd 8 http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd 9 http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 10 11 <!--注解扫描--> 12 <context:component-scan base-package="com.itxk"/> 13 14 <!-- 注解驱动 --> 15 <mvc:annotation-driven > 16 <!-- 将传输的字符串强制转换成utf-8编码, 防止中文乱码 --> 17 <mvc:message-converters register-defaults="false"> 18 <bean class="org.springframework.http.converter.StringHttpMessageConverter"> 19 <constructor-arg value="UTF-8" /> 20 </bean> 21 </mvc:message-converters> 22 </mvc:annotation-driven> 23 24 <!-- 给当前项目服务起个名--> 25 <dubbo:application name="dubboxdemo-web" /> 26 <!-- 配置连接zookepper --> 27 <dubbo:registry address="zookeeper://192.168.1.88:2181"/> 28 <!-- 配置包扫描, 只有在这个包下面才可以注入service --> 29 <dubbo:annotation package="com.itxk.controller" /> 30</beans> 31
  • 在Java文件夹中, 创建Controller,调用Service

分别配置tomcat

  • dubbo_service
  • dubbo_consumer
  • 启动时, 先启动service
上一篇:大型网站架构

代码交流 2021