zoukankan      html  css  js  c++  java
  • 分布式架构

    分布式架构

    系统架构

    垂直项目架构

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

    结构图

    SOA架构(分布式架构)

    SOA(Service-Oriented Architecture)它是一种支持面向服务的架构。
    
    特点
    	将传统项目中的一个模块,拆分成一个一个项目
    
    优点
    	降低模块之间的耦合度
    	利于扩展
    	利于维护
    缺点
    	结构复杂
    	对于小型项目 ,成本比较高
    特点
    	模块的拆分
    		如果某一个系统访问量比较大时, 可以多部署几台tomcat,
    		当出现高并发的时候 , 通过nigix负载均衡,进行分配访问
    		如果今后, 想要再添加 一个模块, 可以直接在写一个项目,弄台新机器,直接上线
    	业务功能的拆分
    		除了把对应模块拆成一个系统外, 还可以把我们的三层架构拆成对应的服务,把Controller做为一个系统,Dao和Service做为一个系统
    		如果调用多了,一台不够用户了, 可以多部署几台
    	存在的问题
    		在以前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方法

    同类型的技术有哪些

    Dubbo
    
    DubboX
    	优点
    		传输效率快
    	缺点
    		Controller和Service两个项目必须都是Java语言实现
    		
    springCloud
    
    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环境下安装
    1.安装JDK
    	rm -f /var/run/yum.pid
    	yum -y install java-1.8.0-openjdk.x86_64
    	java -version
    2.把 zookeeper 的压缩包,上传到Linux系统/usr/local目录下
    	cd /usr/local
    
    3.解压缩压缩包
    	tar -zxvf zookeeper-3.4.6.tar.gz
    	rm -rf zookeeper-3.4.6.tar.gz
    4.进入conf目录 ,把 zoo_sample.cfg 改名为 zoo.cfg
    	cd conf
    	mv zoo_sample.cfg zoo.cfg
    5.进入bin目录,启动服务输入命令
    	./zkServer.sh start
    6.查看状态
    	./zkServer.sh status
    7.关闭服务
    	./zkServer.sh stop
    8.关闭防火墙
    	systemctl stop firewalld.service
    

    Dubbo实例

    dubbo_service

    • 引入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.1.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>
    		<type>bundle</type>
    	</dependency>
    
    	<dependency>
    		<groupId>org.apache.curator</groupId>
    		<artifactId>curator-recipes</artifactId>
    		<version>4.0.1</version>
    		<type>bundle</type>
    	</dependency>
    </dependencies>
    
    • 添加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>
    
    • 在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.1.88:2181"/>
        <!-- 配置包扫描, 在这个包下面的实现类中使用@Service注解才会生效 -->
        <dubbo:annotation package="com.fmjava.service"/>
    </beans>
    
    • 在Java文件夹中, 创建service

    dubbo_consumer

    • 引入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.1.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>
                <type>bundle</type>
            </dependency>
    
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>4.0.1</version>
                <type>bundle</type>
            </dependency>
        </dependencies>
    
    • 添加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>
    
    • 在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.itxk"/>
    
        <!-- 注解驱动 -->
        <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.1.88:2181"/>
        <!-- 配置包扫描, 只有在这个包下面才可以注入service -->
        <dubbo:annotation package="com.itxk.controller" />
    </beans>
    
    • 在Java文件夹中, 创建Controller,调用Service

    分别配置tomcat

    • dubbo_service
    • dubbo_consumer
    • 启动时, 先启动service
  • 相关阅读:
    poj 3243 Clever Y(BabyStep GiantStep)
    poj 2417 Discrete Logging
    poj 3481 Double Queue
    hdu 4046 Panda
    hdu 2896 病毒侵袭
    poj 1442 Black Box
    hdu 2815 Mod Tree
    hdu 3065 病毒侵袭持续中
    hdu 1576 A/B
    所有控件
  • 原文地址:https://www.cnblogs.com/mumuyinxin/p/11704133.html
Copyright © 2011-2022 走看看