浅谈分布式架构
分布式架构
单看这个名字给人的感觉就是高逼格,但其实从历史的角度来分析一下就比较明了了。
我们拿一个电商系统来说:
单系统
E65B5547-AF84-4D31-836D-72892C7AC7EA.png
对于一个刚起步的创业公司项目肯定是追求越快完成功能越好,并且用户量也不大。
这时候所有的业务逻辑都是在一个项目中就可以满足。
垂直拆分-多应用
QQ20170406-230056@2x.jpg
当业务量和用户量发展到一定地步的时候,这时一般会将应用同时部署到几台服务器上,在用户访问的时候使用Nginx
进行反向代理和简单的负载均衡。
SOA服务化
当整个系统以及发展的足够大的时候,比如一个电商系统中存在有:
- 用户系统
- 订单系统
- 支付系统
- 物流系统
等系统。
如果每次修改了其中一个系统就要重新发布上线的话那么耦合就太严重了。
所以需要将整个项目拆分成若干个独立的应用,可以进行独立的开发上线实现快速迭代。
dubbo.png
如上图所示每个应用之间相互独立,每个应用可以消费其他应用暴露出来的服务,同时也对外提供服务。
从架构的层面简单的理解了,接下来看看如何编码实现。
基于dubbo的实现
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相关的配置文件了。