1、分布式理论
什么是分布式系统?
在《分布式系统原理与泛型》一书中有如下定义,“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像个简单系统”
分布式系统是由一组通过网络进行通信。为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用廉价的,普通的机器完成单个计算机无法完成的计算,存储任务。起目的是利用更多的机器,处理更多的数据、
dubbo文档
随着物联网的发展,网站应用的规模不断扩大,常规的垂直应用框架已经无法应对。分布式服务架构以及流动计算架构势在必行,
什么是dubbo?
Apache dubbo是一款高性能,轻量级的开源 Java RPC框架,它提供了三大核心能力,面向接口的远程方法使用,智能容错和负载均衡,以及服务自动注册和发现。
运行原理图:
- Provider(服务提供者):暴露服务的服务提供方,服务提供者在启动时,想注册中心注册自己需要的服务。
- Consumer(服务消费者):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己需要的服务,服务消费者,从服务提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
- Registry(注册中心):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长链接推送变更数据给消费者
- Monitor(监控中心):消费服务者和消费提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心。
通信Http和RPC
Http和RPC都是基于网络的通信协议
RPC【Remote Procedure Call】指远程过程调用,是一种进程间通信方式,而不是一种规范。
zookeeper
zookeeper是一个分布式的开放源码的分布式应用程序协调服务。
2、安装
zookeeper安装
https://www.apache.org/dyn/closer.lua/zookeeper/zookeeper-3.6.2/apache-zookeeper-3.6.2-bin.tar.gz
在config文件下在复制zoo_sample.cfg
更名为zoo.cfg
进bin文件下运行zkServer.cmd
运行服务,运行zkCli.cmd
执行
可能出现闪退,用记事本打开添加 pause
暂停
dubbo安装
gitHub下载地址:https://github.com/apache/dubbo-admin/tree/master
在目录dubbo-admin-master
下执行打包命令dubbo-admin
mvn clean package -Dmaven.test.skip=true
生成dubbo/target
下生成jar包dubbo-admin-0.0.1-SNAPSHOT.jar
开启zookeeper服务运行此jar包可访问localhost:7001
,
默认账号:root,密码:root。
3、运行测试
1、创建环境
-
创建Empty Project空项目
-
新建模块【SpringBoot项目】
- 消费者【consumer-server】
- 提供者【provider-server】
-
在提供者【provider-server】中创建服务
public interface TicketService { public String getTicket(); }
-
在消费者【consumer-server】创建业务
public class UserService {}
2、运行zookeeper和dubbo
- 打开
apache-zookeeper-3.6.2-bin
运行zkServer.cmd
开启zookeeper
服务 - 运行
dubbo-admin
的jar包(用管理员身份运行) - 打开注册中心
localhost:7001
默认用户名和密码:root
3、配置服务
无论提供者【provider-server】还是 消费者【consumer-server】后需要导入相同的jar包依赖
<!-- dubbo Spring Boot Starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.github.sgroschupf/zkclient -->
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<!-- 引入zookeeper -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.12.0</version>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.14</version>
<!--排除这个slf4j-log4j12-->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
-
提供者【provider-server】
-
实现服务接口
import org.apache.dubbo.config.annotation.Service; import org.springframework.stereotype.Component; @Service //将服务发布出去 @Component //放在容器中 public class TicketServiceImpl implements TicketService { @Override public String getTicket() { return "Aaron in leaning"; } }
注意:用@Service将服务发不出去,这里的@Service是dubbo包下的依赖。为了避免错误所以这里用
@Component
注解装配Spring。 -
编写配置,创建
application.yaml
配置文件server: port: 8001 dubbo: # 设置服务名 application: name: provider-server # 设置注册中心地址 registry: address: zookeeper://127.0.0.1:2181 # 设置要提供服务的扫描包 scan: base-packages: com.aaron.service
-
-
消费者【consumer-server】
-
创建与提供者的服务相同的文件,地址也必须相同。(因为本地没有此服务,所以要创建空的假象)
public interface TicketService { public String getTicket(); }
-
在
UserService
里自动导入服务@Reference TicketService ticketService; public void byTicket(){ String ticket = ticketService.getTicket(); System.out.println("在注册中心拿到票"+ticket); }
-
编写配置,创建新的yaml文件也可。在properties文件写也可。
# 应用服务 WEB 访问端口 server.port=8002 # 服务名字 dubbo.application.name=provider-server # 注册中心地址 dubbo.registry.address=zookeeper://127.0.0.1:2181
注意:这里是消费者的配置,所以不需要指定要提供服务的扫描包!
-
-
依次运行提供者和消费者服务,查看注册中心的变化。