為什么要用dubbo?
先貼上官網:https://github.com/apache/incubator-dubbo。
一般 nginx+tomcat
| ----> Controller1--------->service1
請求----->nginx |
|----->Controller2--------->service2
請求進了Controller 就只有一條路可以走了
使用dubbo后
| ------->service1
請求------>Controller----> |
|---------->service2
簡單的說 也就是 一個Contoller 我可以部署多個 service 。
一般的mvc項目 包含 Controller、Service、ServiceImpl、dao三層
使用doubbo我們可以把項目拆分:
Controller 作為 “消費着” 一個項目
ServiceImpl +dao 作為 “提供者” 一個項目
Servicei “接口” 可以作為一個項目
本項目我接手的時候由兩個項目構成,一個用戶端,一個管理端。經過各種重構后還是不太滿意,各種服務復用性不好(同一個接口得兩邊都要寫,修改一個服務得修改兩次),目前初步構想用dubbo 來重構,service集中起來作為服務提供者,兩個web 項目作為兩個消費者。
准備工作
1、安裝zookeeper
2、部署dubbo-amdin
去官網下載dubbo,解壓得到dubbo-admin,maven編譯。
出現錯誤:Missing artifact com.alibaba:dubbo:jar:2.8.4 dubbo,
去maven網上上並沒有發現2.8.4

將版本替換為2.6.2,打包發布

登錄時,admin /guest一直登錄不上。回過頭來看配置文件、無語。
dubbo.admin.root.password=root
dubbo.admin.guest.password=guest
准備工作到這兒就完成了。
創建maven項目
1、首先創建4個maven項目,其中xtel為pom項目,api為jar項目,server、web為war項目

xtel-api主要寫實體類和定義接口,maven install后會在本地生成jar包,在xtel-server,xtel-web中引用
注意:實體類一定要實現序列化。

xtel-server
pom文件
<?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>com.cdxt</groupId> <artifactId>xtel</artifactId> <version>0.0.1-SNAPSHOT</version> </parent> <artifactId>xtel-server</artifactId> <name>xtel-server</name> <packaging>war</packaging> <url>http://maven.apache.org</url> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>3.8.1</version> <scope>test</scope> </dependency>
<!--依賴引用--> <dependency> <groupId>com.cdxt</groupId> <artifactId>xtel-api</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <!--mybatis 數據訪問層 start --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.38</version> <scope>runtime</scope> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis-spring</artifactId> <version>1.3.0</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.0.20</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.0</version> </dependency> <!-- spring --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-jdbc</artifactId> <version>4.2.0.RELEASE</version> </dependency> <dependency> <groupId>com.dyuproject.protostuff</groupId> <artifactId>protostuff-runtime</artifactId> <version>1.0.8</version> </dependency> <!--mybatis 數據訪問層 end --> </dependencies> <build> <plugins> <plugin> <artifactId>maven-compiler-plugin</artifactId> <version>2.3.2</version> <configuration> <source>1.7</source> <target>1.7</target> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-war-plugin</artifactId> <version>2.6</version> </plugin> </plugins> </build> </project>
dubbo生產者配置
<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo
http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-server" />
<dubbo:registry address="zookeeper://localhost:2181" />
<!-- 用dubbo協議在20880端口暴露服務 -->
<dubbo:protocol name="dubbo" port="20880" />
<!--使用 dubbo 協議實現定義好的 api.PermissionService 接口 -->
<!--具體實現該接口的 bean
<dubbo:service interface="com.cdxt.xtel.api.group.GroupManageService"
ref="groupManageService" protocol="dubbo" />-->
<!-- 使用注解方式暴露 -->
<dubbo:annotation package="com.cdxt.xtel.server.impl"/>
</beans>
orm層配置
<!--配置整合mybatis過程 -->
<!--1、配置數據庫相關參數 -->
<context:property-placeholder location="classpath:jdbc.properties"
ignore-unresolvable="true" />
<!-- 阿里 druid數據庫連接池 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
destroy-method="close">
<!-- 數據庫基本信息配置 -->
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<!--<property name="passwordCallback" ref="dbPasswordCallback"/> -->
<property name="driverClassName" value="${jdbc.driverClassName}" />
<property name="filters" value="${jdbc.filters}" />
<!-- 最大並發連接數 -->
<property name="maxActive" value="${jdbc.maxActive}" />
<!-- 初始化連接數量 -->
<property name="initialSize" value="${jdbc.initialSize}" />
<!-- 配置獲取連接等待超時的時間 -->
<property name="maxWait" value="${jdbc.maxWait}" />
<!-- 最小空閑連接數 -->
<property name="minIdle" value="${jdbc.minIdle}" />
<!-- 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}" />
<!-- 配置一個連接在池中最小生存的時間,單位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}" />
<property name="validationQuery" value="${jdbc.validationQuery}" />
<property name="testWhileIdle" value="${jdbc.testWhileIdle}" />
<property name="testOnBorrow" value="${jdbc.testOnBorrow}" />
<property name="testOnReturn" value="${jdbc.testOnReturn}" />
<property name="maxOpenPreparedStatements" value="${jdbc.maxOpenPreparedStatements}" />
<!-- 打開removeAbandoned功能 -->
<property name="removeAbandoned" value="${jdbc.removeAbandoned}" />
<!-- 1800秒,也就是30分鍾 -->
<property name="removeAbandonedTimeout" value="${jdbc.removeAbandonedTimeout}" />
<!-- 關閉abanded連接時輸出錯誤日志 -->
<property name="logAbandoned" value="${jdbc.logAbandoned}" />
</bean>
<!--mapper解析 -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean"
p:configLocation="classpath:mybatis-config.xml" p:dataSource-ref="dataSource"
p:mapperLocations="classpath:com/cdxt/xtel/server/mapper/**/*Mapper.xml">
<property name="typeAliasesPackage"
value="com.cdxt.xtel.pojo.group,com.cdxt.xtel.pojo.lesson,com.cdxt.xtel.pojo.sys" />
</bean>
<!-- sqlSessionFactory -->
<!-- 聲明接口 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"
p:sqlSessionFactoryBeanName="sqlSessionFactoryBean">
<property name="basePackage"
value="com.cdxt.xtel.server.mapper.sys,
com.cdxt.xtel.server.mapper.group,com.cdxt.xtel.server.mapper.lesson" />
</bean>
</beans>
spring配置
<!-- 自動掃描dao和service包(自動注入) -->
<context:component-scan base-package="com.cdxt.xtel.server.*" />
<!--配置事務管理器(mybatis采用的是JDBC的事務管理器)-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!--配置基於注解的聲明式事務,默認使用注解來管理事務行為-->
<tx:annotation-driven transaction-manager="transactionManager"/>
service層代碼

xtel-web
dubbo消費者配置
<?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:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<dubbo:application name="dubbo-web"/>
<!--向 zookeeper 訂閱 provider 的地址,由 zookeeper 定時推送-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 使用注解方式暴露 -->
<dubbo:annotation package="com.cdxt.xtel.web"/>
</bean
controller層

啟動server 后我們就可以通過dubbo-admin觀察到服務已經完成了注冊

