一、 Dubbo 概述
1. 为什么需要Dubbo
互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,Dubbo是一个分布式服务框架,在这种情况下诞生的。现在核心业务抽取出来,作为独立的服务,使前端应用能更快速和稳定的响应。
2. Dubbo是什么
Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种非常简单的模型,要么是提供方提供服务,要么是消费方消费服务,所以基于这一点可以抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。关于注册中心、协议支持、服务监控等内容
3. Dubbo能做什么
当网站变大后,不可避免的需要拆分应用进行服务化(微服务),以提高开发效率,调优性能,节省关键竞争资源等。 当服务越来越多时,服务的URL地址信息就会爆炸式增长,配置管理变得非常困难,F5硬件负载均衡器的单点压力也越来越大。
当进一步发展,服务间依赖关系变得错踪复杂,甚至分不清哪个应用要在哪个应用之前启动,架构师都不能完整的描述应用的架构关系。接着,服务的调用量越来越大,服务的容量问题就暴露出来,这个服务需要多少机器支撑?什么时候该加机器?等等…… 在遇到这些问题时,都可以用Dubbo来解决。
二、 Dubbo 原理
1. Dubbo架构图
上述图所描述的调用流程关系如下:
0. 服务容器负责启动,加载,运行服务提供者,这个图上没标识出来,服务端启动就是0.
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
三. Dubbo与zookeeper
Dubbo为什么要与zookeeper/Consule一起使用?dubbo主要是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的。告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册。zookeeper用来注册服务和进行负载均衡,哪一个服务由哪一个机器来提供必需让调用者知道,简单来说就是ip地址和服务名称的对应关系。zookeeper通过心跳机制可以检测挂掉的机器并将挂掉机器的ip和服务对应关系从列表中删除。
利用zookeeper生成的节点树,服务器提供者在启动的时候,将提供的服务名称和地址以节点的方式注册都服务器zookeeper服务器配置中心,消费者通过服务器配置中心获取需要的服务名称节点下的服务地址。因为znode有非持久节点的特性,服务器可以动态的从服务配置中心一处,并且触发消费者的watcher方法!!!
消费者只有在第一次调用的时候直接本地缓存服务器列表信息,而不需要重新发起请求到服务器配置中心区获取相应 的服务器列表,直到服务器地址列表有变化(机器下线或者上线),变更之后消费者watcher进行服务地址的重新查询。正是因为这种无中心化的结构,使得服务消费者在服务信息没变更时候,几乎不依赖配置中心,解决了负载均衡设备导致的单点故障的问题,大大减少了服务配置中心的压力
四. Zookeeper的安装,此处以windows环境下为例。
在apache的官方网站提供了好多镜像下载地址,然后找到对应的版本,目前最新的是3.4.5。
把下载的zookeeper的文件解压到指定目录
修改conf下增加一个zoo.cfg
进入到bin目录,并且启动zkServer.cmd,这个脚本中会启动一个Java进程
这个时候zookeeper已经安装成功了.
五. 服务提供者
演示工程结构如下:
首先看下咱们的pom文件,引入Dubbo和Zookeeper的jar包.没啥好说的。
io.dubbo.springboot
spring-boot-starter-dubbo
1.0.0
org.apache.zookeeper
zookeeper
3.4.6
com.github.sgroschupf
zkclient
0.1
然后我们写自己的接口与实现,通常分布式设计下接口应该与实现分开,让接口与bean单独起工程模块,以便服务提供者与消费者都可以调用。如果服务端有自己不暴漏的方法,可单写接口类,也可中间加层,看业务而定。
接口
public interface UserService {
/**
* 提供分布式业务的测试方法
*/
public User createUser(String name,int age);
}
接口实现
import com.alibaba.dubbo.config.annotation.Service;
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;
@Service //关键注解,表示可注册的服务 com.alibaba.dubbo.config.annotation.Service
public class UserServiceImpl implements UserService {
@Override
public User createUser(String name, int age) {
User user = new User(name, age);
return user;
}
}
重点看下我们dobbo配置 ,application.properties 配置:
server.port=8083
#在DubboAdmin管理中心展示的应用名称
spring.dubbo.application.name=p-provider
#向注册中心注册服务
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
spring.dubbo.protocol.name=dubbo
#向外暴露Dubbo端口
spring.dubbo.protocol.port=20888
#扫描接口所在的包
spring.dubbo.scan=com.icss.springbootfuwu.service
接下来我们启动服务提供者服务,这里我们常用的应该是启动一个java程序,因为我们的工程中并没有涉及web方面的业务,尽量不适用tomcat 启动Web容器。服务完成。
六. 服务消费者
我们再创建一个消费者工程项目,结构如下:
Pom文件与服务者要引用的基本一样,都是dubbo与zookeeper。
io.dubbo.springboot
spring-boot-starter-dubbo
1.0.0
com.alibaba
dubbo
2.6.0
org.springframework
spring
org.apache.zookeeper
zookeeper
3.4.6
pom
我们原样拷贝服务端的接口目录到客户端,看项目结构图。
我们编写一个业务类代码,调取接口。
import org.springframework.stereotype.Service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.icss.springbootfuwu.entity.User;
import com.icss.springbootfuwu.service.UserService;
@Service //SpringMVC 业务类
public class UserClientService {
@Reference //关键注解,表示引用服务端接口代理对象
UserService userService;
public User getUser(String name,int age) {
return userService.createUser(name, age);
}
}
配置我们dubbo配置文件,让zookeeper给我们订阅需要的服务。在application.properties文件中配置。
server.port=8082
#DubboAdmin管理工具显示的应用名称
spring.dubbo.application.name=c-consumer
#订阅服务
spring.dubbo.registry.address=zookeeper://172.17.4.82:2181
#订阅服务
spring.dubbo.scan=com.icss.springbootfuwu.service
运行客户端程序,调用控制器->业务类,可看到服务端返回的数据结果。
程序案例请下载:https://download.csdn.net/download/dange_h/10747192