SOA分布式架构搭建(dubbo)

一、分布式架构的演进

1.单一应用架构

单一应用架构概念图

  • 优点:适用于小型网站,小型管理系统,将所有功能都部署到一个功能里,简单易用。
  • 缺点: 1.性能扩展比较难  2.协同开发问题  3.不利于升级维护

2.垂直应用架构

javascript:void(0);
垂直应用架构概念图

  • 优点:通过切分业务来实现单个模块单独独立部署,降低了维护和部署的难度,团队各司其职比较容易,性能扩展也更方便,更有针对性。
  • 缺点:公用模块无法重复利用,开发性能浪费

3.分布式应用架构

分布式应用架构概念图

  • 优点:将各个应用通过分层独立出来,可以利用rpc实现web与service、service与service的互相调用,提高了代码的复用性。
  • 缺点:每个调用的模块都要存储一份完整的被调用模块的位置和状态,一旦位置和状态发生变化,就要更新所有涉及的配置

4.面向服务的分布式架构

面向服务的分布式架构概念图

  架构概述:随着架构不断增大,服务节点也越来越多,服务之间的调用和依赖关系也越来越负责,需要一个统一的中心来调度、路由、管理所有的服务基于这个中心构建的这个新型架构就是目前主流的SOA分布式架构。

二、分布式工程的模块搭建

1、分布式模块文件图

分布式模块文件图

  由于查询web应用需要调用爬虫service接口,那么必须在订单的工程中也包含一份service接口。

  如果拷贝一个接口道查询工程中,那么如果以后有更多的模块都调用这个接口呢?每个接口都拷贝一份嘛?

  这种情况就可以利用maven的依赖把这些接口作为公共的包管理起来。同时接口类中的方法也引用了很多的实体bean,那么同样的实体bean类也可以统一管理起来。

2、分布式依赖关系图

分布式依赖关系图

3、分布式某块模块搭建

