在本章节你能够学习到:前端
分布式系统(distributed system)是创建在网络之上的软件系统。正是由于软件的特性,因此分布式系统具备高度的内聚性和透明性。所以,网络和分布式系统之间的区别更多的在于高层软件(特别是操做系统),而不是硬件。java
在分布式系统中,国内经常使用zookeeper+dubbo组合,而Spring Boot推荐使用全栈的Spring,Spring Boot+Spring Cloud。linux
分布式系统能够用下图直观的表示git
分布式系统是若干独立计算机的集合,这计算机对用户来讲就像单个相关系统。github
当网站流量很小时,只需一个应用,将全部功能都部署在一块儿,以减小部署节点和成本。此时,用于简化增删改查工做量的数据访问框架(ORM)是关键。web
当访问量逐渐增大,单一应用增长机器带来的加速度愈来愈小,将应用拆成互不相干的几个应用,以提高效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。spring
当垂直应用愈来愈多,应用之间交互不可避免,将核心业务抽取出来,做为独立的服务,逐渐造成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提升业务复用及整合的分布式服务框架(RPC)是关键。docker
当服务愈来愈多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增长一个调度中心基于访问压力实时管理集群容量,提升集群利用率。此时,用于提升机器利用率的资源调度和治理中心(SOA)是关键。apache
ZooKeeper 是一个分布式的,开放源码的分布式应用程序协调服务。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、域名服务、分布式同步、组服务等。服务器
Dubbo是Alibaba开源的分布式服务框架,它最大的特色是按照分层的方式来架构,使用这种方式可使各个层之间解耦合(或者最大限度地松耦合)。从服务模型的角度来看,Dubbo采用的是一种很是简单的模型,要么是提供方提供服务,要么是消费方消费服务,因此基于这一点能够抽象出服务提供方(Provider)和服务消费方(Consumer)两个角色。
docker pull zookeeper
docker run --name zk01 -p 2181:2181 --restart always -d d6f23d89fbee
d6f23d89fbee是zookeeper的镜像ID,经过docker images查看你本身的镜像id。
注册应用的过程大体以下:
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.5</version> </dependency> <!-- Spring Context Extras --> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency>
注意,zkclient请根据zookeeper版本进行适配,当前有0.11版本,但我使用以后常常会出现链接中断的状况,即
connnectionLoss
,若是您也遇到相似的问题,不妨换0.10版本的zkclient.
curator-framework是高版本的dubbo须要的一个依赖。
# 当前应用的名字 dubbo.application.name=provider-ticket # 注册中心的地址 dubbo.registry.address=zookeeper://10.21.1.47:2181 # 哪一个包 dubbo.scan.base-packages=com.zhaoyi.providerticket.service
dubbo也提供了默认的注册服务,咱们这样作会覆盖到默认的服务,详情参考github官方文档。
// 接口类 package com.zhaoyi.providerticket.service; public interface TicketService { public String getTicket(); }
// 服务类 package com.zhaoyi.providerticket.service; import com.alibaba.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Service @Component // 将服务发布出去 public class TicketServiceImpl implements TicketService { @Override public String getTicket(){ return "《sword art online!》"; } }
注意此处的
@service
是dubbo包的注解,而不是spring的。
<dependency> <groupId>org.apache.curator</groupId> <artifactId>curator-framework</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>com.alibaba.boot</groupId> <artifactId>dubbo-spring-boot-starter</artifactId> <version>0.2.1-SNAPSHOT</version> </dependency> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> <!-- Dubbo --> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>2.6.5</version> </dependency> <!-- Spring Context Extras --> <dependency> <groupId>com.alibaba.spring</groupId> <artifactId>spring-context-support</artifactId> <version>1.0.2</version> </dependency> <!-- https://mvnrepository.com/artifact/com.101tec/zkclient --> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>0.10</version> </dependency> <!-- 引入服务类坐标 --> <dependency> <groupId>com.zhaoyi</groupId> <artifactId>provider-ticket</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency>
相信您学过maven 的相关知识,这两个模块的公共部分你也能够抽取到parent中编写。
这里,咱们引入provider的坐标,这样就能够直接使用其服务类提供的便利了。
dubbo.application.name=consumer-user dubbo.registry.address=zookeeper://10.21.1.47:2181
package com.zhaoyi.consumeruser.service; import com.alibaba.dubbo.config.annotation.Reference; import com.zhaoyi.providerticket.service.TicketService; import org.springframework.stereotype.Service; @Service public class UserService { @Reference TicketService ticketService; public String buy(){ return ticketService.getTicket(); } }
Reference不作任何配置的状况下,引用的是对应类路径下的服务信息。
接下来咱们编写一个controller,可视化咱们的服务返回结果
package com.zhaoyi.consumeruser.controller; import com.zhaoyi.consumeruser.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class HelloController { @Autowired UserService userService; @GetMapping("/") public String a(){ return userService.buy(); } }
启动消费者服务,请确保provicer项目目前处于运行状态,访问首页,咱们即可以看到返回
《sword art online!》
注册成功!
不少状况下,咱们须要查看咱们提供的服务到底有哪些。好比在以前的测试用例中,除了经过查看控制台日志,咱们根本没法获知注册中心是否已经知晓或者正确的注册了provicer提供的服务。
显然须要一个可视化服务让咱们能够直观的看到具体的服务信息是什么、怎么调用以及其调用日志等等。
市面上仍是提供了很多的相关开源服务,咱们来看看最简单易用的zkclient。
安装zkclient很简单,他其实就是一个监听zookeeper服务端口的一个网站项目。下面列出linux的安装步骤,在执行安装以前,确保你的Linux服务器上安装了git以及maven服务。
git clone https://github.com/DeemOpen/zkui.git
mvn clean install
cp config.cfg target/
vi config.cfg
nohup java -jar zkui-2.0-SNAPSHOT-jar-with-dependencies.jar > /dev/null &
相比较dubbo-admin,zkclient作的就比较简陋了。dubbo-admin在dubbo 2.6版本之后再也不支持,当前已经更名为Dubbo ops。
Dubbo ops应该是dubbo-admin的后浪项目,咱们来看看其安装方式。
git clone https://github.com/apache/incubator-dubbo-ops.git
mvn clean install
该项目须要maven 3.1以上才能够编译成功。
mvn --projects dubbo-admin-backend spring-boot:run