分布式理论
《分布式系统原理与范型》中如下定义:“分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个相关系统”;
分布式系统是由一组通过网络进行通信,为了完成共同的任务而协调工作的计算机节点组成的系统。分布式系统的出现是为了用链家的普通的机器完成单个计算机无法完成的计算、存储任务。其目的是利用更多的机器,处理更多的数据
Dubbo文档
本文介绍了网站应用的演进
随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。
单一应用架构
当网站流量很小时,只需一个应用,将所有功能都部署在一起,以减少部署节点和成本。此时,用于简化增删改查工作量的数据访问框架(ORM)是关键。
垂直应用架构
当访问量逐渐增大,单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
分布式服务架构
当垂直应用越来越多,应用之间交互不可避免,将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
流动计算架构
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
Rpc
详细了解:https://www.jianshu.com/p/acaa93191c8f
Rpc两个核心模块:通讯,序列化。
Zookeeper
1.下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.6.1/apache-zookeeper-3.6.1-bin.tar.gz
我们下载的是3.6.1的版本
2.运行/bin/zkServer.cmd,初次运行会报错(闪退),我们可以编辑一下这个文件,加上pause来暂停命令,获取错误信息
所以我们从conf目录下面复制一份 zoo_sample.cfg 改名为zoo.cfg来修改就行
测试:
首先运行 zkServer.cmd 然后运行 zkCli.cmd
使用 ls / :查看根目录下的所有节点
create -e /suxunan 123 :根目录下创建节点,值为123
get /suxunan :获取根目录下的suxunan节点
安装dubbo-admin(监控后台)
1.下载地址:https://github.com/apache/dubbo-admin
2.解压文件
3.在项目目录下打包 dubbo-admin
mvn clean package -Dmaven.test.skip=true
第一次打包的过程有点慢,需要耐心等待!
然后到F:\dubbo-admin-master\dubbo-admin-master\dubbo-admin的target运行jar包
注意:运行jar包需要打开zookeeper服务,否则会一直连接
我们可以在src/resource的配置文件中可以查看到配置信息
可以看到服务端口为7001
用户信息等(root用户的密码为root,guest的密码为guest)
然后我们可以在浏览器访问http://localhost:7001
dubbo-admin是一个监控后台查看我们注册了那些服务,那些服务被消费了
dubbo+zookeeper集成到SpringBoot
首先我们创建一个空的Java项目,删除原有模块
然后新建两个模块(模块选择SpringBoot项目创建)
一个provider-server(服务提供者)
一个consumer-server(服务消费者)
导入依赖
<!--导入依赖 Dubbo+zookeeper-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</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 日志会和 SpringBoot 冲突-->
<!--还有 zookeeper 所需要的的依赖-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<!--排除这个 slf4j-log4j12 -->
<!--排除这个 slf4j-log4j12 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
然后按照套路,主应用上面添加注解@EnableXXX
表示启用某项功能@EnableDubbo
@SpringBootApplication
@EnableDubbo//启用注册中心
public class ProviderServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProviderServerApplication.class, args);
}
}
然后创建一个接口,并且暴露出去
@Service//注册到Spring容器
@DubboService//标注该注解表示暴露该接口(旧版本中@Service注解已废弃)
public class TicketServiceImpl implements TicketService{
@Override
public String ticket() {
return "分布式学习";
}
}
然后我们需要简单的配置
server:
port: 8081
#提供服务者的名字
dubbo:
application:
name: provider-server
#注册中心的地址
registry:
address: zookeeper://127.0.0.1:2181
#扫描要暴露的包
scan:
base-packages: com.suxunan.service
这样简单的服务提供者就完成了,我们可以使用上面的dubbo-admin查看注册信息
首先打开运行ZKServer.cmd 然后运行我们打包好监控后台的jar
可以看到我们后台监控到的暴露的接口信息
消费者
服务提供者提供了服务,我们就需要消费
首先还是导入依赖
<!--导入依赖 Dubbo+zookeeper-->
<!-- https://mvnrepository.com/artifact/org.apache.dubbo/dubbo-spring-boot-starter -->
<dependency>
<groupId>org.apache.dubbo</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.7.8</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 日志会和 SpringBoot 冲突-->
<!--引入 zookeeper 还有所需要的的依赖-->
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.curator/curator-framework -->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>5.1.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.6.2</version>
<!--排除这个 slf4j-log4j12 -->
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
</exclusions>
</dependency>
然后还是启动器主类标注启用dubbo服务@EnableDubbo
然后创建一个测试类来引入服务中心注册拿到的服务
@Service //放到容器中
public class UserService {
//想拿到provider-server提供的飘,要去注册中心获取服务
@DubboReference //引用, 方式一: Pom坐标 ,方式二: 可以定义路径相同的接口名(旧版本中@Reference注解已经废弃)
TicketService ticketService;
public void buyTicket(){
String ticket = ticketService.ticket();
System.out.println("从注册中心拿到==>" + ticket);
}
}
注意:引用服务的两个方式一个是Pom坐标,另一个是定义路径相同的接口名
所以我们需要定义跟服务提供者路径相同的接口名
@Service
public interface TicketService {
String ticket();
}
然后去配置dubbo相关信息
server:
port: 8082
#从注册中心获取服务需要名字
dubbo:
application:
name: consumer-server
#注册中心地址
registry:
address: zookeeper://127.0.0.1:2181
然后可以测试了
@SpringBootTest
class ConsumerServerApplicationTests {
@Autowired
UserService userService;
@Test
void contextLoads() {
userService.buyTicket();
}
}
注意
- 上述服务的前提是zookeeper已启用
- 我们远程引用使用@Reference的方式路径是接口名一致,如果不一致,则报错