【手写一篇简单的Dubbo程序实现远程调用】

手写一篇简单的Dubbo程序实现远程调用

前言:

本人小白一枚,博客为自己学习时课后笔记,如有不足,请大佬们多多指教。

关于dubbo简介:

Dubbo的介绍

Apache Dubbo是一款高性能的Java RPC框架。其前身是阿里巴巴公司开源的一个高性能、轻量级的开源Java RPC框架,可以和Spring框架无缝集成。

Dubbo提供了三大核心能力:面向接口的远程方法调用,智能容错和负载均衡,以及服务自动注册和发现

Dubbo架构图简介

截图

架构说明

关于虚线和实线:虚线表示异步,实现表示同步。异步不影响线程阻塞,同步必须等待响应结果才能继续执行,相对性能低。

Provider

提供者。编写持久层和事务代码.

Container

容器(spring)容器,Dubbo是基于spring实现的。

Registry

注册中心。放置所有Provider提供的信息。包含Provider的IP,访问端口,访问遵守的协议,对外提供的接口,接口中有哪些方法等相关信息。

Consumer

消费者(RPC调用者,SOA调用服务的项目)开发中也是一个项目,编写service和controller(还可以报页面等)。调用XXXXServiceImpl中的方法。

Monitor

监控中心。监控Provider的压力情况等。每隔2分钟Consumer和Provider会把调用次数发送给Monitor,由Monitor进行统计。

执行流程

  1. statr:启动spring容器时会启动Provider

  2. register:将provider中相关信息注册到registry中

  3. subscribe:Consumer从Registry中订阅Provider的信息

  4. notify:通知给Consumer

  5. invoke:Consumer根据Registry通知的信息进行调用Provider中方法。

  6. count:Consumer和Provider把调用次数信息异步发送给Monitor进行统计。

搭建一个简单的Dubbo项目

整体结构如下:

 

 

api:负责提供对外的接口

provider:提供者 

consumer:调用者

父项目DubboParent中Pom导入依赖项

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
​
    <groupId>com.cowain</groupId>
    <artifactId>DubboParent</artifactId>
    <packaging>pom</packaging>
    <version>1.0-SNAPSHOT</version>
    <modules>
        <module>api</module>
        <module>provider</module>
        <module>consumer</module>
    </modules>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.10.RELEASE</version>
    </parent>
​
​
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter</artifactId>
                <version>2.1.10.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
                <version>2.1.10.RELEASE</version>
            </dependency>
            <dependency>
                <groupId>org.apache.dubbo</groupId>
                <artifactId>dubbo-spring-boot-starter</artifactId>
                <version>2.7.3</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-recipes</artifactId>
                <version>4.2.0</version>
            </dependency>
            <dependency>
                <groupId>org.apache.curator</groupId>
                <artifactId>curator-framework</artifactId>
                <version>4.2.0</version>
            </dependency>
        </dependencies>
    </dependencyManagement>
​
</project>

api中代码结构:

 

provider结构:

 

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>DubboParent</artifactId>
        <groupId>com.cowain</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
​
    <artifactId>provider</artifactId>
​
    <dependencies>
        <dependency>
            <artifactId>api</artifactId>
            <groupId>com.cowain</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
        </dependency>
    </dependencies>
​
​
</project>

DubboServiceImpl

package com.cowain.service.impl;
​
import com.cowain.dubbo.service.DobbuService;
import org.apache.dubbo.config.annotation.Service;
/**
 * @Author: fxw
 * @Date: 2022/1/10 21:40
 */
@Service
public class DubboServiceImpl implements DobbuService {
    @Override
    public String testDemo(String param) {
        System.out.println("执行demo");
        return param+":hello";
    }
}
​

apploication.xml

只要配置zookeeper的ip与端口

dubbo:
  application:
    name: dubbo-provider
  registry:
     address: zookeeper://192.168.153.129:2181
  protocol:
    port: 20884

consumer结构:

Pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent>
        <artifactId>DubboParent</artifactId>
        <groupId>com.cowain</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>
​
    <artifactId>consumer</artifactId>
​
    <dependencies>
        <dependency>
            <artifactId>api</artifactId>
            <groupId>com.cowain</groupId>
            <version>1.0-SNAPSHOT</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.dubbo</groupId>
            <artifactId>dubbo-spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-recipes</artifactId>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
        </dependency>
    </dependencies>
​
</project>

ConsumerController

package com.cowain.controller;
​
import com.cowain.service.ConsumerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
​
/**
 * @Author: fxw
 * @Date: 2022/1/10 21:50
 */
