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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

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

本帖最后由 wujianhui 于 2019-6-27 15:00 编辑

一、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;
	}
}

添加配置文件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">

    <!--消费者配置-->

    <!--1.springmvc的相关配置-->
    <context:component-scan base-package="com.myself.controller"></context:component-scan>
    <mvc:annotation-driven></mvc:annotation-driven>
    <!--2.dubbo的相关配置-->
    <!--i.dubbo应用名称-->
    <dubbo:application name="dubbodemo_consumer"></dubbo:application>
    <!--ii.注册中心-->
    <dubbo:registry address="zookeeper://192.168.112.129:2181"></dubbo:registry>
    <!--iii.dubbo的包扫描-->
    <dubbo:annotation package="com.myself.controller"></dubbo:annotation>

    <!--
        4项配置,2个注解
    -->
    <!--
        check = true  (正式系统)
            在项目启动的时候,检查服务提供者是否存在
        check = false (测试阶段)
            在项目启动的时候,不检查(调用的时候检查是否存在)
    -->
    <dubbo:consumer check="false"></dubbo:consumer>
</beans>



0 个回复

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