当前位置: 首页 > 科技观察

写一个Dubbo接口就可以调用其他系统,你知道怎么做吗?

时间:2023-03-13 20:20:16 科技观察

今天给大家讲一个知识点,就是我们很多兄弟现在开发的系统已经不是10年前的那种简单的单体系统了。打包部署一个项目,将系统连接到MySQL,然后设置crud就足够了。是的,我们开发的系统都是非常庞大的分布式系统。什么是分布式系统?也就是说,你写的系统收到请求后,你自己的代码跑起来还不够,你还得调用其他兄弟写的系统,让他的系统做一些事情,然后他干完活就是done,你这次的请求处理算是完成了,因为你要调用其他兄弟系统一起运行来处理请求,而一个请求涉及到分布在多台机器上的多个系统,所以才叫分布式,如图以下。分布式系统之间如何调用?现在兄弟们一般开发分布式系统,只是为了调用其他系统,一般用什么框架?简单,现在兄弟们一般都用springcloud或者dubbo,这两个都有人用。一般用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服务器。这个web服务器会监听一个你指定的端口号,通常这个端口号是20880,如下图所示。这时业务系统B上的dubbo已经启动,网络服务器正在监听一个端口号,准备接收你发送的调用请求,接下来就轮到我们业务系统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.sayHello(name);返回Response.success(result);那么Dubbo动态调用代理对象的方法时,他会做什么呢?其实这里他会和我们业务系统B所在的机器建立网络连接,然后通过这个网络连接发送调用请求,而在业务系统B的Dubbo网络服务器收到请求后,会调用本地接口实现类的方法根据请求,获取返回值,然后将返回值通过网络连接返回给业务系统A的dubbo动态代理对象,最后dubbo动态代理对象会给我们这个返回值,如下图所示。好了,今天和大家分享的基于dubbo的系统间调用原理就到此结束。希望大家在平时使用dubbo进行开发的时候,也一定要对它的底层原理有一定的了解。