A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wujianhui 中级黑马   /  2019-6-27 15:06  /  722 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一、RPC介绍
       RPC是Remote Procedure Call Protocol的缩写,也叫远程过程调用协议,是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。简单点来说,RPC使得程序能够像访问本地系统资源一样,去访问远端系统资源。
二、RPC运行原理
       RPC运行时,一次客户机对服务器的RPC调用,其内部操作大致有如下十步:
    1.调用客户端句柄;执行传送参数
    2.调用本地系统内核发送网络消息
    3.消息传送到远程主机
    4.服务器句柄得到消息并取得参数
    5.执行远程过程
    6.执行的过程将结果返回服务器句柄
    7.服务器句柄返回结果,调用远程系统内核
    8.消息传回本地主机
    9.客户句柄由内核接收消息
    10.客户接收句柄返回的数据
三、RPC主流框架之Dubbo
    目前基于RPC的主流框架有Avro,RMI,Hessian,Dubbo等,而Dubbo是 阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成。
       Dubbo框架结构包括注册中心,监控中心,服务提供者,服务消费者。
四、Dubbo简单案例
1.服务提供者
创建工程添加依赖
[XML] 纯文本查看 复制代码
<properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring.version>5.0.5.RELEASE</spring.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-beans</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-aspects</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jms</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context-support</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- dubbo相关
                dubbo: 2.6.6(是dubbo被收购之前的最后一个版本)
         -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>dubbo</artifactId>
            <version>2.6.6</version>
        </dependency>
        <dependency>
            <groupId>io.netty</groupId>
            <artifactId>netty-all</artifactId>
            <version>4.1.32.Final</version>
        </dependency>
        <dependency>
            <groupId>org.apache.curator</groupId>
            <artifactId>curator-framework</artifactId>
            <version>4.0.0</version>
            <exclusions>
                <exclusion>
                    <groupId>org.apache.zookeeper</groupId>
                    <artifactId>zookeeper</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.zookeeper</groupId>
            <artifactId>zookeeper</artifactId>
            <version>3.4.7</version>
        </dependency>
        <dependency>
            <groupId>com.github.sgroschupf</groupId>
            <artifactId>zkclient</artifactId>
            <version>0.1</version>
        </dependency>
    </dependencies>

创建测业务接口:
[Java] 纯文本查看 复制代码
public interface HelloService {
String sayHello(String name);
}

实现类:
[Java] 纯文本查看 复制代码
@Service
public class HelloServiceImpl implements HelloService {
public String sayHello(String name) {
System.out.println(name);
return "hello : " + name;
}
}

添加配置文件applicationContext.xml
[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:aop="http://www.springframework.org/schema/aop"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!--配置服务提供者-->
<!--配置应用名称-->
<dubbo:application name="dubbodemo_provider"></dubbo:application>
<!--配置注册中心-->
<dubbo:registry address="zookeeper://192.168.112.129:2181"></dubbo:registry>
<!--配置服务协议:端口(从20881开始)-->
<dubbo:protocol name="dubbo" port="20882"></dubbo:protocol>
<!--配置dubbo注解的包扫描-->
<dubbo:annotation package="com.myself.service"></dubbo:annotation>
</beans>

创建测试类启动服务:
[Java] 纯文本查看 复制代码
public class Provider {
public static void main(String[] args) throws Exception {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");
context.start();
System.in.read(); // 按任意键退出
}
}

2.服务消费者
创建工程,添加依赖
[XML] 纯文本查看 复制代码
<properties> 
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
<maven.compiler.source>1.8</maven.compiler.source> 
<maven.compiler.target>1.8</maven.compiler.target> 
<spring.version>5.0.5.RELEASE</spring.version> 
</properties> 
<dependencies> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-context</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-beans</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-webmvc</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-jdbc</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-aspects</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-jms</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<dependency> 
<groupId>org.springframework</groupId> 
<artifactId>spring-context-support</artifactId> 
<version>${spring.version}</version> 
</dependency> 
<!-- dubbo相关 --> 
<dependency> 
<groupId>com.alibaba</groupId> 
<artifactId>dubbo</artifactId> 
<version>2.6.6</version> 
</dependency> 
<dependency> 
<groupId>io.netty</groupId> 
<artifactId>netty-all</artifactId> 
<version>4.1.32.Final</version> 
</dependency> 
<dependency> 
<groupId>org.apache.curator</groupId> 
<artifactId>curator-framework</artifactId> 
<version>4.0.0</version> 
<exclusions> 
<exclusion> 
<groupId>org.apache.zookeeper</groupId> 
<artifactId>zookeeper</artifactId> 
</exclusion> 
</exclusions> 
</dependency> 
<dependency> 
<groupId>org.apache.zookeeper</groupId> 
<artifactId>zookeeper</artifactId> 
<version>3.4.7</version> 
</dependency> 
<dependency> 
<groupId>com.github.sgroschupf</groupId> 
<artifactId>zkclient</artifactId> 
<version>0.1</version> 
</dependency> 
</dependencies> 

创建控制器:
[Java] 纯文本查看 复制代码
@Controller
public class HelloController {
/**
* 远程调用dubbo服务
*/
@Reference
private HelloService helloService;

/**
* 请求的方法
*/
@RequestMapping("/hello")
public @ResponseBody String sayHello() {
String str = helloService.sayHello("dubbo");
System.out.println(str);
return str;
}
}


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马