①创建parent模块

  • 新建maven模块

  • 定义模块名、包名

  • parent模块中的 pom.xml

 由于依赖包分布于多个模块中,最好有一个地方能够把所有依赖的版本管理起来。这里便可以使用maven中的<parent>概念。可以让所有的模块都继承这个parent模块,由这个parent模块来管理版本。</parent>

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.21.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-parent</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-parent</name>
    <packaging>pom</packaging>
    <description>Demo project for Spring Boot</description>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <java.version>1.8</java.version>

        <fastjson.version>1.2.46</fastjson.version>
        <dubbo-starter.version>1.0.10</dubbo-starter.version>
        <dubbo.version>2.6.0</dubbo.version>
        <zkclient.version>0.10</zkclient.version>
        <mybatis.version>1.3.1</mybatis.version>
        <nekohtml.version>1.9.20</nekohtml.version>
        <xml-apis.version>1.4.01</xml-apis.version>
        <batik-ext.version>1.9.1</batik-ext.version>
        <jsoup.version>1.11.2</jsoup.version>
        <httpclient.version>4.5.5</httpclient.version>
        <commons-lang3.version>3.7</commons-lang3.version>
        <mapper-starter.version>1.2.3</mapper-starter.version>
        <jedis.version>2.9.0</jedis.version>
        <jest.version>5.3.3</jest.version>
        <jna.version>4.5.1</jna.version>
        <beanUtils.version>1.9.3</beanUtils.version>
    </properties>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>${fastjson.version}</version>
            </dependency>

            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>dubbo</artifactId>
                <version>${dubbo.version}</version>
            </dependency>

            <dependency>
                <groupId>com.101tec</groupId>
                <artifactId>zkclient</artifactId>
                <version>${zkclient.version}</version>
            </dependency>

            <dependency>
                <groupId>com.gitee.reger</groupId>
                <artifactId>spring-boot-starter-dubbo</artifactId>
                <version>${dubbo-starter.version}</version>
            </dependency>

            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>${mybatis.version}</version>
            </dependency>


            <dependency>
                <groupId>net.sourceforge.nekohtml</groupId>
                <artifactId>nekohtml</artifactId>
                <version>${nekohtml.version}</version>
            </dependency>

            <dependency>
                <groupId>xml-apis</groupId>
                <artifactId>xml-apis</artifactId>
                <version>${xml-apis.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.xmlgraphics</groupId>
                <artifactId>batik-ext</artifactId>
                <version>${batik-ext.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.jsoup/jsoup -->
            <dependency>
                <groupId>org.jsoup</groupId>
                <artifactId>jsoup</artifactId>
                <version>${jsoup.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>${httpclient.version}</version>
            </dependency>

            <dependency>
                <groupId>org.apache.commons</groupId>
                <artifactId>commons-lang3</artifactId>
                <version>${commons-lang3.version}</version>
            </dependency>


            <dependency>
                <groupId>tk.mybatis</groupId>
                <artifactId>mapper-spring-boot-starter</artifactId>
                <version>${mapper-starter.version}</version>
            </dependency>

            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>${jedis.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/io.searchbox/jest -->
            <dependency>
                <groupId>io.searchbox</groupId>
                <artifactId>jest</artifactId>
                <version>${jest.version}</version>
            </dependency>

            <!-- https://mvnrepository.com/artifact/net.java.dev.jna/jna -->
            <dependency>
                <groupId>net.java.dev.jna</groupId>
                <artifactId>jna</artifactId>
                <version>${jna.version}</version>
            </dependency>

            <dependency>
                <groupId>commons-beanutils</groupId>
                <artifactId>commons-beanutils</artifactId>
                <version>${beanUtils.version}</version>
            </dependency>


        </dependencies>
    </dependencyManagement>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframwork.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>
  • 在idea右边菜单执行安装

②搭建Util模块

  • Util模块种类
  1. web业务模块用到的第三方包,比如页面渲染工具、操作cookie的工具类等等。
  2. service业务模块用到的第三方包,比如jdbc、mybatis、jedis、activemq工具包等等。
  3. 通用型的第三方包,比如fastjson、httpclient、apache工具包等等。
  4. 只有本模块用到的 es
  • Util模块依赖关系图

  • 创建三个Util模块

  • Util模块中的 pom.xml
  1. souzhi-common-util
spring-boot-starter-test 测试(springboot有默认版本号)
spring-boot-starter-web 内含tomcat容器、HttpSevrletRequest等 (springboot有默认版本号)
spring-boot-devtools 热部署插件
spring-boot-starter-test SpringBoot 测试依赖
fastjson json工具
commons-lang3 方便好用的apache工具库
commons-beanutils 方便好用的apache处理实体bean工具库
commons-codec 方便好用的apache解码工具库
httpclient restful调用客户端
spring-boot-starter-dubbo 内包含 dubbo、zookeeper依赖
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.couragehe.souzhi</groupId>
        <artifactId>souzhi-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-common-util</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-common-util</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <!-- SpringBoot 热部署插件       -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>         <!--这个设置为true热部署才会生效-->
        </dependency>
        <!--  SpringBoot 测试包      -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <!-- SpringBoot mvc web必备插件-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- 阿里开发json 包 因为dubbo也是阿里开发,使用阿里系jar兼容性更佳       -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
        </dependency>

        <!-- httpclient  restful包      -->
        <dependency>
            <groupId>org.apache.httpcomponents</groupId>
            <artifactId>httpclient</artifactId>
        </dependency>

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-beanutils</groupId>
            <artifactId>commons-beanutils</artifactId>
        </dependency>

        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
        </dependency>

        <dependency>
            <groupId>com.gitee.reger</groupId>
            <artifactId>spring-boot-starter-dubbo</artifactId>
        </dependency>
    </dependencies>


    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. souzhi-web-util
Thymeleaf/jsp/freemarker springboot自带页面渲染工具(springboot有默认版本号)
spring-boot-starter-thymeleaf springBoot 的原生渲染模板
spring-boot-starter-security 安全防护体系中
thymeleaf-extras-springsecurity4 Thymeleaf方言支持SpringSecurity 依赖
nekohtml thymeleaf支持包、松检验,容错性
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.couragehe.souzhi</groupId>
        <artifactId>souzhi-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-web-util</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-web-util</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-common-util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>


        <!-- thymeleaf是 springBoot 的原生渲染模板 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <!-- Thymeleaf方言支持SpringSecurity 依赖-->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
            <version>3.0.2.RELEASE</version>
        </dependency>

        <!--    thymeleaf支持包、松检验,容错性 -->
        <dependency>
            <groupId>net.sourceforge.nekohtml</groupId>
            <artifactId>nekohtml</artifactId>
        </dependency>


    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  1. souzhi-service-util
spring-boot-starter-jdbc 数据库驱动(springboot有默认版本号)
mysql-connector-java jdbc驱动器数据库连接器
mybatis-spring-boot-starter mybatis(springboot有默认版本号)
spring-boot-starter-jdbc 自动配置数据访问的基础设施
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.couragehe.souzhi</groupId>
        <artifactId>souzhi-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-service-util</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-service-util</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-common-util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>

        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>1.3.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

③搭建api模块

  将interface模块与bean模块整合一起则为api模块

  利用maven的依赖把这些接口作为公共的包管理起来。同时接口类中的方法也引用了很多的实体bean,那么同样的实体bean类也可以统一管理起来。

  • api模块依赖关系图

  bean模块其中引用了通用mapper,所以我们把通用mapper的依赖提取出来放到bean模块后面,变成如下结构。

  • api模块中的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-api</name>
    <description>Demo project for Spring Boot</description>

    <dependencies>
        <!-- 通用mapper 实现对单表的简单增上改查       -->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>1.2.3</version>
            <exclusions>
                <exclusion>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-starter-jdbc</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>



    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

④搭建应用模块(souzhi-search-web)

  • search-web模块依赖关系图

分布式依赖关系图

  • search-web模块中的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.couragehe.souzhi</groupId>
        <artifactId>souzhi-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-search-web</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-search-web</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-web-util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <!-- SpringBoot 热部署插件       -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>         <!--这个设置为true热部署才会生效-->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • Controller测试代码
@Controller
public class SearchController {
    @Reference//import com.alibaba.dubbo.config.annotation.Reference;
    SearchService searchService;

    @RequestMapping("index")
    @ResponseBody
    public String index(){
        String msg = searchService.index();
        return msg;
    }
}
  • 配置文件
server.port=8055

#日志级别
logging.level.root=info
#dubbo的配置
#dubbo中的服务名称
spring.dubbo.application=search-web
#dubbo中的通讯协议名称
spring.dubbo.protocol.name=dubbo
#Zookeeper注册中心的地址
spring.dubbo.registry.address=www.aliyunme.com:2181
#Zookeeper的通讯协议的名称
spring.dubbo.registry.protocol=zookeeper
#dubbo的服务的扫描路径
spring.dubbo.base-package=com.couragehe.souzhi
#设置超时时间
spring.dubbo.consumer.timeout=600000
#设置是否检测服务存在
spring.dubbo.consumer.check=false

#thymeleaf配置
#关闭thymeleaf的缓存(开发时:可观测实时画面)
spring.thymeleaf.cache=false
#松校验(没有/,需导入nekohtml库配合使用)
spring.thymeleaf.mode=LEGACYHTML5
#springSecurity
# 关闭HTTP基本验证
security.basic.enabled=false

④搭建应用模块(souzhi-search-service)

  • search-service模块依赖关系图

分布式依赖关系图

  • search-web模块中的 pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>com.couragehe.souzhi</groupId>
        <artifactId>souzhi-parent</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </parent>
    <groupId>com.couragehe.souzhi</groupId>
    <artifactId>souzhi-search-service</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>souzhi-search-service</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-api</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

        <dependency>
            <groupId>com.couragehe.souzhi</groupId>
            <artifactId>souzhi-service-util</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>
        <!-- SpringBoot 热部署插件       -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <optional>true</optional>         <!--这个设置为true热部署才会生效-->
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>
  • Service测试代码
@Service//import com.alibaba.dubbo.config.annotation.Service;
public class SearchServiceImpl implements SearchService {
    @Override
    public String index() {
        return "index";
    }
}
  • 配置文件
server.port=8010
#日志级别
logging.level.root=debug

#jdbc
spring.datasource.username=couragehe
spring.datasource.password=13579Aly.
spring.datasource.url=jdbc:mysql://www.aliyunme.com:3306/souzhi_db?characterEncoding=UTF-8

#mybatis配置文件存放位置
mybatis.mapper-locations=classpath:mapper/*Mapper.xml
#将带有下划线的表字段映射为驼峰格式的字体类属性
mybatis.configuration.map-underscore-to-camel-case=true

##dubbo的配置
#dubbo中的服务名称
spring.dubbo.application=search-service
#dubbo中的通讯协议名称
spring.dubbo.protocol.name=dubbo
#Zookeeper注册中心的地址
spring.dubbo.registry.address=www.aliyunme.com:2181
#Zookeeper的通讯协议的名称
spring.dubbo.registry.protocol=zookeeper
#dubbo的服务的扫描路径
spring.dubbo.base-package=com.couragehe.souzhi
#设置超时时间
spring.dubbo.consumer.timeout=600000
#设置是否检测服务存在
spring.dubbo.consumer.check=false

相关安装教程推荐:

Linux中zookeeper安装

Linux中部署Tomcat项目,自行下载编译所需dubbo的war包,进行部署即可。此处提供dubbo war包2.60