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.启动客户端测试类
日拱一卒无有尽,功不唐捐终入海