項目基於soa的架構,表現層和服務層是不一樣的工程。因此要實現商品列表查詢須要兩個系統之間進行通訊。前端
一、Webservice:效率不高基於soap協議。項目中不推薦使用。java
二、使用restful形式的服務:http+json。不少項目中應用。若是服務太多,服務之間調用關係混亂,須要治療服務。(跨語言)node
三、使用dubbo。使用rpc協議進行遠程調用,直接使用socket通訊。傳輸效率高,而且能夠統計出系統之間的調用關係、調用次數。(只能用於java工程之間)linux
Dubbo就是資源調度和治理中心的管理工具。(阿里開源分佈式工具)c++
節點角色說明:git
Provider: 暴露服務的服務提供方。github
Consumer: 調用遠程服務的服務消費方。web
Registry: 服務註冊與發現的註冊中心。redis
Monitor: 統計服務的調用次調和調用時間的監控中心。spring
Container: 服務運行容器。
zookeeper註冊中心。
Zookeeper是Apacahe Hadoop的子項目,是一個樹型的目錄服務,支持變動推送,適合做爲Dubbo服務的註冊中心,工業強度較高,可用於生產環境,並推薦使用
2.1.1Zookeeper的安裝:
(須要jvm環境(java -version)(安裝注意位數對應),注意要關閉linux的防火牆。)
第一步:安裝jdk
第二步:解壓縮zookeeper壓縮包
第三步:將conf文件夾下zoo_sample.cfg複製一份,更名爲zoo.cfg
第四步:修改配置dataDir屬性,指定一個真實目錄
第五步:
啓動zookeeper:bin/zkServer.sh start
關閉zookeeper:bin/zkServer.sh stop
查看zookeeper狀態:bin/zkServer.sh status
詳解
1.上傳zookeeper壓縮包
2.解壓(tar zxf zookeeper-3.4.6.tar.gz)(獲得zookeeper文件夾)
3.進入 zookeeper文件夾(cd zookeeper-3.4.6)
4.建立data目錄(mkdir data)
5.進入conf目錄(cd conf)
6.將zoo_sample.cfg更名爲 zoo.cfg(mv zoo_sample.cfg zoo.cfg)
7.編輯 zoo.cfg(vim zoo.cfg),將dataDir目錄改成建立的data目錄(/root/zookeeper-3.4.6/data)
8.進入zookeeper下的bin 目錄(cd .. -> cd bin)
9.運行(./zkServer.sh start)
10.查看是否啓動成功(./zkServer.sh status)
(standalone:單例)
Dubbo採用全Spring配置方式,透明化接入應用,對應用沒有任何API侵入,只需用Spring加載Dubbo的配置便可,Dubbo基於Spring的Schema擴展進行加載。
單一工程中spring的配置
<bean id="xxxService" class="com.xxx.XxxServiceImpl" /> <bean id="xxxAction" class="com.xxx.XxxAction"> <property name="xxxService" ref="xxxService" /> </bean> |
遠程服務:
在本地服務的基礎上,只需作簡單配置,便可完成遠程化:
將上面的local.xml配置拆分紅兩份,將服務定義部分放在服務提供方remote-provider.xml,將服務引用部分放在服務消費方remote-consumer.xml。
並在提供方增長暴露服務配置<dubbo:service>,在消費方增長引用服務配置<dubbo:reference>。
發佈服務:
<!-- 和本地服務同樣實現遠程服務 --> <bean id="xxxService" class="com.xxx.XxxServiceImpl" /> <!-- 增長暴露遠程服務配置 --> <dubbo:service interface="com.xxx.XxxService" ref="xxxService" /> |
調用服務:
<!-- 增長引用遠程服務配置 --> <dubbo:reference id="xxxService" interface="com.xxx.XxxService" /> <!-- 和本地服務同樣使用遠程服務 --> <bean id="xxxAction" class="com.xxx.XxxAction"> <property name="xxxService" ref="xxxService" /> </bean> |
例:
1.都加入dubbo相關jar包(須要移除spring和netty的傳遞依賴(也能夠在pom文件的dependency Hierarchy找到jar包右鍵 exclude Maven artifcrt...))
<!-- dubbo相關的jar包 --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <exclusions> <!-- 移除spring的傳遞依賴 --> <exclusion> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> <exclusion> <artifactId>netty</artifactId> <groupId>org.jboss.netty</groupId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> </dependency>
2.發佈服務(在服務工程中)(在spring配置文件中添加(applicationContext-service.xml))
2.1在beans中加入dubbo及約束
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
2.2加入dubbo
<!-- 使用Dubbo發佈服務 --> <!-- 提供方應用信息,用於計算依賴關係(取個應用名) --> <dubbo:application name="taotao-manager" /> <!-- 註冊中心的地址 --> <dubbo:registry protocol="zookeeper" address="192.168.25.150:2181" /> <!-- 用dubbo協議在20880端口暴露服務(能夠隨意,不衝突就行) --> <dubbo:protocol name="dubbo" port="20880" /> <!-- 聲明須要暴露的服務接口 --> <dubbo:service interface="com.taotao.service.ItemService" ref="itemServiceImpl" timeout="300000"/> <dubbo:service interface="com.taotao.service.ItemCatService" ref="itemCatServiceImpl" timeout="300000"/>
3.調用服務(在pom添加jar包及interface的引用)(在表現層工程中)(在springmvc.xml):
3.1一樣加入前綴 約束等
3.2
<!-- 引用dubbo服務 --> <dubbo:application name="taotao-manager-web"/> <dubbo:registry protocol="zookeeper" address="192.168.25.88:2181"/> <dubbo:reference interface="com.taotao.service.ItemService" id="itemService" /> <dubbo:reference interface="com.taotao.service.ItemCatService" id="itemCatService" />
3.3在controller中使用方式
@Autowired private ItemService itemService;
須要安裝tomcat,而後部署監控中心便可(dubbo-admin-2.5.4.war)(最好監控中心和zookeeper在同一臺服務器上)。
4.1安裝tomcat
4.1.1上傳 並解壓(tar zxf apache-tomcat-7.0.47.tar.gz)
4.1.2 上傳 dubbo-admin-2.5.4.war
4.1.3將dubbo-admin-2.5.4.war 複製到tomcat webapps目錄下並更名(cp dubbo-admin-2.5.4.war apache-tomcat-7.0.47/webapps/dubbo-admin.war)
4.1.4 啓動tomcat(進入到tomcat目錄下)
cd apache-tomcat-7.0.47 bin/startup.sh //啓動tomcat tail -f logs/catalina.out //查看日誌
4.3進入監控中心網址(192.168.25.150:8080/dubbo-admin)(用戶名和密碼都爲root)
注 : 若是監控中心和zookeeper不在同一臺服務器須要修改一下配置文件
cd webapps/ cd dubbo-admin cd WEB-INF/ vim dubbo.properties
(只需將第一行zookeeper地址改成對應的便可)
使用FastDFS,分佈式文件系統。存儲空間能夠橫向擴展,能夠實現服務器的高可用。支持每一個節點有備份機。
FastDFS是用c語言編寫的一款開源的分佈式文件系統。FastDFS爲互聯網量身定製,充分考慮了冗餘備份、負載均衡、線性擴容等機制,並注重高可用、高性能等指標,使用FastDFS很容易搭建一套高性能的文件服務器集羣提供文件上傳、下載等服務。
2.1 java客戶端 使用fastdfs_client_v1.20.jar
2.2Maven環境
導入fastdfs_client工程(導入成功記得maven install ,使用須要在pom中導入)
一、加載配置文件,配置文件中的內容就是tracker服務的地址。
配置文件內容:tracker_server=192.168.25.133:22122
二、建立一個TrackerClient對象。直接new一個。
三、使用TrackerClient對象建立鏈接,得到一個TrackerServer對象。
四、建立一個StorageServer的引用,值爲null
五、建立一個StorageClient對象,須要兩個參數TrackerServer對象、StorageServer的引用
六、使用StorageClient對象上傳圖片。
七、返回數組。包含組名和圖片的路徑。
測試代碼
public class FastDFSTest { @Test public void testFileUpload() throws Exception { // 一、加載配置文件,配置文件中的內容就是tracker服務的地址。 ClientGlobal.init("D:/workspaces-itcast/term197/taotao-manager-web/src/main/resources/resource/client.conf"); // 二、建立一個TrackerClient對象。直接new一個。 TrackerClient trackerClient = new TrackerClient(); // 三、使用TrackerClient對象建立鏈接,得到一個TrackerServer對象。 TrackerServer trackerServer = trackerClient.getConnection(); // 四、建立一個StorageServer的引用,值爲null StorageServer storageServer = null; // 五、建立一個StorageClient對象,須要兩個參數TrackerServer對象、StorageServer的引用 StorageClient storageClient = new StorageClient(trackerServer, storageServer); // 六、使用StorageClient對象上傳圖片。 //擴展名不帶「.」 String[] strings = storageClient.upload_file("D:/Documents/Pictures/images/200811281555127886.jpg", "jpg", null); // 七、返回數組。包含組名和圖片的路徑。 for (String string : strings) { System.out.println(string); } } }
使用工具類方法
@Test public void testFastDfsClient() throws Exception { FastDFSClient fastDFSClient = new FastDFSClient("D:/workspaces-itcast/term197/taotao-manager-web/src/main/resources/resource/client.conf"); String file = fastDFSClient.uploadFile("D:/Documents/Pictures/images/2f2eb938943d.jpg"); System.out.println(file); }
Redis是c語言開發的。
安裝redis須要c語言的編譯環境。若是沒有gcc須要在線安裝。yum install gcc-c++
第一步:redis的源碼包上傳到linux系統。
第二步:解壓縮redis。
第三步:編譯。進入redis源碼目錄。make
第四步:安裝。make install PREFIX=/usr/local/redis
PREFIX參數指定redis的安裝目錄。通常軟件安裝到/usr目錄下
詳解:
1.上傳redis-3.0.0.tar.gz並解壓(tar zxf redis-3.0.0.tar.gz )
2.進入redis(cd cd redis-3.0.0)
3.輸入 make (進行編譯)
4.安裝( make install PREFIX=/usr/local/redis)
5.進入redis的bin目錄(cd /usr/local/redis/bin/)
6.啓動服務端(./redis-server )(前端啓動,但會佔用一個)
6.2也能夠採用後端啓動(crtl+c退出上一步)
6.2.2 複製配置文件到當前目錄(cp ~/redis-3.0.0/redis.conf .)
6.2.3編輯文件(vim redis.conf ),將daemonize no 改成daemonize yes
6.2.4啓動服務端(後端形式)(./redis-server redis.conf )
6.2.5經過查看端口查看是否運行(ps aux|grep redis)
7.能夠經過(./redis-cli )進行鏈接redis數據庫進行操做等
7.1 能夠指定ip和端口號(./redis-cli -h 192.168.25.150 -p 6379)
2.1 String :key-value(作緩存)
Redis中全部的數據都是字符串。命令不區分大小寫,key是區分大小寫的。Redis是單線程的。Redis中不適合保存內容大的數據。
get、set
incr:加一(生成id)
Decr:減一
2.2Hash:key-fields-values(作緩存)
Hset:向hash中添加內容
Hget:從hash中取內容
2.3 List:有順序可重複
2.4 Set:元素無順序,不能重複
2.5 SortedSet(zset):有順序,不能重複
3.1加入jedis依賴或jar包
3.2
@Test public void testJedisPool() throws Exception{ //建立一個數據庫鏈接池(單例),須要指定服務的ip和端口號 JedisPool jedisPool = new JedisPool("192.168.25.150",6379); //從鏈接池中得到鏈接 Jedis jedis = jedisPool.getResource(); //使用jedis操做數據庫(方法級別使用) String result = jedis.get("jedis-key"); System.out.println(result); //必定要關閉jedis鏈接 jedis.close(); //系統關閉前關閉鏈接池 jedisPool.close(); }
Redis集羣中至少應該有三個節點。要保證集羣的高可用,須要每一個節點有一個備份機。
Redis集羣至少須要6臺服務器。
搭建僞分佈式。可使用一臺虛擬機運行6個redis實例。須要修改redis的端口號7001-7006(正常多個服務器搭建時,由於ip不一致,端口號不用修改便可)
步驟:
4.1在local目錄下(cd /usr/local/)創建文件夾複製已有的redis(cd /usr/local/redis/bin/)
4.2進入redis01目錄下(cd redis-cluster/redis01/)
4.3搭建集羣須要乾淨的節點,因此須要把dump.rdb刪除(rm -rf dump.rdb )
4.4修改端口號(vim redis.conf),並將集羣模式打開(將cluster-enabled yes的註釋打開)
4.5回到 redis-cluster目錄(cd ..)多複製幾份節點(cp -r redis01/ redis02)
4.6修改複製的各個的端口號(7002-7006)( vim redis02/redis.conf )
4.7啓動每一個redis(由於方便選擇批處理)
4.7.1(vim start-all.sh)
4.7.2寫入
cd redis01 ./redis-server redis.conf cd .. cd redis02 ./redis-server redis.conf cd .. cd redis03 ./redis-server redis.conf cd .. cd redis04 ./redis-server redis.conf cd .. cd redis05 ./redis-server redis.conf cd .. cd redis06 ./redis-server redis.conf cd ..
4.7.3修改執行權限(chmod +x start-all.sh)
4.7.4執行(./start-all.sh)
4.7.5判斷是否執行成功(ps aux|grep redis)
4.8使用ruby腳本搭建集羣,須要ruby運行環境
4.8.1安裝ruby
yum install ruby
yum install rubygems
4.8.2安裝Ruby須要的包
②.回到根目錄(cd ~)安裝 (gem install redis-3.0.0.gem)
③.進入redis目錄下(cd redis-3.0.0/src/)
④.複製redis下的ruby腳本文件(redis-trib.rb)(cp *.rb /usr/local/redis-cluster/)
4.9回到集羣目錄(cd /usr/local/redis-cluster/)
4.10使用ruby腳本搭建集羣(./redis-trib.rb create --replicas 1 192.168.25.150:7001 192.168.25.150:7002 192.168.25.150:7003 192.168.25.150:7004 7001 192.168.25.150:7002 192.168.25.150:7003 192.168.25.150:7004 192.168.25.150:7005 192.168.25.150:7006)。
5.1.使用redis-cli鏈接(redis01/redis-cli -p 7006 -c)
注:端口號爲集羣中的任意節點,-c爲表明鏈接的是redis集羣
5.2使用jedisCluster鏈接集羣
@Test public void testJedisCluster() throws Exception{ //建立一個JedisCluster對象,構造參數Set類型,集合中每一個元素HostAndPost類型 Set<HostAndPort> nodes = new HashSet<>(); //向集合中添加節點 nodes.add(new HostAndPort("192.168.25.150", 7001)); nodes.add(new HostAndPort("192.168.25.150", 7002)); nodes.add(new HostAndPort("192.168.25.150", 7003)); nodes.add(new HostAndPort("192.168.25.150", 7004)); nodes.add(new HostAndPort("192.168.25.150", 7005)); nodes.add(new HostAndPort("192.168.25.150", 7006)); JedisCluster jedisCluster = new JedisCluster(nodes); //直接使用JedisCluster操做redis,自帶連接池JedisCluster對象能夠是單例的 jedisCluster.set("cluster-test", "Hello"); String string = jedisCluster.get("cluster-test"); System.out.println(string); //系統關閉前關閉JedisCluster jedisCluster.close(); }
(添加package包及須要的文件)
6.1向spring容器中添加(能夠新建applicationContext-redis.xml文件管理單機版與集羣版)
<context:annotation-config></context:annotation-config><!--開啓註解-->
<!-- redis單機版 -->
<bean id="jedisPool" class="redis.clients.jedis.JedisPool">
<constructor-arg name="host" value="192.168.25.88"></constructor-arg>
<constructor-arg name="port" value="6379"></constructor-arg>
</bean>
6.2使用測試
@Test public void testJedisClientPool() throws Exception{ //初始化Spring容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext-redis.xml"); //從容器中得到JedisClient對象 JedisClient jedisClient = applicationContext.getBean(JedisClient.class); //使用JedisClient對象操做redis jedisClient.set("jedisclient", "mytest"); String result = jedisClient.get("jedisclient"); System.out.println(result); }
7.1向spring容器中添加(集羣版和單機版不使用的那個註釋便可)
<bean id="jedisCluster" class="redis.clients.jedis.JedisCluster"> <constructor-arg> <set> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7001"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7002"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7003"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7004"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7005"></constructor-arg> </bean> <bean class="redis.clients.jedis.HostAndPort"> <constructor-arg name="host" value="192.168.25.150"></constructor-arg> <constructor-arg name="port" value="7006"></constructor-arg> </bean> </set> </constructor-arg> </bean> <bean id="jedisClientCluster" class="com.taotao.jedis.JedisClientCluster"></bean>
ActiveMQ 是Apache出品,最流行的,能力強勁的開源消息總線。
1. ActiveMQ的消息形式
對於消息的傳遞有兩種類型:
一種是點對點的,即一個生產者和一個消費者一一對應;
另外一種是發佈/訂閱模式,即一個生產者產生消息並進行發送後,能夠由多個消費者進行接收。
2. 安裝(須要jdk環境)與啓動:
2.1 上傳壓縮包(apache-activemq-5.12.0-bin.tar.gz)並解壓縮(tar zxf apache-activemq-5.12.0-bin.tar.gz)
2.2進入activemq的bin目錄(cd apache-activemq-5.12.0/bin/)
2.3啓動 ./activemq start
2.4查看是否啓動成功 ps aux|grep activemq
也能夠經過訪問192.168.25.150:8161/admin(帳號密碼都爲admin)
注:在頁面點Queues若是出現503錯誤,說明linux主機名和ip未對應(查看機器名(cat /etc/sysconfig/network)(HOSTNAME爲機器名,若是帶.的只顯示.前面的)查看ip與機器名對應關係(cat /etc/hosts)(沒有本身的機器名能夠把本身的機器名加到後面,修改完成重啓activemq服務))