不积跬步,无以至千里;不积小流,无以成江海。

Dubbo+Zookeeper+SSM框架整合构建分布式项目

网站建设 康康 3947℃ 2评论

一、Dubbo与Zookeeper介绍

Dubbo建议使用Zookeeper作为服务的注册中心。

1.   Zookeeper的作用:

     ZooKeeper是一种为分布式应用所设计的高可用、高性能且一致的开源协调服务,它提供了一项基本服务:分布式锁服务。由于ZooKeeper的开源特性,后来我们的开发者在分布式锁的基础上,摸索了出了其他的使用方法:配置维护、组服务、分布式消息队列、分布式通知/协调等。
ZooKeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是ip地址和服务名称的对应关系。当然也可以通过硬编码的方式把这种对应关系在调用方业务代码中实现,但是如果提供服务的机器挂掉调用者无法知晓,如果不更改代码会继续请求挂掉的机器提供服务。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除。至于支持高并发,简单来说就是横向扩展,在不更改代码的情况通过添加机器来提高运算能力。通过添加新的机器向zookeeper注册服务,服务的提供者多了能服务的客户就多了。

2.  dubbo简介:

DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架

注意这里的dubbo只是一个框架,至于你架子上放什么是完全取决于你的,就像一个汽车骨架,你需要配你的轮子引擎。这个框架中要完成调度必须要有一个分布式的注册中心,储存所有服务的元数据,我们可以用ZooKeeper,也可以用别的。

Dubbo是一个分布式服务框架,解决了上面的所面对的问题,Dubbo的架构如图所示:

节点角色说明:

Provider: 暴露服务的服务提供方。

Consumer: 调用远程服务的服务消费方。

Registry: 服务注册与发现的注册中心。

Monitor: 统计服务的调用次调和调用时间的监控中心。

Container: 服务运行容器。

调用关系说明:

0. 服务容器负责启动,加载,运行服务提供者。

1. 服务提供者在启动时,向注册中心注册自己提供的服务。

2. 服务消费者在启动时,向注册中心订阅自己所需的服务。

3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。

4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。

5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。

Dubbo提供了很多协议,Dubbo协议、RMI协议、Hessian协议,我们查看Dubbo源代码,有各种协议的实现,如图所示:

我们之前没用Dubbo之前时,大部分都使用Hessian来使用我们服务的暴露和调用,利用HessianProxyFactory调用远程接口。

3. zookeeper和dubbo的关系:

      Dubbo的将注册中心进行抽象,使得得它可以外接不同的存储媒介给注册中心提供服务,而Zookeeper提供注册服务,Dubbo服务方启动后会将提供的服务注册到Zookeeper,Dubbo消费方启动后会向注册中心订阅服务,然后通过远程调用来访问服务。通俗一点,整个过程Zookeeper扮演着商店的角色,Dubbo服务方则是供货方,所提供的的商品则是接口,Dubbo消费方则是消费者。
86399212_2

 4.dubbo-admin

      dubbo-admin是dubbo提供的一个用于管理dubbo服务的控制台,其开源部分主要包含: 提供者  路由规则  动态配置  访问控制  权重调节  负载均衡  负责人,等管理功能。

1.下载dubbo,里面有个 dubbo-admin-xxxx.war 扔到tomcat 里,
dubbo-admin下载:http://pan.baidu.com/s/1kVObrGb
2.配置dubbo.properties

vim webapps/ROOT/WEB-INF/dubbo.properties
    dubbo.registry.address=zookeeper://10.0.65.3:2181

    dubbo.admin.root.password=root

    dubbo.admin.guest.password=guest

3.启动zookeeper后,启动tomcat  localhost:8080/

登录密码为root/root

二、整合Zookeeper、Dubbo、Spring、SpringMVC、MyBatis

1.创建Maven项目,pox.xml 引入必备jar包

<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">

<modelVersion>4.0.0</modelVersion>

<groupId>top.cwk</groupId>

<artifactId>dubbo-parent</artifactId>

<version>0.0.1-SNAPSHOT</version>

<packaging>pom</packaging>

<name>dubbo-parent</name>

<url>http://maven.apache.org</url>

<properties>

<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

<spring.version>4.2.4.RELEASE</spring.version>

<junit.version>4.10</junit.version>

<mysql.version>5.1.34</mysql.version>

<mybatis.version>3.2.1</mybatis.version>

<jboss.resteasy.version>3.0.10.Final</jboss.resteasy.version>

<poi.version>3.9</poi.version>

<axis.version>1.4</axis.version>

</properties>

<build>

<plugins>

<plugin>

<!-- 指定编译所用jdk的版本 -->

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.5.1</version>

<configuration>

<source>1.7</source>

<target>1.7</target>

</configuration>

</plugin>

</plugins>

</build>

<dependencies>

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>${junit.version}</version>

<scope>test</scope>

</dependency>

<!-- spring相关jar包 -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context-support</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-core</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-webmvc</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-orm</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-tx</artifactId>

<version>${spring.version}</version>

<type>jar</type>

</dependency>

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>${spring.version}</version>

<scope>test</scope>

</dependency>

<!-- 连接MySQL数据库需要的jar-->

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>${mysql.version}</version>

</dependency>

<!-- dbcp连接池需要的jar-->

<dependency>

<groupId>commons-dbcp</groupId>

<artifactId>commons-dbcp</artifactId>

<version>1.4</version>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>jstl</artifactId>

<version>1.2</version>

</dependency>

<dependency>

<groupId>log4j</groupId>

<artifactId>log4j</artifactId>

<version>1.2.17</version>

</dependency>

<!-- 文件上传需要的jar-->

<dependency>

<groupId>commons-fileupload</groupId>

<artifactId>commons-fileupload</artifactId>

<version>1.2.1</version>

</dependency>

<dependency>

<groupId>commons-io</groupId>

<artifactId>commons-io</artifactId>

<version>2.4</version>

</dependency>

<!-- mybatis 需要的jar -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>${mybatis.version}</version>

</dependency>

<dependency>

<groupId>javax.servlet.jsp</groupId>

<artifactId>jsp-api</artifactId>

<version>2.2</version>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>compile</scope>

</dependency>

<dependency>

<groupId>javax.validation</groupId>

<artifactId>validation-api</artifactId>

<version>1.1.0.Final</version>

</dependency>

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.2.3</version>

</dependency>

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.8.6</version>

</dependency>

<dependency>

<groupId>org.apache.ant</groupId>

<artifactId>ant</artifactId>

<version>1.7.0</version>

</dependency>

<!-- dubbo相关 -->

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>dubbo</artifactId>

<version>2.5.3</version>

<exclusions>

<exclusion>

<artifactId>spring</artifactId>

<groupId>org.springframework</groupId>

</exclusion>

</exclusions>

</dependency>

<!-- zookeeper相关 -->

<dependency>

<groupId>org.apache.zookeeper</groupId>

<artifactId>zookeeper</artifactId>

<version>3.4.6</version>

</dependency>

<dependency>

<groupId>com.101tec</groupId>

<artifactId>zkclient</artifactId>

<version>0.10</version>

</dependency>

<!-- 处理json数据 -->

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-core</artifactId>

<version>2.4.3</version>

</dependency>

<dependency>

<groupId>com.fasterxml.jackson.core</groupId>

<artifactId>jackson-databind</artifactId>

<version>2.4.3</version>

</dependency>

</dependencies>

<modules>

<module>dubbo-demo-core</module>

<module>dubbo-demo-client</module>

<module>dubbo-demo-api</module>

<module>dubbo-demo-model</module>

</modules>

</project>

 2.创建Maven子项目

  • dubbo-demo-api java项目,api接口(作为子项目被client和core所依赖)
  • dubbo-demo-model java项目,实体类(作为子项目被client和core所依赖)
  • dubbo-demo-client web项目,dubbo客户端
  • dubbo-demo-core web项目,dubbo服务端(api接口实现)
QQ截图20170608160001

3.dubbo-demo-core项目的构建

该项目为Dubbo服务端,主要提供服务接口,完成业务逻辑
  • dubbo-demo-core 的pom.xml

<?xml version="1.0"?>

<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<modelVersion>4.0.0</modelVersion>

<parent>

<groupId>top.cwk</groupId>

    <artifactId>dubbo-parent</artifactId>

    <version>0.0.1-SNAPSHOT</version>

</parent>

<groupId>top.cwk.core</groupId>

<artifactId>dubbo-demo-core</artifactId>

<version>0.0.1.0-SNAPSHOT</version>

<packaging>war</packaging>

<name>dubbo-demo-core</name>

<url>http://maven.apache.org</url>

<dependencies>

<!-- 引用API -->

<dependency>

<groupId>top.cwk.api</groupId>

<artifactId>dubbo-demo-api</artifactId>

<version>0.0.1.0-SNAPSHOT</version>

</dependency>

<!-- 数据库连接池-->

<dependency>

<groupId>c3p0</groupId>

<artifactId>c3p0</artifactId>

<version>0.9.1.2</version>

</dependency>

<!-- mybatis-spring -->

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis-spring</artifactId>

<version>1.2.3</version>

</dependency>

</dependencies>

</project>

  • dubbo-demo-core 的db.properties 数据库连接配置

jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc\:mysql\://127.0.0.1\:3306/dubbo_db?useUnicode\=true&characterEncoding\=UTF-8

  • dubbo-demo-core 的applicationContext.xml spring配置、数据源配置

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://www.springframework.org/schema/beans"

xmlns:aop="http://www.springframework.org/schema/aop"

xmlns:context="http://www.springframework.org/schema/context"

xmlns:tx="http://www.springframework.org/schema/tx"

xmlns:cache="http://www.springframework.org/schema/cache"

xmlns:p="http://www.springframework.org/schema/p"

xmlns:mvc="http://www.springframework.org/schema/mvc"

