随着互联网的发展,应用系统变得越来越庞大,单体应用由于存在着「修改一点全部都需部署」的问题,让开发和测试做了好多重复的工作,苦不堪言。我们需要引入「微服务」的理念,对项目根据业务进行模块化拆分。
比如,一个商城系统可以拆分为产品product服务、订单order服务、用户user服务。服务之间的通讯(比如用户服务需要查看某一用户的订单数据)就需要用到RPC(远程过程调用),需要服务提供者将服务发布到注册中心(zookeeper)中,然后服务消费者来调用自己需要的服务。注册中心就相当于服务的中介起到牵线搭桥的作用。
一、技术简介
1、Zookeeper
Zookeeper是一个分布式的、开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。
Zookeeper主要用来做注册中心,下面会使用docker安装启动Zookeeper。
①下载zookeeper镜像。使用docker中国的镜像加速。
docker pull registry.docker-cn.com/library/zookeeper
②启动zookeeper,使用镜像的ID启动。
docker run --name zk01 -p 2181:2181 --restart always -d 397be0d8fa45
2、Dubbo
Dubbo是阿里巴巴开源的分布式服务框架,最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度的松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是需求方消费服务,所以基于这一点可以抽象出服务提供方(provider)和服务消费方(consumer)两个角色
使用dubbo来作为rpc框架来保证服务的调用。
下图是dubbo的架构图,中文文档http://dubbo.apache.org/books/dubbo-dev-book/design.html
1.Provider: 暴露服务的服务提供方.
- Consumer: 调用远程服务的服务消费方。
- Registry: 服务注册与发现的注册中心。
- Monitor: 统计服务的调用次调和调用时间的监控中心。
- Container: 服务运行容器。
- 调用关系说明:
- 服务容器负责启动,加载,运行服务提供者。
- 服务提供者在启动时,向注册中心注册自己提供的服务。
- 服务消费者在启动时,向注册中心订阅自己所需的服务。
- 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
- 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
3、创建服务提供者和消费者两个工程
提供者:
①服务提供者,引入bubbo的Springboot的starter
com.alibaba.boot dubbo-spring-boot-starter 0.2.0
引入zookeeper的客户端工具
com.github.sgroschupf zkclient 0.1
②配置application配置文件
dubbo.application.name=provider-do#注册中心地址dubbo.register.address=zookeeper://172.20.10.8:2181#dubbo的扫描包dubbo.scan.base-packages=com.pcx.providerdo.service
③在服务的类中添加dubbo的@service启动application即可.
package com.pcx.providerdo.service;import com.alibaba.dubbo.config.annotation.Service;import org.springframework.stereotype.Component;@Component@Servicepublic class DoserviceImpl implements DoService { @Override public String doThing() { return "我在做事-----------------"; }}
for dubbo config bean [name : 1] has been registered.成功发布
消费者:
①引入依赖
②配置注册中心地址
dubbo.application.id=consumerdubbo.register.address=zookeeper://172.20.10.8:2181
③使用:
package com.pcx.consumer.service;import com.alibaba.dubbo.config.annotation.Reference;import com.pcx.service.DoService;import org.springframework.stereotype.Service;@Servicepublic class GoService { @Reference DoService doService; public void hello(){ String s = doService.doThing(); System.out.println("你在干啥"+s); }}
控制台打印「你在干啥我在做事---------------」
即可。
閱讀更多 平常心cz 的文章