Dubbo学习
GitHub代码***************
集群和分布式
●集群: 一个业务模块,部署在多台服务器上。
●分布式: 一个大的业务系统,拆分为小的业务模块,分别部署在不同的机器上。
架构模式
SOA架构
SOA:(Service-Oriented Architecture,面向服务的架构)是一个组件模型,它将应用程序的不同功能单元(称为服务)进行拆分,并通过这些服务之间定义良好的接口和契约联系起来。
ESB:(Enterparise Servce Bus) 企业服务总线,服务中介。主要是提供了一个服务于服务之间的交互。ESB 包含的功能如:负载均衡,流量控制,加密处理,服务的监控,异常处理,监控告急等等。
分布式架构存在的问题:
服务提供方一旦产生变更,所有消费方都需要变更
微服务架构
微服务架构是在 SOA 上做的升华,微服务架构强调的一个重点是“业务需要彻底的组件化和服务化”,原有的单个业务系统会拆分为多个可以独立开发、设计、运行的小应用。这些小应用之间通过服务完成交互和集成。
微服务架构 = 80%的SOA服务架构思想 + 100%的组件化架构思想 + 80%的领域建模思想
特点:
服务实现组件化:开发者可以自由选择开发技术。也不需要协调其他团队
服务之间交互一般使用REST API
去中心化:每个微服务有自己私有的数据库持久化业务数据
自动化部署:把应用拆分成为一个一个独立的单个服务,方便自动化部署、测试、运维
Zookeeper安装
首先需要有一个CentOS-7的Linux系统(虚拟机)
在Linux系统内安装java7.0以上环境
然后安装zookeeper
1.首先安装java环境
可以用centeros7自带的系统安装java环境
具体有一些坑 比如虚拟机连接不上xshell参考解决地址:
https://jingyan.baidu.com/article/363872ec796dfc6e4ba16f09.html
2.安装zookeeper
首先在opt目录创建zookeeper文件夹
再在zookeeper文件夹创建zkdata文件夹(用于配制Zookeeper的数据目录)
直接用xshell把apache-zookeeper-3.5.6-bin.tar解压到
/opt/zookeeper(文件夹不存在自己创建)
需要配置两个地方
进入到/opt/zookeeper/apache-zookeeper-3.5.6-bin/conf目录
复制zoo_sample.cfg文件并改名为zoo.cfg再修改其dataDir属性值
修改为:
dataDir=/opt/zookeeper/zkdata (之前创建的放数据的目录)
启动zookeeper
进入zookeeper安装目录下的bin目录
执行 ./zkServer.sh start 语句
zookeeper就开始运行了
如果运行不来了 进入zookeeper的bin目录
运行以下命令
chmod a+xwr *:*
测试环境 记得关闭防火墙 命令:systemctl stop firewalld.service
启动成功
Dubbo快速入门
首先编写一个serevice模块写service功能 写好后打包
放入服务器 并且运行
web程序直接依赖这个包 然后访问对应的mapping
pom中一些必须要的坐标:
<!--Dubbo的起步依赖,版本2.7之后统一为rg.apache.dubb -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo</artifactId>
<version>${dubbo.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>${zookeeper.version}</version>
</dependency>
<!--ZooKeeper客户端实现 -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>${zookeeper.version}</version>
</dependency>
服务提供者Service
1.在pom中改变打包的方式 改为war
2.需要更改service的实现类的注解
改为@Service
需要注意的是
这个注解是org.apache.dubbo.config.annotation.Service下的
3.更改applicationContext.xml中的配置 添加如下配置:
<!--dubbo配置-->
<!--配置项目的名称 一般和项目名字相同-->
<dubbo:application name="dubbo-service"/>
<!--配置注册中心地址 这里用的是zookeeper-->
<!--ip通过ip add命令查看 端口号通过查看zookeeper的安装目录下的
/conf/zoo*.cfg的clientPort属性查看-->
<dubbo:registry address="zookeeper://192.168.79.128:2181"/>
<!--配置dubbo的注解扫描-->
<dubbo:annotation package="com.itheima.service.Impl"/>
4.需要添加一个webapp/WEB-INF/web.xml文件在main目录下 xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
服务消费者Servlet
1.需要远程注入的属性加上 @Reference
2.需要添加一个webapp/WEB-INF/web.xml文件在main目录下 xml配置如下:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://java.sun.com/xml/ns/javaee"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
version="2.5">
<!-- spring -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/applicationContext*.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
提取公共接口
就是把消费者和提供者需要的函数提取出来
然后单独做成一个包
记得需要执行以下操作
Dubbo-Admin安装
1.首先需要安装Node.js和maven
2.然后下载Dubbo-Admin
3.然后修改
安装目录下\dubbo-admin-server\src\main\resources\application.properties
的文件配置 修改注册中心的地址即可
4.返回安装的根目录打开cmd窗口
5.执行mvn clean package 等待一会就可以完成打包
6.打包完成后进入 安装目录/dubbo-admin-distribution/targat 有一个dubbo的jar包
直接运行jar包就可以启动项目了
7.再进入安装目录\dubbo-admin-ui 打开cmd窗口 执行 npm run dev命令就可以启动前端工程了
8.如何访问 直接输入他提供的地址即可一般是 http://localhost:8081
在里面可以对自己的生产者提供的方法参数和服务提供测试等功能,非常实用
Dubbo高级特性
Dubbo序列化
这个Dubbo已经对序列化和反序列化进行了封装
我们要做的就是只需要实现Serializable 接口
然后定义一个公共的模块让提供者和消费者都去继承他就可以
再给需要这个pojo的项目添加依赖 然后安装这个项目就可以了
超时与重试
超时:
需要在这个Dubbo的专属注解上添加 timeout属性 用于控制超时时间 默认为1000ms
一般配置到提供方(service)
重试:
需要在这个Dubbo的专属注解上添加 retries属性 用于控制重试次数 默认为2次
多版本
灰度发布:当出现新功能时,会让一部分用户先使用新功能,用户反馈没问题时,再将所有用户迁移到新功能。
dubbo 中使用version 属性来设置和调用同一个接口的不同版本
使用方法 :
在提供方的@Service注解上添加version属性 值就是版本号
怎么调用对应的版本:
需要在消费方(WEB)的Dubbo专属注解(@Reference)上添加version属性
需要调用哪个版本,就写对应的Service上的version值
注意 如果提供者写了版本号 那么消费者也必须写 不然会出找不到版本异常
负载均衡
负载均衡策略(4种):
Random :按权重随机,默认值。按权重设置随机概率。
RoundRobin :按权重轮询。
LeastActive:最少活跃调用数,相同活跃数的随机。(看请求时间长短,选最短的使用)
ConsistentHash:一致性 Hash,相同参数的请求总是发到同一提供者。
怎么使用:
1.首先要在提供者
需要在Dubbo的Service注解上加上weight属性来设置权重数值越大越容易被执行
多台机器之间端口不能有冲突
就需要配置:
pom.xml 里面的tomcat的插件 修改端口号
applicationContext.xml里面的修改项为:
<!--修改端口-->
<dubbo:protocol path="20882"/>
<!--dubbo配置-->
<!--配置项目的名称 一般和项目名字相同-->
<dubbo:application name="dubbo-service">
<!--修改value-->
<dubbo:parameter key="qos.port" value="55555"/>
</dubbo:application>
2.在消费者的注入注解上添加 loadbalance 属性 值为上面的几种属性字符串 全字母小写
集群容错
集群容错模式:
Failover Cluster:失败重试。默认值。当出现失败,重试其它服务器 ,默认重试2次,使用 retries 配置。一般用于读操作
Failfast Cluster :快速失败,只发起一次调用,失败立即报错。通常用于写操作。
Failsafe Cluster :失败安全,出现异常时,直接忽略。返回一个空结果。
Failback Cluster :失败自动恢复,后台记录失败请求,定时重发。通常用于消息通知操作。
Forking Cluster :并行调用多个服务器,只要一个成功即返回。
Broadcast Cluster :广播调用所有提供者,逐个调用,任意一台报错则报错。
怎么使用:
在Dubbo的@Reference属性上添加cluster属性 值为上面的首个单词字母全小写