xmlns:task="http://www.springframework.org/schema/task"

xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd

        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-4.2.xsd

        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/cache http://www.springframework.org/schema/cache/spring-cache-4.0.xsd

        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

 

<context:component-scan base-package="top.cwk.core.*.serviceimpl"/>

<!-- 配置数据源 -->

<context:property-placeholder location="classpath:spring/db.properties"/>

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">

<property name="driverClass" value="${jdbc.driverClass}" />

<property name="jdbcUrl" value="${jdbc.jdbcUrl}" />

<property name="user" value="${jdbc.user}" />

<property name="password" value="${jdbc.password}" />

<property name="maxPoolSize" value="6" />

<!-- 指定连接池中保留的最小连接数 -->

<property name="minPoolSize" value="6" />

<!-- 指定连接池的初始化连接数 取值应在minPoolSize 与 maxPoolSize 之间.Default:3 -->

<property name="initialPoolSize" value="6" />

<!-- 最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。 Default:0 -->

<property name="maxIdleTime" value="60" />

<!-- 当连接池中的连接耗尽的时候c3p0一次同时获取的连接数. Default:3 -->

<property name="acquireIncrement" value="3" />

<!-- JDBC的标准,用以控制数据源内加载的PreparedStatements数量。 但由于预缓存的statements属于单个connection而不是整个连接池所以设置这个参数需要考虑到多方面的因数.如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default:0 -->

<property name="maxStatements" value="0" />

<!-- 每60秒检查所有连接池中的空闲连接.Default:0 -->

<property name="idleConnectionTestPeriod" value="0" />

<property name="autoCommitOnClose" value="false"/>

</bean>

 

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="mapperLocations" value="classpath:top/cwk/mapper/**/*Mapper.xml"/>

<!-- 将myBatis配置加载到sessionFactory -->

<property name="configLocation" value="classpath:spring/mybatis.cfg.xml" />

</bean>

<!-- 配置扫描mybatis的接口 -->

<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">

<property name="basePackage" value="top.cwk.core.*.mapper"></property>

<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>

</bean>

<bean id="txManager"

class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

<property name="dataSource" ref="dataSource"></property>

</bean>

<tx:advice id="txAdvice" transaction-manager="txManager">

<tx:attributes>

<tx:method name="save*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

<tx:method name="exe*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

<tx:method name="update*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

<tx:method name="add*" propagation="REQUIRED" rollback-for="java.lang.Exception"/>

<tx:method name="select*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="find*" propagation="SUPPORTS" read-only="true"/>

<tx:method name="get*" propagation="SUPPORTS" read-only="true"/>

</tx:attributes>

</tx:advice>

<aop:config>

<aop:advisor advice-ref="txAdvice"

pointcut="execution(* top.cwk.core.*.serviceimpl.*.*(**))" />

</aop:config>

<!-- 引入dubbo配置文件 -->

<import resource="spring-dubbo.xml"/>

</beans>

  • dubbo-demo-core 的spring-dubbo.xml 配置dubbo服务

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://www.springframework.org/schema/beans" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"

xsi:schemaLocation="http://www.springframework.org/schema/beans

    http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

    http://code.alibabatech.com/schema/dubbo         

    http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

<dubbo:application name="cwk-dubbo-core-provider"/>

<!-- 使用zookeeper注册中心暴露服务地址 -->

<dubbo:registry id="cwk-provider" address="zookeeper://127.0.0.1:2181" check="false" subscribe="false" register=""/>

<dubbo:protocol id="cwk" name="dubbo" port="21999"/>

<dubbo:provider registry="cwk-provider" protocol="cwk"/>

<!-- 声明需要暴露的服务接口 -->

<dubbo:service interface="top.cwk.api.customer.ICustomerService" ref="customerService" timeout="10000"/>

</beans>

  • dubbo-demo-core 的mybatis.cfg.xml mybatis配置

<?xml version="1.0" encoding="UTF-8" ?>

<!DOCTYPE configuration

PUBLIC "-//mybatis.org//DTD Config 3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

<!-- 配置实体对象的包 -->

<typeAliases>

<package name="top.cwk.model"/>

</typeAliases>

</configuration>

3.dubbo-demo-client项目的构建

  • applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

xmlns="http://www.springframework.org/schema/beans"

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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

        http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd

        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">

<context:annotation-config/>

<context:component-scan base-package="top.cwk.controller" />

<!-- 引入dubbo配置文件 -->

<import resource="spring-dubbo.xml"/>

</beans>

4.完整的demo下载

https://git.oschina.net/god007/ssm_dubbo_zookeeper.git

 

转载请注明:左手代码右手诗 » Dubbo+Zookeeper+SSM框架整合构建分布式项目

喜欢 (6)or分享 (0)
发表我的评论
取消评论

 

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(2)个小伙伴在吐槽
  1. 把你的后台登录地址修改下
    龙筱福2019-01-22 15:28 回复
    • 请问大神,访问消费端的浏览器地址是多少?
      atu2019-02-01 22:39 回复