dubbo搭建
-
Dubbo
- Dubbo简介
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,以及SOA服务治理方案。简单的说,dubbo就是个服务框架,如果没有分布式的需求,其实是不需要用的,只有在分布式的时候,才有dubbo这样的分布式服务框架的需求,并且本质上是个服务调用的东东,说白了就是个远程服务调用的分布式框架(告别Web Service模式中的WSdl,以服务者与消费者的方式在dubbo上注册)
其核心部分包含:
1. 远程通讯: 提供对多种基于长连接的NIO框架抽象封装,包括多种线程模型,序列化,以及“请求-响应”模式的信息交换方式。
2. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载均衡,失败容错,地址路由,动态配置等集群支持。
3. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地址透明,使服务提供方可以平滑增加或减少机器。
-
- Dubbo作用(优缺点)
优点:
- 透明化的远程方法调用
像调用本地方法一样调用远程方法;只需简单配置,没有任何API侵入。
软负载均衡及容错机制
- 可在内网替代nginx lvs等硬件负载均衡器。
服务注册中心自动注册 & 配置管理
不需要写死服务提供者地址,注册中心基于接口名自动查询提供者ip。
使用类似zookeeper等分布式协调服务作为服务注册中心,可以将绝大部分项目配置移 入zookeeper集群。
- 服务接口监控与治理
Dubbo-admin与Dubbo-monitor提供了完善的服务接口管理与监控功能,针对不同应用 的不同接口,可以进行 多版本,多协议,多注册中心管理。
缺点:
- 难度较大,架构维护起来也不是很方便。
- dubbo的开发难度较大,原因是dubbo的jar包依赖问题很多大型工程无法解决
- Dubbo架构
dubbo架构图如下所示:
节点角色说明:
Provider: 暴露服务的服务提供方。
Consumer: 调用远程服务的服务消费方。
Registry: 服务注册与发现的注册中心。
Monitor: 统计服务的调用次调和调用时间的监控中心。
Container: 服务运行容器。
调用关系说明:
0 服务容器负责启动,加载,运行服务提供者。
1. 服务提供者在启动时,向注册中心注册自己提供的服务。
2. 服务消费者在启动时,向注册中心订阅自己所需的服务。
3. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
4. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
5. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
- Dubbo环境搭建
所需工具:
jdk1_7.tar.gz
zookeeper-3.4.10.tar.gz
apache-tomcat-8.0.53.tar.gz
dubbo-admin-2.5.10.war(此文件不需解压)
以上文件下载需根据自己的电脑系统下载相对匹配的文件 我这里用的均是64位
- 安装jdk,配置环境变量。
安装成功后输入java -version 可以查看到jdk信息
- 安装zookeeper(单机模式)
A,将安装包zookeeper-3.4.10.tar.gz上传至服务器,进入所在目录,输入命令 tar -zxvf zookeeper-3.4.10.tar.gz 进行解压
B,进入zookeeper新建data与logs目录用于保存zookeeper日志信息
- 进入conf,复制一份zoo_sample.cfg并修改其名称为zoo.cfg,配置zoo.cfg文件
在data目录中添加myid文件
可以直接
cd data
vim myid
#之后会产生一个新文件,直接在里面写 X 即可
#比如我配置的三个server,myid里面写的X就是server.X=ip:2888:3888 中ip所对应的X
server.0=192.168.192.128:2888:3888【192.168.192.128服务器上面的myid填写0】
server.1=192.168.192.129:2888:3888【192.168.192.129服务器上面的myid填写1】
server.2=192.168.192.130:2888:3888【192.168.192.130服务器上面的myid填写2】
配置文件中参数说明:
tickTime : 服务器与客户端之间交互的基本时间单元(ms)
initLimit:initLimit和leader之间最长心跳时间,设置的是10那么就是tickTime的10陪,即2000毫秒*10=20000毫秒=20秒
syncLimit:leader和follower之间发送消息, 请求和应答的最大时间长度. 此时该参数设置为5, 说明时间限制为5倍tickTime, 即2000毫秒*5=10000毫秒=10秒
dataDir : 保存zookeeper数据路径
dataLogDir : 保存zookeeper的日志路径,当此配置不存在时默认路径与dataDir一致
clientPort : 客户端访问zookeeper时经过服务器端时的端口号
maxClientCnxns:这个操作将限制连接到 ZooKeeper 的客户端的数量,限制并发连接的数量,它通过 IP 来区分不同的客户端。此配置选项可以用来阻止某些类别的 Dos ***。将它设置为 0 或者忽略而不进行设置将会取消对并发连接的限制。
- 环境变量设置
为了方便运行zkServer.sh 脚本,我们将zookeeper 的bin 路径加入到/etc/profile 中,
作为一个全局变量进行输出到PATH 中,记得修改完成之后运行source /etc/profile 使修
改生效
export ZOO_HOME=/home/sms/zhupy/zookeeper-3.4.10
export PATH=$PATH:$ZOOKEEPER_HOME/bin:$ZOO_HOME/conf
- 启动运行
进入zookeeper的bin目录,使用配置的zoo.gfh启动。
输入命令
启动zookeeper:./zkServer.sh start
停止zookeeper: ./zkServer.sh stop
查看状态: ./zkServer.sh status
说明启动成功
用zookeeper客户端连接:
zookeeper 客户端:zkCli.sh -server [IP]:12182 #[IP]为zookeeper 服务的IP 地址
输入命令ll查看命令行
客户端命令详解查看:https://blog.****.net/xyang81/article/details/53053642
集群模式搭建可参考:https://blog.****.net/qq_27739989/article/details/78108351
3.安装配置dubbo-admin
A.获取dubbo-admin.war包,可自己在****下载或者自己去下载源码打包
下载地址https://github.com/apache/incubator-dubbo/releases
下载下来是这样的一个目录结构:
但是这里我们只关心dubbo-admin这个文件夹。
其实下面所谓配置的目的就是为了得到war包,war包网上也有,但是下载了很多下来都会有问题,原因可能是每个人的电脑jdk版本或其他环境不一样,因此我们自己打包一个war就好。打包war包,进入dubbo-admin这个文件目录 运行命令:
mvn package -Dmaven.skip.test=true
如果看到如下结果,说明打包成功了:
打包过程中可能会有报错,好像是jar包不兼容造成的,拿着报错信息,直接百度就行。
打包成功后,会看到如下文件
- 配置tomcat启动dubbo-admin
将tomcat安装包上传至服务器解压,修改conf目录下的server.xml文件中的端口。端口不要冲突就好。将war包放入tomcat的webapps下启动tomcat即可
启动tomcat命令:./startup.sh (进入bin目录下)
关闭tomcat:./shutdown.sh
启动成功后可看到war包被解压了多出了dubbo-admin目录
修改配置dubbo.properties文件 然后重启tomcat
#zk地址和端口
dubbo.registry.address=zookeeper://127.0.0.1:2180
#root帐号和密码
dubbo.admin.root.password=root
#guest帐号和密码
dubbo.admin.guest.password=guest
C.访问dubbo
dubbo版本号
依次点击系统管理---dubbo管理,在弹出的界面中能看到dubbo的版本号,这个版本号并不是zookeeper的版本,也不是dubbo-admin的版本,而是开发人员使用的dubbo的jar的版本号(项目中引用的jar)。
系统快照
依次点击系统管理--->系统快照,在弹出页面中能看到【没有提供者 服务 提供者 消费者】
分别是【没有提供者的消费者个数,服务个数,提供者个数,消费者个数】点击后面对应的属性个数,能看到详细信息
系统状态
系统日志
依次点击系统管理--->系统日志,在弹出页面能看到日志,要想时时的看 需要不断刷新页面。可以修改日志级别,进行观看。也可以搜关键字进行查找日志
系统环境
依次点击系统管理--->系统环境,在弹出的页面能看到系统信息
- Dubbo代码案例
- Springboot+dubbo
新建springboot项目
springboot-dubbo 生产者
spring-boot-consumer 消费者
springboot-api 实体类及需要暴露的接口
生产者:springboot-dubbo
1.Pom.xml
项目依赖这一块主要使用到了基本的Spring-Boot 依赖,然后我们需要额外引入Dubbo 与Zookeeper的依赖
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.zpy</groupId>
<artifactId>springboot-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2.配置文件
由于我们底层使用的是Spring-Boot 进行开发,那么我们就应该善于利用Spring-Boot 给我们带来的优势,因此我们可以直接在Application.properties 文件中配置Dubbo 服务:
#端口号
server.port=8082
## Dubbo 服务提供者配置
#--服务名称
spring.dubbo.application.name=provider
#-- 注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.150.233:2180
# -- dubbo 协议
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#--声明需要暴露的服务接口
spring.dubbo.scan=com.zpy.service
#注册中心连接超时时间
#spring.dubbo.application.registries.timeout=10000
#spring.dubbo.application.registries.session=100000
3.服务提供
在服务提供主要包括两部分,一个是暴露服务,一个是服务实现
暴露服务:即我们平常开发中所使用的的接口,这里我们在springboot-api项目中service创建一个 ColorService的接口,主要包括一个保存颜色的方法。
import com.zpy.domain.Color;
/**
* Created by Administrator on 2018/8/14.
*/
public interface ColorService {
Color saveColor(Color c);
}
服务实现:服务实现,与我们平常的服务一样,对接口进行实现,比较特别的是,我们这里需要使用到Dubbo 的 @Service 注解
在springboot-dubbo项目中实现springboot-ap定义的ColorService 接口
import com.alibaba.dubbo.config.annotation.Service;
import com.zpy.domain.Color;
import com.zpy.service.ColorService;
/**
* Created by Administrator on 2018/8/14.
*/
@Service
public class ColorServiceImpl implements ColorService {
@Override
public Color saveColor(Color color) {
color.setId("a");
System.out.println(color.toString());
return color;
}
}
消费者:spring-boot-consumer
1.消费者的相关依赖,与生产者的依赖一致。
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>com.zpy</groupId>
<artifactId>springboot-api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
2.配置文件:
配置文件与生产者稍有区别:
## 避免和 server 工程端口冲突
server.port=8081
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
#注册中心地址
spring.dubbo.registry.address=zookeeper://192.168.150.233:2180
#引用生产者服务接口的类所在的包
spring.dubbo.scan=com.zpy.service
3.服务实现
例如,在这里我们需要使用到生产者中的 saveColor(Color color) 方法,则需要创建一个接口,然后再调用时,使用 @Reference 注解进行引用:
i
import com.alibaba.dubbo.config.annotation.Reference;
import com.zpy.domain.Color;
import org.springframework.stereotype.Component;
/**
* Created by Administrator on 2018/8/14.
*/
@Component
public class CsService{
@Reference
ColorService colorService;
public Color saveColor(String str) {
Color color = new Color();
color.setName(str);
color.setDes(str);
color.setTt(str);
return colorService.saveColor(color);
}
}
创建一个测试的controller,调用csservice
i
import com.zpy.service.CsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* Created by Administrator on 2018/8/14.
*/
@RestController
public class ColorController {
@Autowired
CsService csService;
@RequestMapping("/save")
public Object saveUser(String str) {
return csService.saveColor(str);
}
}
先启动生产者,然后启动消费者
在dubbo中可以看到生产者和消费者接口接口状态
消费者接口
通过浏览器访问消费者controller可以看到以下信息
生产者输出打印信息