1.提出需求
某个电商系统,订单服务需要调用用户服务获取某个用户的所有地址;
我们现在 需要创建两个服务模块进行测试
原来为 table,需要自己转换一下{"cells":[{"verticalAlign":"top","wrap":true,"value":"模块","inlineStyles":{"font-family":[{"from":0,"to":2,"value":"SimSun"}]}},{"verticalAlign":"top","wrap":true,"value":"功能","inlineStyles":{"font-family":[{"from":0,"to":2,"value":"SimSun"}]}},{"verticalAlign":"top","wrap":true,"value":"订单服务web模块","inlineStyles":{"font-family":[{"from":0,"to":4,"value":"SimSun"},{"from":7,"to":9,"value":"SimSun"}]}},{"verticalAlign":"top","wrap":true,"value":"创建订单等","inlineStyles":{"font-family":[{"from":0,"to":5,"value":"SimSun"}]}},{"verticalAlign":"top","wrap":true,"value":"用户服务service模块","inlineStyles":{"font-family":[{"from":0,"to":4,"value":"SimSun"},{"from":11,"to":13,"value":"SimSun"}]}},{"verticalAlign":"top","wrap":true,"value":"查询用户地址等","inlineStyles":{"font-family":[{"from":0,"to":7,"value":"SimSun"}]}}],"heights":[26,24,28],"widths":[146,180]}
测试预期结果:
订单服务web模块在A服务器,用户服务模块在B服务器,A可以远程调用B的功能。
2.工程架构
根据 dubbo《服务化最佳实践》
1) 分包
建议将服务接口,服务模型,服务异常等均放在 API 包中,因为服务模型及异常也是 API 的一部分,同时,这样做也符合分包原则:重用发布等价原则(REP),共同重用原则(CRP)。
如果需要,也可以考虑在 API 包中放置一份 spring 的引用配置,这样使用方,只需在 spring 加载过程中引用此配置即可,配置建议放在模块的包目录下,以免冲突,如:com/alibaba/china/xxx/dubbo-reference.xml。
2) 粒度
服务接口尽可能大粒度,每个服务方法应代表一个功能,而不是某功能的一个步骤,否则将面临分布式事务问题,Dubbo 暂未提供分布式事务支持。
服务接口建议以业务场景为单位划分,并对相近业务做抽象,防止接口数量爆炸。
不建议使用过于抽象的通用接口,如:Map query(Map),这样的接口没有明确语义,会给后期维护带来不便。
3.创建模块
1、gmall-interface:公共接口层(model,service,exception…)
2、gmall-user:用户模块(对用户接口的实现)
3、gmall-order-web:订单模块(调用用户模块)
现在这样是无法进行调用的。我们gmall-order-web引入了gmall-interface,但是interface的实现是gmall-user,我们并没有引入,而且实际他可能还在别的服务器中。
4.使用dubbo改造
1) 改造gmall-user作为服务提供者
1、引入dubbo
2、配置提供者
3、启动服务
2) 改造gmall-order-web作为服务消费者
1、引入dubbo
2、配置消费者信息
3) 测试调用
访问gmall-order-web的initOrder请求,会调用UserService获取用户地址;
调用成功。说明我们order已经可以调用远程的UserService了;
4) 注解版
1、服务提供方

2、服务消费方

