什么是分布式框架
分布式系统是若干独立系统的集合,但是用户用起来好像是在使用一个系统
必要性
规模的逐步夸大和业务的复杂,
架构演变
-
单一架构,管理系统
-
垂直应用架构,大业务拆分成小业务
-
分布式架构,基于RPC:远程过程调用
Dubbo
Dubbo,是一个高性能的RPC框架,解决了分布式中的调度问题
性能高
是一个RPC框架,主要是远程过程调用,提升性能从最关键,最耗时的两个方面:序列化和网络通信
序列化:本地对象要在网络上进行传输,必须实现Serializable接口,也就是必须序列化,例如xml,json,二进制流…其中二进制流效率最高。Dubbo就是采用二进制
网络通信:不同于HTTP需要进行三次握手和四次挥手,Dubbo采用Socket通信机制,一步到位,提高了通信效率,并且可以建立长连接,不用反复链接。
dubbo概述
高性能 轻量级 开源的面向接口代理的RPC框架
三大核心功能:面向接口的远程方法调用,智能容错和负载均衡,以及服务的自动注册和发现
Dubbo是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,服务治理方案
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-B8ZgALJW-1622032572313)(D:\电子文件\java\ty-md\myMd\Picture\dubbo框架.png)]
服务提供者(Provider):暴漏服务的服务提供方
服务消费方(Consumer):调用远程服务的服务消费方
注册中心(Registry):注册中心返回服务提供者地址列表给消费者,若果变更,注册中心将基于长连接推送变更数据给消费者
监控中心(Monitor):服务消费者和服务提供者,在内存中累计调用的次数和调用的时间,定时每分钟发送一次统计数据到监控中心
支持的协议
dubbo、hessian、rmi、webservice、http、thrift、memcached、redis(在4中)
dubbo官方推荐使用dubbo协议。默认端口是20880
直连方式
provider
1.创建一个maven web工程;服务的提供者
2.创建一个实体bean查询的结果
3.提供一个服务接口:xxx
4.实现这个服务接口:xxx.impl
5.配置dubbo服务提供者的核心配置文件
a.声明dubbo服务提供者的核心名称:保证唯一
b.声明dubbo使用的协议和端口号
c.暴露服务,使用直连方式
6.添加监听器
//web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:dubbo-userservice-provide.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
</web-app>
dubbo.xml
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!--服务提供者声明名称:必须保证服务名称的唯一性,它的名称是dubbo内部使用的唯一标识-->
<dubbo:application name="001-link-userservice-provider"/>
<!--访问服务协议的名称及端口号,dubbo官方推荐使用dubbo协议,端口号默认20880-->
<dubbo:protocol name="dubbo" port="20880"/>
<!--
暴漏接口
interface:暴漏服务接口的全限定类名
ref:接口引用的实现类在spring中的标识
registry:如果不使用注册中心就是N/A
-->
<dubbo:service interface="com.zhang.dubbo.service.UserService" ref ="userService" registry="N/A"/>
<!--将接口的实现类加载到spring容器中-->
<bean id="userService" class="com.zhang.dubbo.service.UserServiceImpl"/>
</beans>
注意实体类的序列化
consumer
流程 双击两下ctrl
1.创建一个maven web工程:服务的消费者
2.配置pom,添加依赖
3.设置dubbo的核心配置文件
4.编写control
5.配置中央调度器(servlet :DispatcherServlet)
直连会把一个项目打包到另外一个项目,有可能直接new实现类的情况
因此
-
dubbo官方推荐必须有一个接口工程,他就是一个maven java工程
-
要求接口工程里存放到内容如下
-
- 对外暴漏的服务接口(service接口)
- 实体bean对象
dubbo-consumer.xml
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<!-- 声明服务消费者的名称:保证唯一-->
<dubbo:application name="002-link-consumers"/>
<!--
引用远程服务接口:
id:远程服务对象接口的名称
interface:调用远程接口的全限定名称
registry:不使用注册中心为N/A
-->
<dubbo:reference id="userService"
interface="com.zhang.dubbo.service.UserService"
url="dubbo://localhost:20880"
registry="N/A"/>
</beans>
在消费者中消费提供者的服务,所以需要control,也需要视图解析器,
dubbo服务化最佳实践
分包
建议将服务接口、服务模型等均放到公共包
粒度
- 服务接口尽可能大,每个服务应代表一个功能,而不是一个标准
- 服务接口建议以业务场景进行划分,并对相进业务进行抽象,防止数量爆炸
- 不建议使用过于抽象的通用接口,如:Map,没有清晰的语义,后期维护不方便
版本
每个接口都应定义版本号,区分同一接口的不同实现
接口工程
将服务接口放到一个项目中,provider实现接口提供服务,consumer根据接口订阅服务,这样不需要进行打包,只需要将接口工程依赖添加到两个项目中。3-4-5
dubbo常用标签
公共标签
<dubbo:application name=""/> //配置应用信息
<dubbo:registry address="ip:port" protocol="协议"/> // 配置注册中心
服务提供者标签
配置暴露的服务
<dubbo:service interface="服务接口名字" ref="服务实现对象" bean/>
服务消费者
服务消费者引用远程的服务
<dubbo:reference id="服务引用的bean的id" interface="服务接口名" />
注册中心-zookeeper
注册中心类型
Multicast注册中心:组播方式
Redis注册中心:使用Redis作为注册中心
Simple注册中心:一个dubbo服务。作为注册中心,提供查找服务的功能
(推荐)Zookeeper注册中心:使用Zookeeper作为注册中心
Hadpod的一个子项目,是一个树形的目录服务,支持变更推送,
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4OzpaO50-1622032572315)(Picture/zookeeper.png)]
alt+1 可以打开文件 (021)
需要一个接口工程作为注册中心
zk-interface
还有消费者和提供者
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.16.RELEASE</version>
</dependency>
<!--dubbo-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
</dependency>
<!-- 接口工程-->
<dependency>
<groupId>com.zhang.dubbo</groupId>
<artifactId>006-zk-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<!-- zookeeper-->
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>4.1.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!--JDK1.8编译插件-->
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
</plugins>
</build>
提供者配置
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="007-zk-userservice-prvider"/>
<dubbo:protocol name="dubbo" port="20880"/>
<!-- <dubbo:service interface="com.zhang.dubbo.service.UserService" ref="" registry=""/>-->
<!-- 使用注册中心和端口号-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- 暴漏服务接口-->
<dubbo:service interface="com.zhang.dubbo.service.UserService" ref="userServiceImpl"/>
<!-- 加载实现类-->
<bean id="userServiceImpl" class="com.zhang.dubbo.service.impl.UserServiceImpl"/>
</beans>
消费者配置
<?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://dubbo.apache.org/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://dubbo.apache.org/schema/dubbo http://dubbo.apache.org/schema/dubbo/dubbo.xsd">
<dubbo:application name="008-zk-consumer"/>
<!-- 指定注册中心-->
<dubbo:registry address="zookeeper://localhost:2181"/>
<!-- -->
<dubbo:reference id="userService" interface="com.zhang.dubbo.service.UserService"/>
</beans>
注意要在web.xml配置中央处理器,DispatcherServlet
消费者还需要多配置一个mvc 视图解析器