什么是分布式系统
分布式系统是若干独立计算机的集合,这些计算机对于用户来说就像单个单个相关系统
随着互联网的发展,网站应用的规模不断的扩大,常规的垂直应用框架已无法应对,分布式服务架构以及流动计算机架构势在必行,需要一个治理系统确保架构有条不紊的演进
单一应用框架
请求量小
缺点:扩展不容易,协同开发不易,不利于维护。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DcdPq2bF-1643252170544)(C:\Users\GJX\Desktop\IMG_9781.PNG)]
垂直应用架构
优点:分工合作容易,性能扩展容易
缺点:界面和业务逻辑没有分开,应用不能完全独立,大量应用之间需要交互
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lkpx2mBW-1643252170545)(C:\Users\GJX\Desktop\IMG_9780.PNG)]
分布式架构
将界面和业务逻辑分离(RPC:远程过程调用)
优点:当只改变界面时,只需要重新部署,用户web的服务器
一个好的分布式框架帮我们来解决RPC,能极大的简化开发
流动计算架构:基于访问压力实时的管理集群的容量,提高集群的利用率
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wVVOXWLG-1643252170546)(C:\Users\GJX\Desktop\IMG_9783.PNG)]
RPC
什么是RPC?
(Remote Procedure Call)是指远程过程调用,他是一种技术思想,而不是规范。他允许程序调用另一个地址空间(通常是共享网络的另一台计算机)的过程和函数,不是程序员显示编码这个远程调用的细节。既程序员无论是调用本地的还是远程的函数,本质上编写的代码调用基本相同;
RPC框架:
dubbo ,gRPC,Thrift,HSF(High Speed Service Framework)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gNpLLzdu-1643252170546)(C:\Users\GJX\Desktop\IMG_9784.PNG)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-r6ycUqUP-1643252170547)(C:\Users\GJX\Desktop\IMG_9785.PNG)]
dubbo支持的协议:
dubbo ,hessian,mi,http,webservice,thrift,memcached,redis,dubbo官方推荐使用dubbo协议。dubbo默认端口是20880.
使用dubbo协议,在spring配置文件中加入
<dubbo:protocol name="duboo" port="20880">
dubbo官方推荐使用的项目结构如下:
1)服务提供者工程(实现接口工程中的业务接口)web工程
2)服务消费者工程(消费服务提供者提供的业务接口)web工程
3)接口工程(业务接口和实现类)java工程
注册中心Zookeeper
对于服务提供方,它需要发布服务,而且由于应用系统的复杂性,服务的数量,类型也不断的膨胀;对于消防服务方,,他最关心的如何获取到他所需的服务,而面对复杂的应用系统,需要管理大量的服务调用。
而且,对于服务的提供方和服务的消费者方来说,他们还有可能兼具这两种角色,即需要提供服务,又需要消费服务。通过将服务统一管理起来,可以有效地优化内部应用对服务发布/使用的流程和管理。服务注册中心可以通过特定协议来完成服务对外的统一。Dubbo提供的注册中心有如下几种类型:
Multicast注册中心:组播方式
Redis注册中心:使用Redis作为注册中心
Simple注册中心:就是一个dubbo服务,作为注册中心,提供查找服务的功能。
Zookeeper注册中心:使用Zookeeper作为注册中心(推荐使用)
注册中心工作方式
服务提供者向注册中心注册服务
消费者在注册中心取这个服务
Zookeeper是一个高性能的:分布式,开发源码的分布式应用程序协调服务。简称zk。Zookeeper是翻译过来的动物管理员,可以理解为Windows中的资源管理器或者注册表。是一个树形结构,这种树形结构和标准文件相似。Zookeeper树中的每个节点被称为znode,和文件系统的目录树一样,Zookeeper树中的每个节点可以拥有字节点,每个节点表示一个唯一服务资源。Zookeeper运行需要java环境。
下载安装文件
官网下载地址:http://zookeeper.apache.org
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lAsKNV8f-1643252170548)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20211203112154600.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-v6MoPiyH-1643252170548)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20211203112225443.png)]
Dubbo配置原则
在服务提供者配置访问参数。因为服务提供者更了解服务的各种参数。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--声明服务提供者名称-->
<dubbo:application name="zookeeperprovider"/>
<!-- 指定协议,和端口号-->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 指定注册中心地址-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 暴露服务-->
<dubbo:service interface="com.gjx.dubbo.service.SomeService" ref="someServiceImpl" timeout="35000" />
<!-- 加载接口实现类-->
<bean id="someServiceImpl" class="com.gjx.dubbo.service.impl.SomeServiceImpl"/>
</beans>
服务提供者对服务的复杂程度更了解,能更确定超时的时间
关闭检查
dubbo缺省会在启动时检查依赖的服务是否可用,不可用时会抛出异常,阻止Spring初始化完成,以便上线时,能及时的发现问题,默认check=true。通过check=“false”关闭检查,
比如:测试时,有些服务不关心,或者出现循环依赖,必须有一方先启动。
例如:关闭某个服务的启动时检查
<dubbo:reference interface="com.foo.BarService" check="false"/>
例2:关闭注册中心启动检查时
<dubbo:registry check="false"/>
默认启动服务时检查注册中心存在并已运行,注册中心不启动会报错
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!--声明服务消费者名称-->
<dubbo:application name="zookeeperconsumer"/>
<!-- 指定注册中心-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 引用远程接口服务-->
<dubbo:reference id="someService" interface="com.gjx.dubbo.service.SomeService" check="false" />///
</beans>
重试次数(没用)
消费者访问提供者,如果访问失败,则切换重试访问其他服务器,但重试会带来更长的延迟。访问的时间变长,用户体验较差,多次访问重新访问服务器有可能访问成功,可通过reteries=“2” 来设置重试次数
<dubbo:service retries="2"/>
或者
<dubbo:reference retries="2"/>
通常不设置
超时时间
由于网络或服务端不可靠,会导致调用出现一种不确定的中间状态(超时),为了避免超时导致客户端资源(线程)挂起耗尽,必须设置超时时间,
timeout:调用远程服务超时时间(毫秒)
版本号(工作中肯定会使用到的)
每个接口都应该定义一个版本号,为后续不兼容升级提供可能。当一个接口有不同的实现,项目早期使用的一个实现类,之后创建接口的新的实现类。区分不同的接口实现使用version。
一个接口可以有多个实现类
provide:
<!-- 暴露服务-->
<dubbo:service interface="com.gjx.dubbo.service.SomeService" ref="someServiceImpl" timeout="35000" version="1.0" />
<dubbo:service interface="com.gjx.dubbo.service.SomeService" ref="newSomeServiceImpl" timeout="35000" version="2.0"/>
consumer:
<!-- 引用远程接口服务-->
<dubbo:reference id="someService" interface="com.gjx.dubbo.service.SomeService" check="false" version="1.0"/>
<dubbo:reference id="newsomeService" interface="com.gjx.dubbo.service.SomeService" check="false" version="2.0"/>
controller:
@Controller
public class SomeController {
@Autowired
private SomeService someService;
@Autowired
private SomeService newsomeService;
@RequestMapping(value = "/hello1")
public String hello1(Model model){
String hello = someService.hello();
model.addAttribute("hello",hello);
return "hello";
}
@RequestMapping(value = "/hello2")
public String hello2(Model model){
String hello = newsomeService.hello();
model.addAttribute("hello",hello);
return "hello";
}
@RequestMapping(value = "/user1")
public String user1(Model model){
User user = someService.queryUserById(3);
model.addAttribute("user",user);
return "user";
}
@RequestMapping(value = "/user2")
public String user2(Model model){
User user = newsomeService.queryUserById(3);
model.addAttribute("user",user);
return "user";
}
}
监控中心
什么是监控中心
dubbo的使用,只需要有注册中心,消费者,提供者,这是三个就可以使用了,但是并不能看到那些消费者和提供者,为了更好的调试,发现问题,解决问题,因此引入dubbo-admin。通过dubbo-admin可以对消费者和提供者进行管理,可以在dubbo应用部署动态调整,服务的管理。
dubbo-admin
图形化的服务管理页面:安装时需要指定注册中心地址即可,就可从注册中心获取到所有的提供者/消费者进行配置管理
下载地址:https://github.com/apache/incubator-dubbo-ops
需要手工编译才能使用
执行:到dubbo-admin-0.0.1-SNAPSHOT.jar目录cmd执行 java -jar dubbo-admin-0.0.1-SNAPSHOT.jar
到浏览器:输入http://localhost:7001访问监控中心-控制台
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-n9sM1NKX-1643252170549)(C:\Users\GJX\AppData\Roaming\Typora\typora-user-images\image-20211204162833752.png)]