今天给大家讲一个知识点,就是我们很多兄弟开发的系统,已经不是10年前那种简单的单体系统了。打包部署一个项目,系统连接MySQL,然后集成Crud。够了够了,我们现在开发的系统都是非常庞大的分布式系统。什么是分布式系统?也就是说,你写的系统接到一个请求后,你自己的代码跑起来还不够,你还得调用其他兄弟写的系统,让他的系统做一些事情,然后他干完你的活就是完成,这次您的请求将被视为完成。只是因为你要调用其他兄弟系统一起运行来处理请求,一个请求涉及到分布在多台机器上的多个系统,所以才叫分布式。如下图所示:分布式系统之间如何调用?现在兄弟开发分布式系统一般都是调用其他系统。他们通常使用什么框架?简单,现在兄弟们普遍用SpringCloud,或者WithDubbo,这两个都有人用。一般用SpringCloud的都是两年多以前的。这两年大家都转投SpringCloudAlibaba。以前用SpringCloud的时候一般都是用Feign框架调用其他系统,现在用SpringCloudAlibaba一般都是用Dubbo框架。今天,我们就以Dubbo框架为例,说说我们平时如何进行系统间的调用。首先我们来看上图中的业务系统B。如果这个系统要提供一个接口给别人调用,那么他就必须写一个接口。该接口必须定义您希望允许其他人调用哪些方法。粗略看来是可以的。类似于下面的代码。如下:publicinterfaceService{StringsayHello(Stringname);然后,你要为这个接口开发一个实现类,需要完成这个方法的逻辑,同时给这个实现类加上@DubboService注解,让Dubbo识别为对外的服务接口,比如如下代码:@DubboService(version="1.0.0",interfaceClass=Service.class)publicclassServiceImplimplementsService{publicStringsayHello(Stringname){//运行一些代码return"hello,"+name;那么当你的业务系统B开发了上面的接口和实现类,并加上注解@DubboService,业务系统B启动后,会做一个怎么回事?简单的说,Dubbo框架会和你的业务系统B一起启动,它会启动一个web服务器,它会监听你指定的一个端口号,通常端口号是20880。如下图所示:此时,业务系统B上的dubbo已经启动,web服务器正在监听一个端口号,随时准备接收你发送的调用请求。接下来,就轮到我们的业务系统A上场了。假设这个业务系统A要调用业务系统B的Service接口中定义的方法,他会怎么做?代码大概会是这样:@RestControllerpublicclassController{//注意这里的Service是业务系统B定义的接口@DubboReference(version="1.0.0")privateServiceservice;@RequestMapping("/hello")publicResponsesayHello(Stringname){Stringresult=service.sayHello(name);返回Response.success(result);}}那么,最关键的问题来了。以上是业务系统A的代码,只是定义了业务系统B的Service接口的一个变量。。就是变量Service服务,然后加一个@DubboReference注解,那么当这个业务系统A启动的时候,Dubbo会做什么呢?Dubbo是如何实现基于动态代理的RPC调用的?其实这里有一个很重要的点,就是Dubbo此时会使用我们设计模式中的代理模式创建一个动态代理对象,将这个动态代理对象注入到我们上面的Service服务变量中,让他的变量是指Dubbo的动态代理对象。那么这个动态代理对象是什么呢?简单的说,Dubbo可以动态生成一个实现了Service接口的类,所有的方法都有自己的一套实现逻辑。后面会讲到实现逻辑,不过现在应该是下图这样:所以这里的重点是大家一定要明白这里Dubbo动态代理的概念,这是代理模式在设计模式中的一个经典应用。也就是说,一旦Dubbo为接口生成了一个动态代理对象,并注入到变量Service服务中,那么当你在你的业务系统A中调用Service服务的方法时,实际上会调用Dubbo动态代理的方法目的。再看代码感受一下:@RestControllerpublicclassController{//注意这里的Service是业务系统B定义的接口//这个接口变量实际上会注入到Dubbo@DubboReference生成的动态代理对象中(version="1.0.0")私有服务服务;@RequestMapping("/hello")publicResponsesayHello(Stringname){//注意这里调用接口方法的时候,实际上是在调用Dubbo动态代理对象的方法Stringresult=service.说你好(名字);返回Response.success(result);当Dubbo动态代理对象的方法被调用时,他会做什么呢?其实这里他会和我们业务系统B所在的机器建立网络连接,然后通过这个网络连接发送调用请求。业务系统B中的DubboWeb服务器收到请求后,会根据请求调用本地接口实现类的方法,获取返回值,然后将返回值返回给业务系统A的Dubbo动态代理对象通过网络连接,最后Dubbo动态代理对象会给我们这个返回值。如下图所示:好了,今天给大家分享的基于Dubbo的系统间调用原理就到此结束。希望大家在平时使用Dubbo进行开发的时候,也一定要对它的底层原理有一定的了解。
