什么是分布式系统?
建立在网络之上的软件系统,是若干个独立的计算机的集合,但是对用户来说,就像单个系统一样。可以利用更多的机器,处理更多的数据
注意:只有当单个节点不够用的时候,才需要考虑分布式
Dubbo文档
官网:入门文档 | Apache Dubbo
什么是Dubbo?一个 RPC 框架,支持多种语言
单一应用架构:
①所有功能部署在一起,适合小型网站
②缺点:难扩展、不利于协同开发和升级维护
垂直应用架构:
①将一个大应用拆成几个互不相干的小应用,来提升效率。核心是MVC
②缺点:公共模块无法重复利用
分布式服务架构:
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务。核心是RPC(分布式服务框架)
流动计算架构:
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)[ Service Oriented Architecture]是关键。
什么是RPC?
RPC(Remote Procedure Call 远程过程调用)是一种通信方式。举例:同一台电脑上,a()方法调b()方法,叫本地过程调用。这台电脑上的a()方法,调另一台电脑上的b()方法,叫远程过程调用。
RPC核心:通讯、序列化
Dubbo详解
服务提供者(Provider):暴露服务的服务提供方,服务提供者在启动时,向注册中心注册自己提供的服务。
服务消费者(Consumer):调用远程服务的服务消费方,服务消费者在启动时,向注册中心订阅自己所需的服务,服务消费者,从提供者地址列表中,基于软负载均衡算法,选一台提供者进行调用,如果调用失败,再选另一台调用。
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,如果有变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和提供者,在内存中累计调用次数和调用时间,定时每分钟发送一次统计数据到监控中心
安装zookeeper
什么是zookeeper?一个注册中心(服务注册与发现)
下载地址:http://mirror.bit.edu.cn/apache/zookeeper/zookeeper-3.5.10/
1、下载那个带bin的压缩包
2、解压之后,在conf目录下,复制zoo_sample.cfg,粘贴到当前目录,并重命名为zoo.cfg
3、双击运行bin目录下的zkCli.cmd测试
create -e /qiu 1234 //创建一个节点/qiu的值为1234
get /qiu //获取/qiu这个节点的值
安装Dubbo
下载地址:GitHub - apache/dubbo-admin at master
1、选择master-0.2.0下载
2、在dubbo-admin-master-0.2.0目录下,运行cmd
mvn clean package -Dmaven.test.skip=true
运行之后,在dubbo-admin\target目录下会有一个dubbo的jar包
3、运行zookeeper
4、在dubbo-admin\target目录下,使用cmd运行dubbo
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
5、在浏览器访问http://localhost:7001/ 初始用户名为root,密码也为root
登录成功后,长这样:
SpringBoot整合Dubbo和Zookeeper
一、搭建框架
1、创建一个空的工程
2、创建一个叫provider-server的module(springboot 2.7.8+web依赖)
3、编写service
①service接口
public interface TicketService {
public String getTicket();
}
②service实现类
public class TicketServiceImpl implements TicketService{
@Override
public String getTicket() {
return "《丘丘说Java》";
}
}
4、再创建一个叫consumer-server的module(springboot 2.7.8+web依赖)
5、编写一个service
public class UserService {
//想拿到provider提供的票
}
6、更改他们的端口号
思考:这是2个不同的application,怎么样才能在consumer里面,拿到provider提供的票?
解决方式:将服务提供者注册到注册中心,在让服务消费者去注册中心消费
二、服务提供者
1、导入依赖
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.22</version>
</dependency>
<!--zookeeper-->
<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>
2、配置application.properties
#服务应用名字
dubbo.application.name=provider-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
#哪些服务要被注册
dubbo.scan.base-packages=com.service
3、在service实现类中加上dubbo的注解,然后dubbo就会扫描指定包(com.service)下,带有@Service注解的服务,将它发布在指定的注册中心(zookeeper://127.0.0.1:2181)
4、启动ProviderService主启动类
5、启动zookeeper
6、启动dubbo:在dubbo的dubbo-admin\target目录下,运行cmd
java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
7、在浏览器访问
三、服务消费者
1、导入依赖(和provider的依赖一样)
<!--dubbo-->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.22</version>
</dependency>
<!--zookeeper-->
<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>
2、配置application.properties
#消费者去哪里拿服务需要暴露自己的名字
dubbo.application.name=consumer-server
#注册中心地址
dubbo.registry.address=zookeeper://127.0.0.1:2181
3、把provider的 TicketService 接口,复制到consumer
4、 继续编写service
import org.apache.dubbo.config.annotation.Reference;
@Component
public class UserService {
//想拿到provider提供的票,需要去注册中心拿到服务
@Reference //引用,
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.getTicket();
System.out.println("在注册中心拿到的 ------> " + ticket);
}
}
5、编写测试类
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
6、运行测试类(前提:zookeeper服务已开启)