(Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门
在昨天的Dubbo基礎(chǔ)篇中,小編對(duì)Dubbo的相關(guān)基礎(chǔ)理論知識(shí)進(jìn)行了一個(gè)詳細(xì)的解釋,如果大家對(duì)這一塊的知識(shí)感到好奇,推薦大家可以去閱讀一下小編昨天寫(xiě)的Dubbo相關(guān)知識(shí)點(diǎn),今天小編會(huì)進(jìn)行Dubbo實(shí)用技術(shù)的講解,在之前的文章中,小編也說(shuō)過(guò)自己的關(guān)于這一塊的知識(shí)會(huì)從基礎(chǔ)理論向?qū)嵱眉夹g(shù)這樣的一個(gè)延伸,今天所涉及到的就是Dubbo實(shí)用熱身這樣的一個(gè)知識(shí)模塊,對(duì)于昨天的基礎(chǔ)理論知識(shí)大家可以查看我的另外一篇嘔心瀝血文章,是這一篇文章的前篇。
(Java每日一談:第三日——人類生活的無(wú)法回避的三個(gè)問(wèn)題)主流框架:Dubbo基礎(chǔ)篇--分布式系統(tǒng)中的相關(guān)概念
首先、什么是Dubbo呢?Dubbo是阿里巴巴公司開(kāi)源的一個(gè)高性能、輕量級(jí)的Java PRC框架,致力于提供高性能和透明化的RPC遠(yuǎn)程服務(wù)調(diào)用方案,以及SOA服務(wù)治理方案,這意味著,使用Dubbo開(kāi)發(fā)的微服務(wù),將具備相互之間的遠(yuǎn)程發(fā)現(xiàn)與通信能力,同時(shí)利用Dubbo提供的豐富服務(wù)治理能力,可以實(shí)現(xiàn)諸如服務(wù)發(fā)現(xiàn)、負(fù)載均衡、流量調(diào)度等服務(wù)治理訴求。同時(shí)Dubbo是高度可拓展的,用戶幾乎可以在任意功能點(diǎn)去定制自己的實(shí)現(xiàn),以改變框架點(diǎn)默認(rèn)行為來(lái)滿足自己的業(yè)務(wù)需求。
Dubbo快速入門
作為一個(gè)微服務(wù)架構(gòu),Dubbo sdk 跟隨著微服務(wù)組件被部署在分布式集群各個(gè)位置,為了在分布式環(huán)境下實(shí)現(xiàn)各個(gè)微服務(wù)組件間的通信,Dubbo定義了一些中心化的組件。
上述圖片完整地描述了Dubbo微服務(wù)組件與各個(gè)中心地交互過(guò)程
服務(wù)發(fā)現(xiàn),即消費(fèi)端自動(dòng)發(fā)現(xiàn)服務(wù)地址列表的能力,是微服務(wù)框架需要具備的關(guān)鍵能力,借助于自動(dòng)化的服務(wù)發(fā)現(xiàn),微服務(wù)之間可以在無(wú)需感知對(duì)端部署位置與IP地址的情況下實(shí)現(xiàn)通信。
實(shí)現(xiàn)服務(wù)發(fā)現(xiàn)的方式有很多種,Dubbo提供的一種是Client-Based的服務(wù)發(fā)現(xiàn)機(jī)制,通常還需要部署額外的第三方注冊(cè)中心組件來(lái)協(xié)調(diào)服務(wù)發(fā)現(xiàn)過(guò)程,如常用的Nacos、Consul、Zookeeper等,Dubbo自身也提供了對(duì)多種注冊(cè)中心組件的對(duì)接,用戶可以靈活選擇。
zookeeper安裝
? ? ? ? Dubbo的官網(wǎng)支持很多種注冊(cè)中心,小編自己選擇使用的是zookeeper,至于zookeeper的安裝小編在這里不在詳細(xì)描述,這一塊的內(nèi)容我相信大家可以從其他博主上面找到相應(yīng)的知識(shí)點(diǎn)。
Dubbo快速入門
? ? ? ? 總體的實(shí)現(xiàn)步驟:
? ? ? ? ? ? ? ? 創(chuàng)建服務(wù)提供者Provider模塊
? ? ? ? ? ? ? ? 創(chuàng)建服務(wù)消費(fèi)者Consumer模塊
? ? ? ? ? ? ? ? 在服務(wù)提供者模塊編寫(xiě)UserServiceImpl提供服務(wù)
? ? ? ? ? ? ? ? 在服務(wù)消費(fèi)者中的UserController遠(yuǎn)程調(diào)用UserServiceImpl提供的服務(wù)
? ? ? ? ? ? ? ? 分別啟動(dòng)兩個(gè)服務(wù),測(cè)試
小編這里首先使用spring框架創(chuàng)建功能模塊:
第一步、新建一個(gè)空的工程項(xiàng)目文件
?第二步、使用maven新建兩個(gè)模塊分別是dubbo-service以及dubbo-web?
在以前的項(xiàng)目中,我們總是將這樣的兩個(gè)部分寫(xiě)在一個(gè)模塊之中,現(xiàn)在我們將這樣的一個(gè)項(xiàng)目結(jié)構(gòu)進(jìn)行拆分,使其各自獨(dú)立地在一個(gè)單獨(dú)的模塊之中,使web模塊依賴與service模塊,最終成功運(yùn)行,從而達(dá)到本次實(shí)驗(yàn)的效果。
第三步、導(dǎo)入相關(guān)依賴
dubbo-web 模塊相關(guān)依賴,因?yàn)閣eb模塊后面會(huì)打包成war包,所以在這里導(dǎo)入tomcat插件
<properties><spring.version>5.1.9.RELEASE</spring.version><dubbo.version>2.7.4.1</dubbo.version><zookeeper.version>4.0.0</zookeeper.version></properties><dependencies><!-- servlet3.0規(guī)范的坐標(biāo) --><dependency><groupId>javax.servlet</groupId><artifactId>javax.servlet-api</artifactId><version>3.1.0</version><scope>provided</scope></dependency><!--spring的坐標(biāo)--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring.version}</version></dependency><!--springmvc的坐標(biāo)--><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring.version}</version></dependency><!--日志--><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.21</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.21</version></dependency><!--Dubbo的起步依賴,版本2.7之后統(tǒng)一為rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客戶端實(shí)現(xiàn) --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客戶端實(shí)現(xiàn) --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency></dependencies><build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>8000</port><path>/</path></configuration></plugin></plugins></build>由于service模塊不需要啟動(dòng),因此service模塊導(dǎo)入的依賴排除上面的tomcat插件,然后進(jìn)行導(dǎo)入即可,小編在這里就不復(fù)制,湊字?jǐn)?shù)了。
第四步、接下來(lái)是service模塊里面具體內(nèi)容的編寫(xiě),因?yàn)樾【庍@里只是一個(gè)測(cè)試,所以實(shí)現(xiàn)類比較簡(jiǎn)單,大家可以從這樣的一個(gè)代碼結(jié)構(gòu)可以看出,小編在項(xiàng)目結(jié)構(gòu)中加入了一個(gè)UserService接口以及它的實(shí)現(xiàn)類,添加了兩個(gè)配置文件分別是applicationContext.xml以及日志的配置文件,service模塊的配置就完成了
?web模塊的配置
首先、由于web模塊會(huì)被打包成war包,因此需要在pom文件中,對(duì)打包方式進(jìn)行一個(gè)說(shuō)明,默認(rèn)是jar,大家只需要在原來(lái)的配置文件中添加一行配置信息即可
?由于原來(lái)模塊的結(jié)構(gòu)不是很完整,因此小編在web模塊進(jìn)行了一個(gè)結(jié)構(gòu)的完善,下面是web模塊的配置文件
小編的項(xiàng)目結(jié)構(gòu)如下:
其中涉及到幾個(gè)配置文件
特此強(qiáng)調(diào),因?yàn)閏ontroller模塊會(huì)調(diào)用service模塊,因此需要在pom文件中導(dǎo)入service模塊的相關(guān)依賴
springmvc.xml文件的配置內(nèi)容如下:
<?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://dubbo.apache.org/schema/dubbo"xmlns:mvc="http://www.springframework.org/schema/mvc"xmlns:context="http://www.springframework.org/schema/context"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsdhttp://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd"><mvc:annotation-driven/><context:component-scan base-package="com.itheima.controller"/></beans>?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*:spring/applicationContext*.xml</param-value></context-param><listener><listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener><!-- Springmvc --> <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:spring/springmvc.xml</param-value></init-param></servlet><servlet-mapping><servlet-name>springmvc</servlet-name><url-pattern>*.do</url-pattern></servlet-mapping></web-app>第五步、安裝service模塊,啟動(dòng)web模塊
?
項(xiàng)目成功運(yùn)行,使用spring搭建的環(huán)境成功運(yùn)行,環(huán)境配置完成,現(xiàn)目前是一種本地的調(diào)用資源,后面小編會(huì)在目前的環(huán)境上進(jìn)行一個(gè)配置,使用dubbo進(jìn)行遠(yuǎn)程調(diào)用
在小編進(jìn)行下一步的操作之前,小編首先在這里問(wèn)大家一個(gè)問(wèn)題,小編上面的項(xiàng)目已經(jīng)將原本的項(xiàng)目進(jìn)行拆飛成兩個(gè)模塊,這樣的模塊結(jié)構(gòu)屬于分布式嗎?答案是否定的,因?yàn)榉植际揭竺總€(gè)項(xiàng)目都要獨(dú)立的對(duì)外啟動(dòng)項(xiàng)目和提供服務(wù),因此小編上面的項(xiàng)目結(jié)構(gòu)從本質(zhì)上來(lái)說(shuō)還是一個(gè)單體架構(gòu)(controller可以被訪問(wèn)到,但是service卻不能),只不過(guò)通過(guò)maven的分模塊將其進(jìn)行了一個(gè)拆分。
?接下來(lái)會(huì)進(jìn)行模塊改造
service模塊:
? ? ? ? pom文件的改造
? ? ? ? ? ? ? ? 1、添加相關(guān)依賴
<!--Dubbo的起步依賴,版本2.7之后統(tǒng)一為rg.apache.dubb --><dependency><groupId>org.apache.dubbo</groupId><artifactId>dubbo</artifactId><version>${dubbo.version}</version></dependency><!--ZooKeeper客戶端實(shí)現(xiàn) --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-framework</artifactId><version>${zookeeper.version}</version></dependency><!--ZooKeeper客戶端實(shí)現(xiàn) --><dependency><groupId>org.apache.curator</groupId><artifactId>curator-recipes</artifactId><version>${zookeeper.version}</version></dependency>? ? ? ? ?????????2、將service模塊的打包方式改成war包,因?yàn)樾枰?dú)立運(yùn)行
? ? ? ????????? 3、添加tomcat插件
<build><plugins><!--tomcat插件--><plugin><groupId>org.apache.tomcat.maven</groupId><artifactId>tomcat7-maven-plugin</artifactId><version>2.1</version><configuration><port>9000</port><path>/</path></configuration></plugin></plugins></build>? ? ? ? ?實(shí)現(xiàn)類的改造?,大家注意一下,這里使用的service注解是dubbo提供的注解,不是spring提供的注解? ?? ? ? ? applicationContext.xml文件的配置
? ? ? ? web.xml文件的配置 ,因?yàn)楝F(xiàn)在是一個(gè)web項(xiàng)目,所以需要補(bǔ)齊相應(yīng)的web項(xiàng)目結(jié)構(gòu),web.xml配置文件只需要spring的配置內(nèi)容即可
? ? ? ? ?啟動(dòng)一下service模塊,沒(méi)有報(bào)錯(cuò),項(xiàng)目正常啟動(dòng),dubbo-service模塊的改造就完成了
?dubbo-web模塊的配置:
? ? ? ? pom文件依賴的配置,由于現(xiàn)在不需要使用service本地注入,因此將service模塊的依賴進(jìn)行注釋
? ? ? ? 實(shí)現(xiàn)類的修改,由于現(xiàn)在需要使用到遠(yuǎn)程注入,不在需要使用本地注入,因此在controller層的注入不再使用@Autowired,使用dubbo的注解@Reference進(jìn)行遠(yuǎn)程注入?
? ? ? ? ?springmvc.xml的文件配置,由于上面使用的是dubbo的原創(chuàng)注入,因此肯定是需要配置注冊(cè)中心相關(guān)信息,和上面service模塊的配置差不多
<!--dubbo的配置--><!--1.配置項(xiàng)目的名稱,唯一--><dubbo:application name="dubbo-web"><dubbo:parameter key="qos.port" value="33333"/></dubbo:application><!--配置一下注冊(cè)中心的地址--><dubbo:registry address="zookeeper://10.211.55.4:2181"/><!--配置dubbo包掃描--><dubbo:annotation package="com.itheima.controller"/>? ? ? ? web.xml文件的配置只需要留下springmvc即可
這是dubbo-web的配置,小編這里不進(jìn)行測(cè)試,因?yàn)橄旅孢€有一部分內(nèi)容需要進(jìn)行配置,由于service模塊和web模塊都需要依賴UserService接口,因此可以將這樣的一個(gè)借口抽取成一個(gè)公共的模塊,確保各模塊的統(tǒng)一性,其他模塊依賴這一個(gè)公告模塊即可。
下面是公共接口模塊的抽取,比較簡(jiǎn)單,不做演示,大家創(chuàng)建一個(gè)新的模塊,再將UserService接口放進(jìn)這樣的一個(gè)模塊即可,添加完成之后,需要進(jìn)行一個(gè)安裝
由于service和web模塊都要依賴這樣的一個(gè)公共模塊,因此分別在兩個(gè)模塊中導(dǎo)入公共模塊的依賴
<!--依賴公共的接口模塊--><dependency><groupId>com.itheima</groupId><artifactId>dubbo-interface</artifactId><version>1.0-SNAPSHOT</version></dependency>最后進(jìn)行這樣的一個(gè)結(jié)果測(cè)試,由于修改了回顯的內(nèi)容,大家注意區(qū)分屏幕,大家測(cè)試的時(shí)候,需要分別運(yùn)行service和web即可,項(xiàng)目成功運(yùn)行
?這樣一個(gè)對(duì)于dubbo的快速入門就完成了,大家可以進(jìn)行這樣的一個(gè)練習(xí)!
今天想要給大家分享的課外知識(shí)小課堂是關(guān)于幸福的話題:
? ? ? ? 關(guān)于幸福,不同的人有不同的定義,人們對(duì)幸福的主觀認(rèn)同不同,所得出的結(jié)論也各不一樣,有人認(rèn)為富可敵國(guó)、腰纏萬(wàn)貫此乃幸福,因?yàn)樯倭似胀ㄈ似疵鼮樯願(yuàn)^斗的努力與擔(dān)憂;有人認(rèn)為萬(wàn)眾矚目、受人膜拜是幸福,因?yàn)槎嗔似胀ㄈ怂辉硎艿年P(guān)注,但是在蕓蕓縱生中,也不乏有名利雙收者坦言不知幸福是何物,一貧如洗者面對(duì)眼前的茍且仍然面帶微笑。關(guān)于幸福,沙哈爾教授將其分成了四個(gè)象限,不同象限代表了不同的人生態(tài)度和行為模式。
第一種幸福價(jià)值取向是:“我現(xiàn)在很幸福,但是未來(lái)不幸福”的及時(shí)享樂(lè)型。這一種價(jià)值取向的人在現(xiàn)實(shí)生活中很常見(jiàn),例如:愛(ài)好熬夜的人明明知道長(zhǎng)時(shí)間的熬夜會(huì)對(duì)身體造成不可修復(fù)的損傷,但是礙于夜晚娛樂(lè)的即時(shí)滿足感和快樂(lè)感,仍然選擇黑夜的孤獨(dú)!
第二種幸福價(jià)值取向是:“我現(xiàn)在不幸福,將來(lái)也不會(huì)幸福”的無(wú)助型。這里面會(huì)涉及到習(xí)得性無(wú)助,意思是無(wú)助不是天生的,而是后天習(xí)得的。小編在這里列舉一個(gè)大象的例子,方便大家理解。在一只大象很小的時(shí)候,人們將其綁在一顆很粗壯的木樁上,剛開(kāi)始小象會(huì)試圖掙脫約束,但是經(jīng)過(guò)幾次嘗試之后,便放棄了掙扎。當(dāng)它后面成長(zhǎng)為大象,擁有足夠的力量擺脫木樁的束縛,它還是會(huì)認(rèn)為自己無(wú)法擺脫,這就是習(xí)得性無(wú)助。對(duì)于習(xí)得性無(wú)助的情況,大家非常容易陷入這樣的情形并且沒(méi)有察覺(jué),對(duì)于這樣的情況,事實(shí)上,只要你愿意學(xué)習(xí),愿意改變,情況就會(huì)有所改善。
第三種幸福的價(jià)值取向是:“我現(xiàn)在不幸福,但是將來(lái)我會(huì)變的幸福”的忍辱負(fù)重型,這樣的情況也是非常常見(jiàn)的,拿我自己來(lái)說(shuō)吧!因?yàn)樾【幨莵?lái)自農(nóng)村的家庭,父母也沒(méi)有接受過(guò)什么太好的教育,在自己的成長(zhǎng)過(guò)程中,父母為了家庭情況的改善也是做了比較多的努力,但是家庭有一個(gè)關(guān)于非常錯(cuò)誤的教育觀念就是只要我們家的孩子上了大學(xué),家庭情況就會(huì)好轉(zhuǎn),我再等等,我相信大部分農(nóng)村家庭的是會(huì)存在這樣的思想觀念,這就是忍辱負(fù)重型的顯著體現(xiàn),但是這樣的價(jià)值取向真的可以獲得幸福嗎?答案是否定的,因?yàn)槿说挠菬o(wú)窮無(wú)盡的,當(dāng)你的最初的目標(biāo)實(shí)現(xiàn)之后,新的更高最求也困擾著這一類人,任何期望通過(guò)外在環(huán)境的改變來(lái)實(shí)現(xiàn)自己的幸福狀態(tài)都是不切實(shí)際的。
第四種幸福的價(jià)值取向是:“我現(xiàn)在很幸福,將來(lái)也會(huì)很幸福”的幸福型,這一類幸福的顯著體現(xiàn)就是有的人會(huì)追憶過(guò)去,有的人會(huì)憧憬未來(lái),但是對(duì)于這兩種情形我們都是無(wú)法實(shí)現(xiàn)的,我們唯一可以關(guān)注的地方就是現(xiàn)在,如果在目前的當(dāng)下,此時(shí)此刻,你感覺(jué)不到快樂(lè),過(guò)去和未來(lái)都于事無(wú)補(bǔ),但是并不是說(shuō)憧憬未來(lái)或者懷念過(guò)去是無(wú)用之舉,但是對(duì)于幸福的提升來(lái)說(shuō),我們所能夠做的只有在為未來(lái)努力奮斗的同時(shí),感受此刻的快樂(lè),沙哈爾教授認(rèn)為只有第四種價(jià)值取向是真正的幸福。
小伙伴們,你們是那種幸福呢?希望大家都可以在編程學(xué)習(xí)道路上追逐自己的第四種幸福價(jià)值取向!
總結(jié)
以上是生活随笔為你收集整理的(Java每日一谈:第四日——幸福的四象限)主流框架:Dubbo基础实战篇--Dubbo快速入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: C/C++笔试题(11)
- 下一篇: 异常: No enclosing ins