您好,登錄后才能下訂單哦!
本篇內容介紹了“基于dubbo的分布式架構怎么實現”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
現在越來越多的互聯網公司還是將自己公司的項目進行服務化,這確實是今后項目開發的一個趨勢,就這個點再憑借之前的 SSM 項目來讓第一次接觸的同學能快速上手。
分布式架構單看這個名字給人的感覺就是高逼格,但其實從歷史的角度來分析一下就比較明了了。
我們拿一個電商系統來說:
對于一個剛起步的創業公司項目肯定是追求越快完成功能越好,并且用戶量也不大。
這時候所有的業務邏輯都是在一個項目中就可以滿足。
當業務量和用戶量發展到一定地步的時候,這時一般會將應用同時部署到幾臺服務器上,在用戶訪問的時候使用Nginx進行反向代理和簡單的負載均衡。
當整個系統以及發展的足夠大的時候,比如一個電商系統中存在有:
用戶系統
訂單系統
支付系統
物流系統
等系統。
如果每次修改了其中一個系統就要重新發布上線的話那么耦合就太嚴重了。
所以需要將整個項目拆分成若干個獨立的應用,可以進行獨立的開發上線實現快速迭代。
如上圖所示每個應用之間相互獨立,每個應用可以消費其他應用暴露出來的服務,同時也對外提供服務。
從架構的層面簡單的理解了,接下來看看如何編碼實現。
dubbo應該算是國內使用最多的分布式服務框架,基于此來實現對新入門的同學應該很有幫助。
其中有涉及到安裝dubbo服務的注冊中心zookeeper等相關知識點可以自行查看官方文檔,這里就不單獨講了。
首先第一步需要在SSM-API模塊中定義一個接口,這里就搞了一個用戶查詢的接口
/** * Function:用戶API * @author chenjiec * Date: 2017/4/4 下午9:46 * @since JDK 1.7 */ public interface UserInfoApi { /** * 獲取用戶信息 * @param userId * @return * @throws Exception */ public UserInfoRsp getUserInfo(int userId) throws Exception; }
接著在SSM-SERVICE模塊中進行實現:
import com.alibaba.dubbo.config.annotation.Service; /** * Function: * @author chenjiec * Date: 2017/4/4 下午9:51 * @since JDK 1.7 */ @Service public class UserInfoApiImpl implements UserInfoApi { private static Logger logger = LoggerFactory.getLogger(UserInfoApiImpl.class); @Autowired private T_userService t_userService ; /** * 獲取用戶信息 * * @param userId * @return * @throws Exception */ @Override public UserInfoRsp getUserInfo(int userId) throws Exception { logger.info("用戶查詢Id="+userId); //返回對象 UserInfoRsp userInfoRsp = new UserInfoRsp() ; T_user t_user = t_userService.selectByPrimaryKey(userId) ; //構建 buildUserInfoRsp(userInfoRsp,t_user) ; return userInfoRsp; } /** * 構建返回 * @param userInfoRsp * @param t_user */ private void buildUserInfoRsp(UserInfoRsp userInfoRsp, T_user t_user) { if (t_user == null){ t_user = new T_user() ; } CommonUtil.setLogValueModelToModel(t_user,userInfoRsp); } }
這些都是通用的代碼,但值得注意的一點是這里使用的dubbo框架所提供的@service注解。作用是聲明需要暴露的服務接口。
再之后就是幾個dubbo相關的配置文件了。
<dubbo:application name="ssm-service" owner="crossoverJie" organization="ssm-crossoverJie" logger="slf4j"/> <dubbo:registry id="dubbo-registry" address="zookeeper://192.168.0.188:2181" file="/tmp/dubbo.cachr" /> <dubbo:monitor protocol="registry" /> <dubbo:protocol name="dubbo" port="20880" /> <dubbo:provider timeout="15000" retries="0" delay="-1" /> <dubbo:consumer check="false" timeout="15000" />
其實就是配置我們服務注冊的zk地址,以及服務名稱、超時時間等配置。
<dubbo:annotation package="com.crossoverJie.api.impl" />
這個配置掃描注解包的位置,一般配置到接口實現包即可。
這個是消費者配置項,表明我們需要依賴的其他應用。
這里我們在SSM-BOOT項目中進行配置:
<dubbo:reference id="userInfoApi" interface="com.crossoverJie.api.UserInfoApi" />
直接就是配置的剛才我們提供的那個用戶查詢的接口,這樣當我們自己的內部項目需要使用到這個服務只需要依賴SSM-BOOT即可,不需要單獨的再去配置consumer。這個我有在上一篇SSM(十) 項目重構-互聯網項目的Maven結構中也有提到。
還有一個需要做的就是安裝管理控制臺,這里可以看到我們有多少服務、調用情況是怎么樣等作用。
這里我們可以將dubbo的官方源碼下載下來,對其中的dubbo-admin模塊進行打包,將生成的WAR包放到Tomcat中運行起來即可。
但是需要注意一點的是:
需要將其中的dubbo.properties的zk地址修改為自己的即可。
dubbo.registry.address=zookeeper://127.0.0.1:2181 dubbo.admin.root.password=root dubbo.admin.guest.password=guest
到時候登陸的話使用root,密碼也是root。
使用guest,密碼也是guest。
登陸界面如下圖:
其中我們可以看到有兩個服務以及注冊上去了,但是沒有消費者。
為了能夠更直觀的體驗到消費服務,我新建了一個項目:
https://github.com/crossoverJie/SSM-CONSUMER。
其中在SSM-CONSUMER-API中我也定義了一個接口:
/** * Function:薪資API * @author chenjiec * Date: 2017/4/4 下午9:46 * @since JDK 1.7 */ public interface SalaryInfoApi { /** * 獲取薪資 * @param userId * @return * @throws Exception */ public SalaryInfoRsp getSalaryInfo(int userId) throws Exception; }
因為作為消費者的同時我們也對外提供了一個獲取薪資的一個服務。
在SSM-CONSUMER-SERVICE模塊中進行了實現:
/** * Function: * @author chenjiec * Date: 2017/4/4 下午9:51 * @since JDK 1.7 */ @Service public class SalaryInfoApiImpl implements SalaryInfoApi { private static Logger logger = LoggerFactory.getLogger(SalaryInfoApiImpl.class); @Autowired UserInfoApi userInfoApi ; /** * 獲取用戶信息 * * @param userId * @return * @throws Exception */ @Override public SalaryInfoRsp getSalaryInfo(int userId) throws Exception { logger.info("薪資查詢Id="+userId); //返回對象 SalaryInfoRsp salaryInfoRsp = new SalaryInfoRsp() ; //調用遠程服務 UserInfoRsp userInfo = userInfoApi.getUserInfo(userId); salaryInfoRsp.setUsername(userInfo.getUserName()); return salaryInfoRsp; } }
其中就可以直接使用userInfoApi調用之前的個人信息服務。
再調用之前需要注意的有點是,我們只需要依賴SSM-BOOT這個模塊即可進行調用,因為SSM-BOOT模塊已經為我們配置了消費者之類的操作了:
<dependency> <groupId>com.crossoverJie</groupId> <artifactId>SSM-BOOT</artifactId> </dependency>
還有一點是在配置SSM-BOOT中的spring-dubbo-cosumer.xml配置文件的時候,路徑要和我們初始化spring配置文件時的路徑一致:
<!-- Spring和mybatis的配置文件 --> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring/*.xml</param-value> </context-param>
接下來跑個單測試一下能否調通:
/** * Function: * * @author chenjiec * Date: 2017/4/5 下午10:41 * @since JDK 1.7 */ @RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations = { "classpath*:/spring/*.xml" }) public class SalaryInfoApiImplTest { @Autowired private SalaryInfoApi salaryInfoApi ; @Test public void getSalaryInfo() throws Exception { SalaryInfoRsp salaryInfo = salaryInfoApi.getSalaryInfo(1); System.out.println(JSON.toJSONString(salaryInfo)); } }
消費者
提供者
可以看到確實是調用成功了的。
接下來將消費者項目也同時啟動在來觀察管理控制臺有什么不一樣:
會看到多了一個消費者所提供的服務com.crossoverjie.consumer.api.SalaryInfoApi,同時
com.crossoverJie.api.UserInfoApi服務已經正常,說明已經有消費者了。
點進去便可查看具體的消費者。
“基于dubbo的分布式架構怎么實現”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。