关于Dubbo的一些个人心得

这里写自定义目录标题

  • 微服务前提
    • 分布式微服务的技术使用
    • Dubbo和SpringCloud的简单比较
    • Dubbo的工作原理
    • Dubbo的工作流程
    • 基本知识容器(有点乱,后面找时间修改)
    • 基于SpringBoot的Dubbo搭建
    • Dubb的三个配置方法

微服务前提

根据互联网信息技术的发展,业务越来越多,一个项目或者系统的单体框架过于 臃肿,模块之间的关系过于密切,处于 维护成本和 运行效率的考虑,进行 解耦性的拆分系统,也就是微服务出现的背景.
拆分系统一开始先拆分一轮,后面根据具体的实际情况再进行下一步拆分
拆分以后可能会存在,系统过于复杂难于管理(和维护不同),需要更多的操作,事务难于处理等问题。

分布式微服务的技术使用

如果不采取其他的技术,可以直接基于SpringMVC,进行一个纯http接口的通信,优点就是简单、直接、开发方便。使用Http协议的微服务,通常返回Json数据,然后把Json转换未对象,但是会存在一系列的问题,比如 负载均衡, 超时重试等;
而采用Dubbo的技术支持,它是一种 跨进程框架(RPC),本地进行接口调用,但是dubbo会代理这个调用请求,和远程机器网络通信,帮忙处理负载均衡等问题

Dubbo和SpringCloud的简单比较

SpringCloud来源Spring,利用SpringBoot进行快速开发,它是基于现有的开源框架进行集成,对于中小企业来说,更容易使用和落地,它核心的组件Eureka是Netflix开源的一款提供服务注册和发现的产品( 类似Dubbo+Zookeeper),主要是提供Service Registry和Service Discovery实现;
一般来说RPC服务主要是针对大型企业的,而HTTP服务更多是针对小企业,因为RPC效率更高,而HTTP服务开发迭代会更快,具体哪个好,要看具体的项目实现;

Dubbo的工作原理

Service接口层 主要是提供者和消费者来实现的

Config配置层 主要是进行Dubbo的相关配置问题

Proxy服务代理层 给双方提供代理,代理之间进行一个网络通信

Registry服务注册层 负责的是服务的注册和发现,一般设计ZK

cluster集群层 封装多个服务提供者的路由和负载均衡,将多个实例组合成一个服务

monitor监控层 主要是进行接口调用次数和时间进行监控

Protocal远程调用层 封装RPC调用

Exchange信息交换层 封装请求响应模式,同步转异步

Transpoet网络传输层 抽象mina和netty为统一接口

Serialize数据序列化层 底层对象传输数据序列化

Dubbo的工作流程

简单的说就是,容器启动提供者,提供者去注册中心进行挂载,消费者去注册中心进行调用请求,注册中心代理请求并提供服务,服务者的服务被调用,消费者和提供者异步通知监控中心
如果注册中心挂了,还是可以继续通信的,因为消费者会把提供者的地址信息拉取到本地缓存,所有注册中心挂了还是可以继续通信的

基本知识容器(有点乱,后面找时间修改)

