Java

基于Dubbo的分布式架构设计


基于 Dubbo的分布式架构设计白翁掌目录前言浅谈分布式架构2.1.单系统2.2.垂直拆分-多应用2.3.SOA服务化3基于 dubbo的实现.+++++3.1.对外提供服务spring-dubbo-config. xml...dub bo-providerxmlspring-dubbo-con su mer.xml2.安装管理控制台3.3.消费服务4总结白翁掌1.前言现在越来越多的互联网公司还是将自己公司的项目进行服务化,这确实是今后项目开发的一趋势,就这个点再凭借之前的Ssm(htTps://github./crossoverjie/ssm.git)项目来让第一次接触的同学能快速上手。

2.浅谈分布式架构分布式架构单看这个名字给人的感觉就是高逼格,但其实从历史的角度来分析一下就比较明了了我们拿一个电商系统来说2.1.单系统ww.应用Shop)Tomcat对于一个刚起步的创业公司项目肯定是追求越快完成功能越好,并且用户量也不大。

白翁掌这时候所有的业务逻辑都是在一个项目中就可以满足。

2.2.垂直拆分-多应用TomcatclentNginxTomcatmcat当业务量和用户量发展到一定地步的时候,这时一般会将应用同时部署到几台服务器上,在用户访问的时候使用 Nginx进行反向代理和简单的负载均衡。

2八ww.SO当整个系统以及发展的足够大的时候,比如一个电商系统中存在有用户系统订单系统支付系统物流系统等系统。

如果每次修改了其中一个系统就要重新发布上线的话那么耦合就太严重了所以需要将整个项目拆分成若于个热立的应用,可以进行立的开发上线实现快速送代。

如上图所示每个应用之间相互独立每个应用可以消费其他应用暴露出来的服务同时也对外提供服务。

从架构的层面简单的理解了,接下来看看如何编码实现。

