一、dubbo介紹
-
dubbo是什麼?
本質:一個Jar包,一個分佈式框架,,一個遠程服務調用的分佈式框架。 既然是新手教學,肯定很多同學不明白什麼是分佈式和遠程服務調用,爲什麼要分佈式,爲什麼要 遠程調用。
-
Dubbo的好處?
- 透明化的遠程方法調用,就像調用本地方法一樣調用遠程方法,只需簡單配置,沒有任何API侵 入。
- 軟負載均衡及容錯機制,可在內網替代F5等硬件負載均衡器,降低成本,減少單點。
- 服務自動註冊與發現,不再需要寫死服務提供方地址,註冊中心基於接口名查詢服務提供者的IP 地址,並且能夠平滑添加或刪除服務提供者。
- Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載 Dubbo的配置即可,Dubbo基於Spring的Schema擴展進行加載。
-
dubbo架構
0. 服務容器負責啓動,加載,運行服務提供者。 1. 服務提供者(生產者)在啓動時,向註冊中心註冊自己提供的服務。 2. 服務消費者在啓動時,向註冊中心訂閱自己所需的服務。 3. 註冊中心返回服務提供者地址列表給消費者,如果有變更,註冊中心將基於長連接推送變更數據 給消費者。 4. 服務消費者,從提供者地址列表中,基於軟負載均衡算法,選一臺提供者進行調用,如果調用失敗,再選另一臺調用。 5. 服務消費者和提供者,在內存中累計調用次數和調用時間,定時每分鐘發送一次統計數據到監控中心。
二、zookeeper介紹
- zookeeper介紹
-
zookeeper實際上是yahoo開發的,用於分佈式中一致性處理的框架。
-
背景介紹:最初其作爲研發Hadoop時的副產品。由於分佈式系統中一致性 處理較爲困難,其他的分佈式系統沒有必要 費勁重複造輪子,故隨後的分佈式 系統中大量應用了zookeeper。故隨後的大部分分佈式系統中大量應用了 zookeeper,以至於zookeeper成爲了各種分佈式系統的基礎組件,其地位之 重要,可想而知。(類比下之前學習過的netty,netty是對 socket 網絡編程的優秀包裝,是一個通訊組件框架。不瞭解netty的可以再花五分鐘學習下,這麼說吧,Netty很簡單,其實就是個Jar包,是作爲通訊組件用的)
-
具體應用場景:著名的hadoop、kafka、dubbo 都是基於zookeeper而構 建。
-
好處:保證在分佈式環境下數據的最終一致性,這個就是zookeeper能解決 的問題。
-
上面提到了很多次一致性,那麼究竟什麼是一致性,給大家補充下這個概 念:
所謂的一致性,實際上就是圍繞着“看見”來的。誰能看見?能否看見?什麼時 候看見?
舉個例子:
淘寶後臺賣家,在後臺上架一件大促的商品,通過服務器A 提交到主數據庫,假設剛提交後立馬就有用戶去通過應用服務器B去從數據庫查 詢該商品,就會出現一個現象,賣家已經更新成功了,然而買家卻看不到;
而經 過一段時間後,主數據庫的數據同步到了從數據庫,買家才能查到。(真技術 文)假設賣家更新成功之後買家立馬就能看到賣家的更新,則稱爲強一致性; 如果賣家更新成功後買家不能看到賣家更新的內容,則稱爲弱一致性; 而賣家更新成功後,買家經過一段時間最終能看到賣家的更新,則稱爲最終一致性。
-
三、項目開發及配置文件
-
dubbo項目目錄結構(maven)
注: spa_parent、spa_common、spa_interface建立後,maven工程先測試安裝下;
spa_common(無骨架):存放實體類,工具類等;
spa_interface(無骨架):存放接口等(如:service接口);
spa_provider(webapp骨架):存放dao層接口、mapper映射文件和service接口實現類等;
spa_web(webapp骨架):controller層代碼、後臺項目代碼及頁面代碼等。
-
pom依賴
spa_common:jar包<packaging>jar</packaging>
spa_interface:jar包,依賴spa_common
<packaging>jar</packaging> <dependencies> <dependency> <groupId>com.sys</groupId> <artifactId>spa_common</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies>
spa_provider:war包,依賴spa_interface
<packaging>war</packaging> <dependencies> <dependency> <groupId>com.sys</groupId> <artifactId>spa_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 指定端口 --> <port>8081</port> <!-- 請求路徑 --> <path>/</path> </configuration> </plugin> </plugins> </build>
spa_web:war包,依賴spa_interface
<packaging>war</packaging> <dependencies> <dependency> <groupId>com.sys</groupId> <artifactId>spa_interface</artifactId> <version>1.0-SNAPSHOT</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> <configuration> <!-- 指定端口 --> <port>8082</port> <!-- 請求路徑 --> <path>/</path> </configuration> </plugin> </plugins> </build>
-
resources資源配置文件
-
spa_provicer
spring-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: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="spa_provider"/> <!--指定暴露服務的端口,如果不指定默認爲20880--> <dubbo:protocol name="dubbo" port="20887"/> <!--指定服務註冊中心地址--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!--批量掃描,發佈服務--> <dubbo:annotation package="com.sys.service"/> </beans>
spring-dao.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd"> <!--數據源--> <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close"> <property name="username" value="root" /> <property name="password" value="root" /> <property name="driverClassName" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/spa_dubbo?characterEncoding=UTF-8" /> </bean> <!--spring和mybatis整合的工廠bean--> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="configLocation" value="classpath:SqlMapConfig.xml" /> </bean> <!--批量掃描接口生成代理對象--> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!--指定接口所在的包--> <property name="basePackage" value="com.sys.dao" /> </bean> </beans>
spring-tx.xml
<property name="dataSource" ref="dataSource"/>
:ref="dataSource"
的dataSource書寫時報錯,不用管,加載時自動加載<?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:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" 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://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 開啓事務控制的註解支持 注意:此處必須加入proxy-target-class="true", 需要進行事務控制,會由Spring框架產生代理對象, Dubbo需要將Service發佈爲服務,要求必須使用cglib創建代理對象。 --> <tx:annotation-driven transaction-manager="transactionManager" proxy-target-class="true"/> </beans>
SqlMapConfig.xml
<?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> <plugins> <!-- com.github.pagehelper 爲 PageHelper 類所在包名 --> <plugin interceptor="com.github.pagehelper.PageHelper"> <!-- 設置數據庫類型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL 六種數據庫--> <property name="dialect" value="mysql"/> </plugin> </plugins> </configuration>
-
spa_web
springmvc.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: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"> <mvc:annotation-driven/> <dubbo:annotation package="com.sys"/> <context:component-scan base-package="com.sys"/> <mvc:annotation-driven> <mvc:message-converters register-defaults="true"> <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"> <property name="supportedMediaTypes" value="application/json"/> <property name="features"> <list> <value>WriteMapNullValue</value> <value>WriteDateUseDateFormat</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> <!-- 指定應用名稱 --> <dubbo:application name="spa-web" /> <!--指定服務註冊中心地址--> <dubbo:registry address="zookeeper://127.0.0.1:2181"/> <!-- 超時全局設置 10分鐘 check=false 不檢查服務提供方,開發階段建議設置爲false check=true 啓動時檢查服務提供方,如果服務提供方沒有啓動則報錯 --> <dubbo:consumer timeout="600000" check="false"/> <!--文件上傳組件--> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <property name="maxUploadSize" value="104857600"/> <property name="maxInMemorySize" value="4096"/> <property name="defaultEncoding" value="UTF-8"/> </bean> <!-- <import resource="spring-redis.xml"></import> <import resource="spring-security.xml"></import>--> </beans>
-
-
註解使用
- service接口實現類使用dubbo的service註解
@Service(interfaceClass = SpaItemService.class)
- controller層調用接口,使用註解
@Reference
,如:@Reference private SpaItemService spaItemService;
- service接口實現類使用dubbo的service註解
-
web.xml配置
- spa_provider
web.xml,加載spring容器<!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> <!-- 加載spring容器 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring*.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> </web-app>
- spa_web
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> <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:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> </web-app>
- spa_provider
-
啓動事項
兩個web項目都要啓動(spa_provider和spa_web),還要啓動zookeeper服務;
當spa_common、spa_interface項目有改動時,要重新 install 安裝