@Controller
public class ConsumerController {
    @Autowired
    private ConsumerService consumerService;
    @RequestMapping("/demo")
    @ResponseBody
    public String testDubboDemo(){
    return consumerService.demo();
    }
}
​

ConsumerServiceImpl

package com.cowain.service.impl;
​
import com.cowain.dubbo.service.DobbuService;
import com.cowain.service.ConsumerService;
import org.apache.dubbo.config.annotation.Reference;
import org.springframework.stereotype.Service;
​
/**
 * @Author: fxw
 * @Date: 2022/1/10 21:48
 */
@Service
public class ConsumerServiceImpl implements ConsumerService {
    @Reference
    private DobbuService dobbuService;
    @Override
    public String demo() {
        return dobbuService.testDemo("李佳春");
    }
}

ConsumerService

package com.cowain.service;
​
/**
 * @Author: fxw
 * @Date: 2022/1/10 21:46
 */
public interface ConsumerService {
   public String demo();
}
​

ConsumerApplication

package com.cowain;
​
import org.apache.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
​
/**
 * @Author: fxw
 * @Date: 2022/1/10 21:44
 */
@EnableDubbo
@SpringBootApplication
public class ConsumerApplication {
    public static void main(String[] args) {
        SpringApplication.run(ConsumerApplication.class,args);
    }
}
​

apploication.xml

dubbo:
  application:
    name: dubbo-consumer
  registry:
     address: zookeeper://192.168.153.129:2181

测试:

 

zookeeper:

 

总结

代码虽然简单,但是得明白dubbo的执行流程,此篇博客仅供学习使用,如有不足,请多多指教。

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TensorFlow是一个非常流行的深度学习框架,可以很容易地实现各种机器学习模型。在本次实验中,我们将使用TensorFlow来实现一个手写数字识别模型。 实验步骤: 1.数据集准备 我们将使用MNIST数据集,这是一个包含手写数字图像的大型数据集。该数据集包含60000个训练样本和10000个测试样本。每个图像都是28x28像素,灰度图像。 2.模型的构建 我们将使用卷积神经网络(CNN)来训练模型。CNN是一种特殊的神经网络,可以处理图像和其他类型的多维数据。它可以自动提取图像中的特征,从而实现更好的分类效果。 我们将使用TensorFlow中的Keras API来构建CNN。我们将创建一个包含两个卷积层和两个全连接层的模型。在卷积层中,我们将使用ReLU激活函数和MaxPooling层来提取特征。在全连接层中,我们将使用Softmax函数来计算每个类别的概率。 3.模型的训练 我们将使用TensorFlow中的fit()函数来训练模型。我们将使用Adam优化器和交叉熵损失函数来最小化误差。我们将使用批量大小为128和训练周期为10进行训练。 4.模型的评估 我们将使用测试数据集来评估模型的性能。我们将使用evaluate()函数来计算模型的准确性。 代码实现: ``` import tensorflow as tf from tensorflow import keras # Load dataset (x_train, y_train), (x_test, y_test) = keras.datasets.mnist.load_data() # Normalize the images x_train = x_train.astype('float32') / 255 x_test = x_test.astype('float32') / 255 # Reshape the images x_train = x_train.reshape(x_train.shape[0], 28, 28, 1) x_test = x_test.reshape(x_test.shape[0], 28, 28, 1) # Convert labels to one-hot encoding y_train = keras.utils.to_categorical(y_train, 10) y_test = keras.utils.to_categorical(y_test, 10) # Define the model model = keras.Sequential([ keras.layers.Conv2D(32, (3,3), activation='relu', input_shape=(28,28,1)), keras.layers.MaxPooling2D((2,2)), keras.layers.Conv2D(64, (3,3), activation='relu'), keras.layers.MaxPooling2D((2,2)), keras.layers.Flatten(), keras.layers.Dense(64, activation='relu'), keras.layers.Dense(10, activation='softmax') ]) # Compile the model model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy']) # Train the model model.fit(x_train, y_train, batch_size=128, epochs=10, validation_data=(x_test, y_test)) # Evaluate the model test_loss, test_acc = model.evaluate(x_test, y_test) print('Test accuracy:', test_acc) ``` 总结: 在这个实验中,我们展示了如何使用TensorFlow和Keras来实现手写数字识别模型。我们使用了MNIST数据集,并使用了卷积神经网络来训练模型。我们通过测试数据集评估了模型的性能,并得出了非常好的准确性。这个实验是一个很好的起点,可以让你开始学习深度学习,并构建自己的模型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值