品優(yōu)購(gòu)學(xué)習(xí)筆記一-Dubbox框架
1.dubbox簡(jiǎn)介
Dubbox 是一個(gè)分布式服務(wù)框架,其前身是阿里巴巴開(kāi)源項(xiàng)目Dubbo 霹崎,被國(guó)內(nèi)電商及互聯(lián)網(wǎng)項(xiàng)目中使用,后期阿里巴巴停止了該項(xiàng)目的維護(hù),當(dāng)當(dāng)網(wǎng)便在Dubbo基礎(chǔ)上進(jìn)行優(yōu)化褥赊,并繼續(xù)維護(hù),為了與原有的Dubbo區(qū)分莉恼,故將其命名為Dubbox拌喉。
Dubbox 致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案俐银。簡(jiǎn)單的說(shuō)司光,dubbox就是個(gè)服務(wù)框架,如果沒(méi)有分布式的需求悉患,其實(shí)是不需要用的残家,只有在分布式的時(shí)候,才有dubbox這樣的分布式服務(wù)框架的需求售躁,并且本質(zhì)上是個(gè)服務(wù)調(diào)用的東東坞淮,說(shuō)白了就是個(gè)遠(yuǎn)程服務(wù)調(diào)用的分布式框架。
節(jié)點(diǎn)說(shuō)明:
Provider: 暴露服務(wù)的服務(wù)提供方陪捷。
Consumer: 調(diào)用遠(yuǎn)程服務(wù)的服務(wù)消費(fèi)方回窘。
Registry: 服務(wù)注冊(cè)與發(fā)現(xiàn)的注冊(cè)中心。
Monitor: 統(tǒng)計(jì)服務(wù)的調(diào)用次調(diào)和調(diào)用時(shí)間的監(jiān)控中心市袖。
Container: 服務(wù)運(yùn)行容器
調(diào)用關(guān)系說(shuō)明:
服務(wù)容器負(fù)責(zé)啟動(dòng)啡直,加載,運(yùn)行服務(wù)提供者苍碟。
服務(wù)提供者在啟動(dòng)時(shí)酒觅,向注冊(cè)中心注冊(cè)自己提供的服務(wù)。
服務(wù)消費(fèi)者在啟動(dòng)時(shí)微峰,向注冊(cè)中心訂閱自己所需的服務(wù)舷丹。
注冊(cè)中心返回服務(wù)提供者地址列表給消費(fèi)者,如果有變更蜓肆,注冊(cè)中心將基于長(zhǎng)連接推送變更數(shù)據(jù)給消費(fèi)者颜凯。
服務(wù)消費(fèi)者谋币,從提供者地址列表中,基于軟負(fù)載均衡算法症概,選一臺(tái)提供者進(jìn)行調(diào)用蕾额,如果調(diào)用失敗,再選另一臺(tái)調(diào)用彼城。
服務(wù)消費(fèi)者和提供者凡简,在內(nèi)存中累計(jì)調(diào)用次數(shù)和調(diào)用時(shí)間,定時(shí)每分鐘發(fā)送一次統(tǒng)計(jì)數(shù)據(jù)到監(jiān)控中心精肃。
2.注冊(cè)中心zookeeper
2.1 Zookeeper 介紹
官方推薦使用 zookeeper 注冊(cè)中心秤涩。注冊(cè)中心負(fù)責(zé)服務(wù)地址的注冊(cè)與查找,相當(dāng)于目錄服務(wù)司抱,服務(wù)提供者和消費(fèi)者只在啟動(dòng)時(shí)與注冊(cè)中心交互筐眷,注冊(cè)中心不轉(zhuǎn)發(fā)請(qǐng)求,壓力較小习柠。
Zookeeper 是 Apacahe Hadoop 的子項(xiàng)目匀谣,是一個(gè)樹(shù)型的目錄服務(wù),支持變更推送资溃,適合作為Dubbox 服務(wù)的注冊(cè)中心武翎,工業(yè)強(qiáng)度較高,可用于生產(chǎn)環(huán)境溶锭。
2.2 zookeeper在ubuntu系統(tǒng)下安裝
安裝步驟:
- 安裝jdk
- 下載zookeeper安裝包宝恶,上傳到服務(wù)器
- 解壓
tar -zxvf zookeeper-3.4.6.tar.gz
- 進(jìn)入 zookeeper-3.4.6 目錄,創(chuàng)建 data 文件夾趴捅。
cd zookeeper-3.4.6
mkdir data
- 進(jìn)入conf目錄 垫毙,把 zoo_sample.cfg 改名為 zoo.cfg
cd conf
mv zoo_sample.cfg zoo.cfg
- 打開(kāi)zoo.cfg ,修改并添加以下內(nèi)容:
#修改 寫(xiě)自己的data目錄的路徑,進(jìn)入data目錄 pwd查看當(dāng)前目錄路徑
dataDir=/root/zookeeper-3.4.6/data
#添加拱绑,改成自己服務(wù)器的ip
server.1=182.254.227.85:2888:3888
server.2=10.0.40.112:2888:3888
server.3=10.0.42.145:2888:3888
- 添加myid
cd data
sudo vim myid
#將相對(duì)應(yīng)的編號(hào)寫(xiě)入
- 進(jìn)入bin目錄综芥,啟動(dòng)服務(wù)輸入命令
./zkServer.sh start
關(guān)閉:
./zkServer.sh stop
查看狀態(tài)
./zkServer.sh status
2.3Dubbox本地 JAR包部署與安裝
Dubbox的jar包并沒(méi)有部署到Maven的中央倉(cāng)庫(kù)中,大家在Maven的中央倉(cāng)庫(kù)中可以查找到Dubbo的最終版本是2.5.3 , 阿里巴巴解散了Dubbo團(tuán)隊(duì)后由當(dāng)當(dāng)網(wǎng)繼續(xù)維護(hù)此項(xiàng)目猎拨,并改名為 Dubbox ,坐標(biāo)不變膀藐,版本變更了,但是并沒(méi)有提交到中央倉(cāng)庫(kù)红省。
我們現(xiàn)在需要手動(dòng)將Dubbox的jar包安裝到我的本地倉(cāng)庫(kù)中.
先將dubbo-2.8.4.jar包放到d:\setup, 然后輸入命令
mvn install:install-file -Dfile=d:\setup\dubbo-2.8.4.jar -DgroupId=com.alibaba -DartifactId=dubbo -Dversion=2.8.4 -Dpackaging=jar
資源文件 以及相關(guān)配置可以在作者的github倉(cāng)庫(kù)查看
3.Demo
項(xiàng)目目錄:
3.1服務(wù)提供者開(kāi)發(fā)
創(chuàng)建maven工程额各,pom.xml引入
<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>cn.smallmartial.demo</groupId>
<artifactId>dubboxdemo-service</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<spring.version>4.2.4.RELEASE</spring.version>
</properties>
<dependencies>
<!-- Spring -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.8.4</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>javassist</groupId>
<artifactId>javassist</artifactId>
<version>3.11.0.GA</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<configuration>
<!-- 指定端口 -->
<port>8080</port>
<!-- 請(qǐng)求路徑 -->
<path>/</path>
</configuration>
</plugin>
</plugins>
</build>
</project>
在工程目錄webapps下創(chuàng)建WEB-INF文件夾,創(chuàng)建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 加載spring容器 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
創(chuàng)建業(yè)務(wù)接口
package cn.smallmartial.demo.service;
public interface UserService {
public String getName();
}
創(chuàng)建實(shí)現(xiàn)類(lèi),service需要導(dǎo)入 alibaba提供的
package cn.smallmartial.demo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import cn.smallmartial.demo.service.UserService;
@Service
public class UserServiceImpl implements UserService {
@Override
public String getName() {
return "small martial";
}
}
編譯配置文件类腮,寫(xiě)入src/main/resources
<?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:p="http://www.springframework.org/schema/p"
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="dubboxdemo-service"/>
<dubbo:registry address="zookeeper://182.254.227.85:2181"/>
<dubbo:annotation package="cn.smallmartial.demo.service.impl" />
</beans>
運(yùn)行,引用的是mavean插件臊泰,用mavean方式啟動(dòng)
tomcat7:run
3.2服務(wù)消費(fèi)者開(kāi)發(fā)
創(chuàng)建Maven工程(WAR)dubboxdemo-web ,在pom.xml引入依賴(lài)蚜枢,同“dubboxdemo-service”工程缸逃。區(qū)別就是把tomcat插件的運(yùn)行端口改為8081 。
pom和service用的一樣厂抽,復(fù)制即可
在工程目錄webapps下創(chuàng)建WEB-INF文件夾需频,創(chuàng)建web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- 解決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>
<!-- 指定加載的配置文件 ,通過(guò)參數(shù)contextConfigLocation加載-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:springmvc.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>
</web-app>
將“dubboxdemo-service”工程的cn.smallmartial.demo.service包以及下面的接口拷貝至此工程筷凤。
編寫(xiě)controller
package cn.smallmartial.demo.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import com.alibaba.dubbo.config.annotation.Reference;
import cn.smallmartial.demo.service.UserService;
@Controller
@RequestMapping("/user")
public class UserController {
@Reference
private UserService userService;
@RequestMapping("/showname")
@ResponseBody
public String showName() {
return userService.getName();
}
}
編寫(xiě)spring配置文件
<?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:p="http://www.springframework.org/schema/p"
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 >
<mvc:message-converters register-defaults="false">
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8" />
</bean>
</mvc:message-converters>
</mvc:annotation-driven>
<dubbo:application name="dubboxdemo-web"/>
<dubbo:registry address="zookeeper://182.254.227.85:2181"/>
<dubbo:annotation package="cn.smallmartial.demo.controller" />
</beans>
運(yùn)行,引用的是mavean插件昭殉,用mavean方式啟動(dòng)
tomcat7:run
運(yùn)行結(jié)果:
4.管理端安裝
-
上傳dobbox.war文件
資源文件在github
服務(wù)器部署tomcat
管理端使用
打開(kāi)瀏覽器,輸入http://192.168.25.132:8080/dubbo-admin/ ,登錄用戶(hù)名和密碼均為root 進(jìn)入首頁(yè)藐守。 (192.168.25.132:)是我部署的linux主機(jī)地址挪丢。
github地址:https://github.com/smallmartial/springbootdemo/tree/master/dobbox-demo
工具地址: