本章主要说下dubbo和zookeeper的概念,以及在基于springboot框架搭建dubbo+zookeeper分布式服务架构。
什么是dubbo:
dubbo框架:dubbo是阿里巴巴soa服务化治理方案的核心框架,是一个分布式服务的框架,致力于提高性能和透明化rpc远程服务调用方案,以及soa服务治理方案。
确实懵,什么是soa呢,什么是rpc呢???
soa:面向服务的架构,将应用程序的不同功能单元(也叫作服务)通过服务之间的定义良好的接口和契约联系起来。
rpc:远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。
在dubbo+zookeeper中有三个重要的角色:
1. provider(服务提供者):在我们项目中可以粗糙地理解成实现类
2. Consumer(服务消费者):可以理解为调用服务(调用实现类)的类,类似于controller,当然如果集成rabbitmq也有可能是消息队列的类,也有可能是实现类调用实现类,所以实现类可以身兼数职,既可以是服务提供者也可以是服务调用者。
3. registry(zookeeper):也就是我们的注册中心,zookeeper是Apache下的产品。
没有用dubbo之前我们一般是controller调用service,service调用mapper(dao),但是现在加上了dubbo以后就是controller(当然不止controller,所有服务消费者都可以)通过向zookeeper订阅服务,service向zookeeper注册服务,通过zookeeper这个中介,把服务提供方的服务注入到服务消费者中。
调用流程
1. 服务容器负责启动,加载,运行服务提供者。
2. 服务提供者在启动时,向注册中心注册自己提供的服务。
3. 服务消费者在启动时,向注册中心订阅自己所需的服务。
4. 注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者。
5. 服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
6. 服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
理解不理解没关系来张图看下:
为什么需要dubbo?
单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
上述部分描述了互联网架构的演变,关键要素及dubbo存在的意义,可谓简约而不简单 官网地址
,在这里关于dubbo的介绍我就不再这里阐述了,官网有中文的说明而且很详细
上demo:
运行环境:JDK8,Maven 3.0+
技术栈:SpringBoot 2.2.6.RELEASE、Dubbo 1.0.0、ZooKeeper3.5.7、mybatis2.1.2(推荐使用MP)、mysql
编辑器:eclipse 4.15.0(已安装好STS)
提供者项目
1、提供者:
pom文件需引入的内容如下:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.2</version>
</dependency>
<!-- 整合dubbo -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 注意:dubbo强制内置log4J 如果没有则会报错 -->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
提供者的项目结构如下:
配置文件,此处使用的默认的application.properties类型的:
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
#dubbo 资源扫描文件
spring.dubbo.scan=cn.chfsun.server.service
server.port=8084
#数据库相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/orcl?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=root123
spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
mapper层:
业务逻辑实现层:
PS:到此提供者已经写好了,然后,然后使用mvn命令打包为jar文件,再启动服务,看着控制台愉快的跑起来…
等等!是不是报错了(如果没报错更好,但是可能吗,除非…):打包报错,启动也报错…什么鬼! 别慌,你的zookeeper服务启动了没?zookeeper是啥?这个还需要服务?
Zookeeper
本文刚开始已经提到了:…zookeeper这个中介,把服务提供方的服务注入到服务消费者中。
再来点:
zookeeper是开放源码的分布式应用程序协调服务,可以作为dubbo等服务的注册中心,也可以在分布式系统中实现分布式锁。
ZooKeeper的基本运转流程:
1、选举Leader。(选举leader可以参考
https://blog.csdn.net/gaoshan12345678910/article/details/67638657)2、同步数据。
3、选举Leader过程中算法有很多,但要达到的选举标准是一致的。
4、Leader要具有最高的执行ID,类似root权限。
5、集群中大多数的机器得到响应并接受选出的Leader。
zookeeper的四种状态:
LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态。
FOLLOWING:跟随者状态。表明当前服务器角色是Follower。
LEADING:领导者状态。表明当前服务器角色是Leader。
OBSERVING:观察者状态。表明当前服务器角色是Observer。
不是很理解没关系,先让它跑起来再说:
1、下载地址:
zookeeper:https://archive.apache.org/dist/zookeeper/
不是版本越高越好,稳定决定一切,我下载的是3.5.7的。点击进去,跳转到如下页面,选择标识的版本-------为啥?有坑啊!稍不注意就会…
注意: 从zookeeper-3.5.5开始,在下载zk时候 请下载apache-zookeeper-3.5.5 -bin .tar.gz
而不是apache-zookeeper-3.5.5.tar.gz:
不然启动时候会报
找不到或无法加载主类 org.apache.zookeeper.server.quorum.QuorumPeerMain
2、下载好了,解压缩到本地磁盘中,然后进入bin中,找到zkServer.cmd,双击打开就能运行,然后又…
如果不是这个错,那么你很悲催,还得解决其它的错误,最后还是会看到这个错误!!!
从错误中我们能大致知道是缺少初始化文件了。
解决方式很简单粗暴:
1.将conf目录下的zoo-sample.cfg复制下,改名为zoo.cfg,或者粗暴的修改conf目录下的zoo-sample.cfg重命名为zoo.cfg;
2.修改配置文件,如果不存在路径data和log,请先新建。(最好使用文本编辑器来修改配置)
启动:
打开bin文件夹,cmd进去执行:
保持doc窗口不要关闭,更不要鼠标点进去,否则你可以试下,看会怎么样。
回到eclipse中,启动提供者项目:
能看到红色的部分就说明提供者起作用名副其实了,别急,既然是提供者,是需要给消费者用的,就需要打包成一个starter。停止项目,项目右键先build path更改下
保存退出,然后继续项目右键–>Run As—>Maven clean/Maven install 或者使用mvn命令也可。
红色部分即为打包后的jar,如果没看到刷新下就可以了。此时已经写入了你的本地maven仓库中。
再启动项目,作为服务提供者。
继续再来个消费者:
2消费者项目:
创建方式同提供者项目,名字不一样就行,但是最好还是见名知意,符合规范。结构如下:
前文提起过:调用者可以直接调取提供者提供的服务,自身也可以是一个服务提供者,给其他调用者提供服务,此处只是调用,因此架构上不需要什么复杂的。
pom文件:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>cn.chfsun</groupId>
<artifactId>dubbo-serverorcl</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- 整合dubbo -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<!-- 注意:dubbo强制内置log4J 如果没有则会报错 -->
<!-- https://mvnrepository.com/artifact/log4j/log4j -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
PS:pom文件中需要引入之前打包好的服务提供者jar
如果不清楚怎么引入可查看服务提供者打包后的配置文件:
配置文件:
#防止服务消费者和提供者端口冲突(一致)
server.port=8085
## Dubbo 消费者
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://127.0.0.1:2181
spring.dubbo.scan=cn.chfsun.client.controller
#数据库相关配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/orcl?useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC
spring.datasource.username=root
spring.datasource.password=123456
控制层代码:
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.dubbo.config.annotation.Reference;
import cn.chfsun.server.service.DeptServie;
@RestController
public class DeptController {
@Reference(version = "1.0.0")
private DeptServie deptServie;
@GetMapping(value = "/list")
public Object list() {
return deptServie.queryList();
}
}
PS:@Reference(version = “1.0.0”)这个注解用的是dubbo提供的
然后启动消费者项目
能看到红色部分代表消费者搭建成功。
下面打开浏览器访问:http://localhost:7001/,在服务监控中切换到提供者标签,即可看到:
切换到消费者标签即可看到:
嗯?访问这个url看不到?你问怎么访问这个,搭建个服务监控就行了,走起!
Dubbo环境搭建-ZooKeeper注册中心
在上面搭建好ZooKeeper注册中心后,搭建管理控制台实现服务监控。
进入Dubbo官网,点击GIthub
http://dubbo.apache.org/zh-cn/
进入到Github页面后,一直往下找到dubbo-admin/dubbo-monitor
在此页面会看到dubbo-admin-server,但是没有dubbo-admin,这是因为此时的分支是develop,将分支切换为master
此时页面地址为:
https://github.com/apache/dubbo-admin/tree/master
在此页面可以看见其官方说明
下载后找到dubbo-admin-server/src/main/resources/application.properties
将要监控的Zookpeeper注册中心的地址修改,这里是本机。
然后回到dubbo-admin目录下,在此处打开命令行窗口,使用maven进行打包
mvn clean package
出现Build Success 则就打包成功
此时在目录下会生成target目录,在target目录下会有一个jar包
在运行jar包程序前将上面所讲的ZooKeeper的服务端与客户端运行
然后在target目录下打开命令行运行jar包
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
此时打开浏览器输入:
http://localhost:7001/
默认是7001端口,会提示输入账户密码,默认都是root
点击登录,不出意外就能看到上面所展示的页面
管理控制台的作用
禁止提供者
发送请求后:
后端控制台:
禁止消费者
执行后再去访问页面返回:
eclipse控制台:
再允许访问后,即可正常访问。
Dubbo与SpringCloud
如果非要比较一下两者的孰优孰劣,要根据实际应用场景来阐述。其实,这两者都是当下微服务典型的技术解决方案,可谓一时瑜亮,只不过在国内dubbo比较流行一些,原因其实很简单:
1. dubbo官方文档详细且有中文,而且运行原理技术解决方案描述比较透彻
2.国内的架构师有许多来自于阿里,对dubbo的推广起到了不可磨灭的作用
3.由于dubbo出现的较早,当然也开源。对于当时可谓轰动一时,各大公司争先使用,即使到现在谁也不愿意将原先的项目大刀阔斧的用新技术重构,代价要考虑。
相反,在国外的社区,dubbo的使用广度恐怕就远不及SpringCloud了。原因其实也很明了:就公司而言,dubbo出自于阿里,属于商业公司。我觉得阿里的框架肯定优先满足于自己的业务与利益。而springcloud出自于Spring的产品族,而其公司本身就是为了简化企业的开发模式,为各大企业所服务。因此他们的本身出发点就不同,个人觉得这个才是必要因素。
但是有几点需要在这里了解一下:
1. 就完成的功能而言:dubbo其实是SpringCloud组件中的一部分,也就相当于netflix中的eureka+小半个Hystrix+ribbon+feign。但是SpringCloud集成的诸如:链路跟踪,分布式配置,网关路由等,目前dubbo里还没有找到,也有可能我没有发现。因此在dubbo里需要使用这些功能,我们还要借助于第三方的实现。
2. dubbo是基于rpc实现远程调用,springcloud各个服务之间调用还是经过http,就性能而言是要弱于dubbo的,毕竟dubbo是经过阿里庞大的业务产品族和并发量考验的,不过这并不代表springcloud性能会很差
3. 常用的dubbo的技术使用方案还是基于spring,因此,我还是愿意把幕后英雄归功于spring
4. spring-cloud就相当于电脑的品牌机,拿来很方便的使用,因此它绝对是中小型公司(没有过多的精力和成本去搞基础研发)福音。而dubbo就好比是组装机,我们通过其已有的实现,完整的文档装配成我们自己想要的一套微服务方案。
总之,Dubbo 出生于阿里系,是阿里巴巴服务化治理的核心框架,并被广泛应用于中国各互联网公司;只需要通过 Spring 配置的方式即可完成服务化,对于应用无入侵,设计的目的还是服务于自身的业务为主。
虽然阿里内部原因 Dubbo 曾经一度暂停维护版本,但是框架本身的成熟度以及文档的完善程度,完全能满足各大互联网公司的业务需求。
如果我们使用配置中心、分布式跟踪这些内容都需要自己去集成,这样无形中增加了使用 Dubbo 的难度。
Spring Cloud 是大名鼎鼎的 Spring 家族的产品, 专注于企业级开源框架的研发。
Spring Cloud 自从发布到现在,仍然在不断的高速发展,几乎考虑了服务治理的方方面面,开发起来非常的便利和简单。
Dubbo 于 2017 年开始又重启维护,发布了更新后的 2.5.7 版本,而 Spring Cloud 更新的非常快,目前已经更新到 Finchley.M2。
因此,企业需要根据自身的研发水平和所处阶段选择合适的架构来解决业务问题,不管是 Dubbo 还是 Spring Cloud 都是实现微服务有效的工具。
微服务架构是互联网很热门的话题,是互联网技术发展的必然结果。它提倡将单一应用程序划分成一组小的服务,服务之间互相协调、互相配合,为用户提供最终价值。