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模块种类
- web业务模块用到的第三方包,比如页面渲染工具、操作cookie的工具类等等。
- service业务模块用到的第三方包,比如jdbc、mybatis、jedis、activemq工具包等等。
- 通用型的第三方包,比如fastjson、httpclient、apache工具包等等。
- 只有本模块用到的 es
- Util模块依赖关系图
- 创建三个Util模块
- Util模块中的 pom.xml
- 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>
- 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>
- 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中部署Tomcat项目,自行下载编译所需dubbo的war包,进行部署即可。此处提供dubbo war包2.60