首先IOC是一种思想,一种模式,而Spring的IOC容器只是实现了这种思想这种模式的一个载体;而IOC具体是指,将复杂的对象依赖关系从业务中解放,简化程序的开发过程,具体的操作是将对象的一系列操作权限赋予给容器;
bean之间的依赖关系是放在XML文件中进行维护的,具体是ConfigManager类进行读取信息然后封装到一个Map集合之中,在创建Bean的时候进行一一属性注入。
定义一个实现BeanFactory的接口实现类ClassPathXmlApplicationContext,通过getBean的方法来返回创建的对象,就是在这个类的构造方法中,初始化容器,通过调用ConfigManager的方法返回的Map集合,通过反射和内省一一创建bean对象.
对象创建有两个时间点,取决于Bean标签中的scope属性的值:
如果scope=“singleton”,那么对象在容器初始化时就已创建好,用的时候只需要去容器中取即可.
如果scope="prototype",那么容器中不保存这个bean的实例对象,每次开发者需要使用这个对象时再进行创建.;
容器简单的说就是一个装东西的地方,Spring要想 实现依赖注入功能,就 不能缺少对象生产的容器,也就是 IOC容器,而要实现Web项目,就需要一个运行Servlet的Web容器,比如Tomcat。
把对象的创建管理的控制给Spring容器,就是控制反转,所以称之为IOC容器。并不是只有Spring的容器才叫IOC容器,只要具有依赖注入功能的容器,都可以叫,甚至可以自己手写,在Spring中BeanFactory是IOC容器的实际代表者;
容器是Spring框架实现功能的核心,但是容器并不是唯一的。Spring框架本身就提供了很多个容器的实现, BeanFactory是最简单的容器,只能提供最基本的DI功能;
还有一种就是继承了BeanFactory后派生的应用上下文( ApplicationContext),本质上,它是一种维护bean定义以及对象之间协作关系的高级捷库,用于如解析配置文件信息等
下面五个是基于BeanFactory的IOC实现容器
① AnnotationConfigApplicationContext:从一个或多个基于java的配置类中加载上下文定义,适用于java注解的方式;
② ClassPathXmlApplicationContext:从类路径下的一个或多个xml配置文件中加载上下文定义,适用于xml配置的方式;
③ FileSystemXmlApplicationContext:从文件系统下的一个或多个xml配置文件中加载上下文定义,也就是说系统盘符中加载xml配置文件;
④ AnnotationConfigWebApplicationContext:专门为web应用准备的,适用于注解方式;
⑤ XmlWebApplicationContext:从web应用下的一个或多个xml配置文件加载上下文定义,适用于xml配置方式。
IOC容器替我们管理的对象,不管是基于什么,都要把他们之间的协作关系配置好,然后加载入Spring容器,这时候才能提供想要的对象管理服务了,如Man man = context.getBean(Man.class)。
在普通的JAVA工程中,我们可以通过代码显式new一个ClassPathXmlApplicationContext或者FileSystemXmlApplicationContext来初始化一个Spring容器。
在Web工程中,我们一般是通过配置web.xml的方式来初始化Spring容器。首先spring容器是依附在web容器也就是tomcat中的,一般我们再启动ssm框架工程的时候是先启动tomcat,tomcat一但开始启动,就会寻找web.xml,而我们一般把spring配置放在web.xml中,先在里面添加一个contextLoaderListener的监听器来监听tomcat,一旦发现tomcat启动,就会开始运行其中的方法contextInitialized–》initWebApplication–>加载web.xml同时配置的context-param中的内容,最后创建bean

基于SpringBoot的Dubbo搭建

容器启动以后,
先从服务端开始,具体是说给服务端提供一个接口和实现类,出去必要的依赖包,我们要把接口暴露出去,让别人对接,暴露方法有三种,第一种XML方法,因为Dubbo的底层是依赖Spring的,所以通过ClassPathXmlApplicationContext解析XML文件后,进行启动。

**关于dubbo协议,是类似于http协议发布自己的任务的,
dubbo://192.168.234.1:20880/com.sihai.dubbo.provider.service.ProviderService
构成了 协议://ip:端口/接口
**
然后是消费端,服务端若是点对点的方式提供服务,配置也会有点不一样,最后通过ClassPathXmlApplicationContext解析XML文件后,进行调用服务端服务,然后通过getBean取得注入的对象,就可以进行一个调用;
若加入了ZK组件在服务端中的注册中,填上<dubbo:registry address=“zookeeper://localhost:2181” />,若是集群,则采用几个IP地址的形式,消费端也是一样,但是不用再添加URL;
如果需要绕开注册中心进行一个测试,可以考虑点对点进行一个连接;
dubbo也是一种支持多协议的一种框架,也可以使用不同的注册中心软件,

Dubb的三个配置方法

第一种XML方法,文件中有几个结点,
服务端:
dubbo:application 项目在结构中的名字name,和属于谁owner,避免端口冲突,配置相应的端口;
dubbo:monitor 监控中心配置,不是必须的
dubbo:registry 注册中心,看你采用什么方式
dubbo:protocal 服务发布时候,以来的协议比如HTTP或者dubbo
dubbo:service 这个就是服务接口对接的地方
最后把接口Bean通过XML方式进行注入(发布)
消费端:
dubbo:application 和上面是一样的
dubbo:registry 和上面是一样的
dubbo:reference 多一个服务端的URL,因为的点对点连接
第二种方式API配置方式
换句话说,不需要XX.XML文件,通过Applicationfig进行一个相关的配置,然后进行SET即可
第三种注解的方式进行一个配置
@Service 用来配置 Dubbo 的服务提供方。
组装服务提供方。通过 Spring 中 Java Config 的技术(@Configuration)和 annotation 扫描(@EnableDubbo)来发现、组装、并向外提供 Dubbo 的服务,简单的说是一个简单的Spring注解注入的一个过程;
6.1中加入看版本控制

代码交流 2021