Dubbo快速入门学习(一)

Apache Dubbo 是一款高性能、轻量级的开源Java RPC框架,提供面向接口代理的高性能RPC调用、智
能负载均衡、服务自动注册和发现、运行期流量调度、可视化服务治理和运维等功能。
 
官网:
http://dubbo.apache.org/
 

1、RPC核心

RPC(Remote Procedure Call)— 远程过程调用 ,它是一种通过 网络 从远程计算机程序上请求服务,而不需要了解底层网络技术的协议,
在面向对象的编程语言中,远程过程调用即是 远程方法调用
 
Dubbo实现服务调用是通过RPC的方式,即客户端和服务端共用一个接口(将接口打成一个jar包,在客户端和服务端引入这个jar包),
客户端面向接口写调用,服务端面向接口写实现,中间的网络通信交给框架去实现
 
 java中RPC框架比较多,常见的有RMI、Hessian、Thrift、gRPC、bRPC、motan、Dubbo等,其实对于RPC框架而言,核心模块就是通讯和序列化
 
 
 
下面我们来分别看下常见的RPC框架:
 

1)RMI

 RMI(remote method invocation)是java原生支持的远程调用,RMI采用JRMP(Java RemoteMessageing Protocol)作为通信协议,可以认为是纯java版本的分布式远程调用解决方案。
 
 

RMI步骤

1. 创建远程接口, 并且继承java.rmi.Remote接口
2. 实现远程接口,并且继承:UnicastRemoteObject
3. 创建服务器程序: createRegistry()方法注册远程对象
4. 创建客户端程序 (获取注册信息,调用接口方法)
 
 

案例(Demo):

a)首先在主项目上创建两个子项目(模拟两台服务器的场景)

 

 

b)由于RMI是JAVA原生支持的,所以并不需求去另外导包。

   这里我们快速的搭建好服务端项目

     首先我们在rmi_server项目中创建好Service层

UserService:

该类需继承自Remote

package com.itheima.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
    String sayHello(String name)throws RemoteException;
}

UserServiceImpl:

实现类需继承自UnicastRemoteObject类,然后实现无参构造方法并抛出RemoteException异常

package com.itheima.service.impl;
import com.itheima.service.UserService;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
public class UserServiceImpl extends UnicastRemoteObject implements UserService {
    public UserServiceImpl() throws RemoteException {}
    public String sayHello(String name) {
        return name + "成功调用了服务端的服务";
    }
}

创建服务器程序将远程对象实例注册到RMI注册服务器上

package com.itheima.server;
import com.itheima.service.UserService;
import com.itheima.service.impl.UserServiceImpl;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
public class ServerMain  {
    public static void main(String[] args) throws RemoteException, AlreadyBoundException, MalformedURLException {
        //1.启动RMI注册服务,指定端口号
        LocateRegistry.createRegistry(8888);
        //2.创建要被访问的远程对象的实例
        UserService userService = new UserServiceImpl();
        //3.把远程对象实例注册到RMI注册服务器上
        Naming.bind("rmi://localhost:8888/UserService",userService);
        System.out.println("服务端启动中.....");
    }
}

此时运行上面的Main方法,便会将远程对象注册到RMI注册服务器上,运行结果如下:

 

 

 

c)现在我们开始搭建客户端项目

这里我们在客户端项目中直接创建ClientMain类,直接在其Main方法中通过Naming.lookup()方法直接从RMI注册服务器中获取到前面放上去的UserService

package com.itheima.client;
import com.itheima.service.UserService;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
public class clientMain {
    public static void main(String[] args) throws RemoteException, NotBoundException, MalformedURLException {
        UserService userService = (UserService) Naming.lookup("rmi://localhost:8888/UserService");
        String s = userService.sayHello("客户端");
        System.out.println(s);
    }
}

这里我们需要注意的是我们这个rmi_client项目中并没有UserService这个类,所以我们需要在本项目中创建上一模一样的该接口

UserService:

package com.itheima.service;
import java.rmi.Remote;
import java.rmi.RemoteException;
public interface UserService extends Remote {
    String sayHello(String name)throws RemoteException;
}

此时客户端的运行结果如下:

 

 

 

 2)Hessian

 Hessian使用C/S方式,基于HTTP协议传输,使用Hessian二进制序列化。
 
 
 

搭建服务端项目:

添加hessian的maven依赖:
<dependency>
     <groupId>com.caucho</groupId>
     <artifactId>hessian</artifactId>
      <version>4.0.7</version>
</dependency> 

创建UserService接口

public interface UserService  {
    public String sayHello(String name);
}

实现类

import com.itheima.service.UserService;
public class UserServiceImpl implements UserService {
    public String sayHello(String name) {
        return name+"调用了Hessian服务端的服务";
    }
}

web.xml 中配置HessianServlet

<servlet>
    <servlet-name>HessianServlet</servlet-name>
    <servlet-class>com.caucho.hessian.server.HessianServlet</servlet-class>
    <init-param>
       <param-name>service-class</param-name>
       <param-value>com.itheima.service.impl.UserServiceImpl</param-value>
    </init-param>
</servlet>
<servlet-mapping>
   <servlet-name>HessianServlet</servlet-name>
   <url-pattern>/hessianServlet</url-pattern><!-- 这里的参数配置后 在客户端的url需要与之匹配 -->
</servlet-mapping>

在pom文件中添加tomcat插件启动服务

<build>
   <plugins>
       <plugin>
           <groupId>org.apache.tomcat.maven</groupId>
           <artifactId>tomcat7-maven-plugin</artifactId>
           <version>2.2</version>
           <configuration>
               <port>8080</port><!-- 这里的参数配置后 在客户端的url需要与之匹配 -->
               <path>/</path>
                <uriEncoding>UTF-8</uriEncoding>
           </configuration>
        </plugin>
   </plugins>
</build>

 

 

搭建客户端项目:

添加hessian的maven依赖:
<dependency>
    <groupId>com.caucho</groupId>
    <artifactId>hessian</artifactId>
    <version>4.0.7</version>
</dependency>

创建跟 server端相同的接口UserService(同上)

 

创建测试类测试

import com.caucho.hessian.client.HessianProxyFactory;
import com.itheima.sercice.UserService;
import java.net.MalformedURLException;
public class ClientTest {

    public static void main(String[] args) throws MalformedURLException {
        String url = "http://localhost:8080/hessianServlet";  //这里的Url需要与服务端参数相匹配
        HessianProxyFactory hessianProxyFactory = new HessianProxyFactory();
        UserService userService = (UserService)hessianProxyFactory.create(UserService.class,url);
        String str = userService.sayHello("hessian客户端");
        System.out.println(str);
    }

}

 

运行结果如下:
1.启动服务端(tomcat)

 

 2.启动客户端测试类

 

 

 

 

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted @ 2021-04-11 21:31  _kerry  阅读(96)  评论(0编辑  收藏  举报