白翁掌3.基于 dubbo的实现dubbo应该算是国内使用最多的分布式服务框架,基于此来实现对新入门的同学应该很有帮助其中有涉及到安装dubo服务的注册中心 zookeeper等相关知识点可以自行查看官方文档,这里就不单独讲了3.1.对外提供服务首先第一步需要在SSM-API模块中定义一个接口,这里就搞了一个用户查询的接口Function:用户Aw I*Author chenjiaDate:2017/44下午9:464上@ Since jDK17public interface UserInfo Ap获取用户信息白翁掌*@param userretur@throws Exceptiublic UserInfo Rsp getUserInfo(int userId) throws Exception,接着在SSM- SERVICE模块中进行实现import . alibaba. dubbo. config. annotation serviceauthor cDate:2017/414下午9:5since JDK@Servicelpublic class UserInfoApilmpl implements UserInfoApi 1rivate static Logger logger LoggerFactory getLogger(UserInfoApilmpl. class):@Autowiredprivate T_userServicet_userService白翁掌*获取用户信息@param userid@retur*@throws Exception@Overridublic UserInfo Rsp getUserInfo(int userid) throws Exceptionlogger. info("用户查询d="+ userid∥回对象serInfo Rsp userInfoRsp new UserInfoRsp0n. T_user t_user =t_ userService selectBy Primarykey(userIe∥构建build UserInfoRsp(userInfoRsp, t_user)return userInfoRsp8白翁掌构建返回@param userInfoRspl@param t userprivate void build UserInfoRsp(UserInfo Rsp userInfoRsp, T_user t_user)t user new t usCommonUtil. setLog valueModelToModel(t_user, userInfoRsp)这些都是通用的代码,但值得注意的一点是这里使用的 dubbo框架所提供的@ service注解。

作用是声明需要暴露的服务接口再之后就是几个 dubbo相关的配置文件了9白翁掌spring-dubbo-Contig.xml其实就是配置我们服务注册的水k地址,以及服务名称、超时时间等配置spring-dubbo-provider. xml白翁掌n. 直接就是配置的刚才我们提供的那个用户查询的接口,这样当我们自己的内部项目需要使用到这个服务只需要依赖SSM-BOOT即可,不需要单独的再去配置 consumer。

这个我有在上篇SSM(十)项目重构-互联网项目的 Maven结构://crossoverjie.top/2017/03/04/ssm10/#ssm-boot)中也有提到。

3.2.安装管理控制台白翁掌还有一个需要做的就是安裝管理控制台,这里可以看到我们有多少服务、调用情况是怎么样等作用这里我们可以将 dubbo的官方源码下载下来,对其中的 dubbo- ad min模块进行打包,将生成的WAR包放到 Tomcat中运行起来即可但是需要注意一点的是需要将其中的 dubbo. properties的zk地址修改为自己的即可。

ubbo registry address=zookeeper. //127.0.0.1: 2ubbo admin. root password=rooubbo admin.guest password=gueocin.到时候登陆的话使用root,密码也是root使用 guest,密码也是 guest登陆界面如下图白翁掌e[x6401报务其中我们可以看到有两个服务以及注册上去了,但是没有消费者。

3.3.消费服务为了能够更直观的体验到消费服务,新建了一个项目in. s://github./crossoverjie/ssm-consumer其中在 SSM-CONSUMER-API中我也定义了一个接口Function薪资API* @author chenjieDate:2017/44下午9:白翁掌* @since Dpublic interface SalaryInfoapi获取薪@param userid@retur@throws Exceptioublic SalaryInfoRsp getSalaryInfo(int userId)throws Exception因为作为消费者的同时我们也对外提供了一个获取薪资的一个服务在SSM- CONSUMER- SERVICE模块中进行了实现Function@author chenjiedDate:2017/44下午9:5白翁掌* @since Dl@Selpublic class SalaryInfo ApiImpl implements SalaryInfoApiprivate static Logger logger LoggerFactory getLogger(SalaryInfoApilmpl. class);@AutUserInfo Api userInfo Api获取用户信息@param userIdreturww.@throws Exceptio@Overridepublic SalaryInfo Rsp getsalaryInfo(int userId) throws Exceptionlogger. info("薪资查询d="+ userid∥回对象SalaryInfoRsp salaryInfoRsp= new SalaryInfo Rspo白翁掌//周用远程服务UserInfoRsp userInfo userInfo Api getUserInfo(userId);salaryInfoRsp setUsername(userInfo. getUserName O)eturn salaryInfoR其中就可以直接使用 userInfo Api调用之前的个人信息服务再调用之前需要注意的有点是,我们只需要依赖SSM-BOOT这个模块即可进行调用,因为SSM-BOOT模块已经为我们配置了消费者之类的操作. crossover Jie SSM-BOOTocin. context Config Locationclasspath*: spring/*.xml接下来跑个单测试一下能否调通白翁掌Function@author chenjiedDate:2017/4/5下午104@since jDKunWith(Spring JUnit4ClassRunner. class)@Context Configuration(locations =("classpath*: /spring/*. xmlpublic class SalaryInfo ApilmplTest@Autowiredprivate SalaryInfoApi salaryInfoApiI public void getSalaryinfo0 throws ExceptionSalaryInfoRsp salaryInfo salaryInfo Api getsalaryInfo(System.out printIn(SoN. toJSONString(salarylnfo))吧cLient -- Reading reply sessionid: Bxsb)blcb438414. parRett client消费者提供者吧可以看到确实是调用成功了的。

接下来将消费者项目也同时启动在来观察管理控制台有什么不一样c o 0192168.0,1B#oDUBBO服务ax,swm,w法会看到多了一个消费者所提供的服务 .crossoverjie. co ns umer api. salaryInfo Api同时. crossoverjie. api. UserInfo Api服务已经正常,说明已经有消费者了。

消费者,当,a量止量到放地Q能细量金的他且B轴重Q日白翁掌点进去便可查看具体的消费者。

总结这样一个基于 dubbo的分布式服务已经差不多了,在实际的开发中我们便会开发一个大系统中的某一个子应用,这样就算一个子应用出问题了也不会影响到整个大的项目。

在实际的生产环境一般同一个服务我们都会有一个 master,save的主从服务,这样在上线的过程中不至于整个应用出现无法使用的尴尬情况。

谈到了SOA的好处,那么自然也有相对于传统模式的不方便之处拆分一个大的项目为成百上干的子应用就不可能手动上线了,即需要自动化的部署上线,如 Jenkins。

还有一个需要做到的就是监控,需要一个单独的监控平台来帮我们实时查看各个服务的运行情况以便于及时定位和解决问题。

日志查看分析,拆分之后不可能再去每台服务器上查看日志,需要一个单独的日志查看分析工具如elk。

21。