2019独角兽企业重金招聘Python工程师标准>>>
概念
RPC(Remote Procedure Call Protocol):远程过程调用:
两台服务器A、B,分别部署不同的应用a,b。当A服务器想要调用B服务器上应用b提供的函数或方法的时候,由于不在一个内存空间,不能直接调用,需要通过网络来表达调用的语义传达调用的数据。
说白了,就是你在你的机器上写了一个程序,我这边是无法直接调用的,这个时候就出现了一个远程服务调用的概念。
目录结构
依赖管理
pom.xml 依赖配置
4.0.0
dubbo-stuty01-start
yh
1.0-SNAPSHOT
UTF-8
UTF-8
1.8
1.8
1.8
UTF-8
4.3.7.RELEASE
org.springframework
spring-framework-bom
${spring.version}
pom
import
org.springframework
spring-core
org.springframework
spring-beans
org.springframework
spring-context
com.alibaba
dubbo
2.5.3
com.github.sgroschupf
zkclient
0.1
服务接口
在新建包com.yh.dubbo下创建服务接口,该接口是服务提供者和消费者同时能看到的。
package com.yh.dubbo;
/**
* @Description: service 接口,提供者和消费者都能看到。实现由提供者来完成。
* @Author: 张颖辉(yh)
* @Date: 2018/7/24 17:08
* @param:
* @return:
* @Version: 1.0
*/
public interface IDemoService {
public String sayHello(String name);
}
服务实现
新建提供者包:com.yh.dubbo.provider 下创建服务实现类
package com.yh.dubbo.provider;
import com.yh.dubbo.IDemoService;
/**
* @Description: Description
* @Author: 张颖辉(yh)
* @CreateDate: 2018/7/17 10:21
* @UpdateUser: 张颖辉(yh)
* @UpdateDate: 2018/7/17 10:21
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class DemoServiceImpl implements IDemoService {
@Override
public String sayHello(String name) {
return "Hello,"+name;
}
}
提供者配置
基于spring的服务提供者配置spring-provider.xml
从配置中可以看出注册中心使用的zookeeper这也是官方推荐使用的注册中心,如果为了快速入门,没有安装zookeeper,那么可以换为多播/组播来替代zk作为注册中心,最后会讲怎么来使用多播/组播来做注册中心。
提供者启动类
服务提供者加载spring-provider.xml配置文件的启动入口
package com.yh.dubbo.provider;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.io.IOException;
/**
* @Description: Description
* @Author: 张颖辉(yh)
* @CreateDate: 2018/7/17 10:37
* @UpdateUser: 张颖辉(yh)
* @UpdateDate: 2018/7/17 10:37
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class ProviderStart {
public static void main(String[] args) throws IOException {
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
// new String[]{"http://10.20.160.198/wiki/display/dubbo/provider.xml"});
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"spring-provider.xml"});
context.start();
System.in.read();
}
}
消费者配置
服务消费者配置spring-consumer.xml
在上面的配置中我们看到,和服务相关的只引用了服务的接口,并没有使用服务的实现类。最后我们要通过dubbo来展现出RPC的效果。
消费者启动类
服务消费者加载配置文件spring-consumer.xml,启动spring容器后并调用服务
package com.yh.dubbo.consumer;
import com.yh.dubbo.IDemoService;
import com.yh.dubbo.provider.DemoServiceImpl;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import java.util.Scanner;
/**
* @Description: 消费者启动,并调用服务
* @Author: 张颖辉(yh)
* @CreateDate: 2018/7/17 10:37
* @UpdateUser: 张颖辉(yh)
* @UpdateDate: 2018/7/17 10:37
* @UpdateRemark: The modified content
* @Version: 1.0
*/
public class ConsumerStart {
public static void main(String[] args) {
// ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
// new String[]{"http://10.20.160.198/wiki/display/dubbo/consumer.xml"});
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext(
new String[]{"spring-consumer.xml"});
context.start();
IDemoService demoService=(IDemoService)context.getBean("demoService");
System.out.println(demoService.sayHello("yh"));
while (true){
Scanner scanner=new Scanner(System.in);
System.out.println(demoService.sayHello(scanner.next()));
}
}
}
运行效果
分别启动服务提供者和消费者,就是上面的代码中的两个main函数。
会在消费者的控制台看到:
这说明消费者端可以正确的调用提供者对service接口的实现,并返回了期望的结果。
之后再控制台手动输入文字,回车
手动输入的内容也正确的被处理和返回。
到此我们简单的实现了dubbo的使用了,上面的启动我们是靠着两个main函数启动的,实际上我们只要按照上面配置。在项目的spring容器启动的时候dubbo也会随之启动,并且消费者这边会自动将服务的实现类对象装载到spring容器中,和平常一样使用去注入service即可。
使用 multicast(多播/注册)作为注册中心
将上文中的两个spring配置文件的
注意:zookeeper需要使用你自己安装的IP地址和端口号,但是多播/组播中配置的IP端口不需要任何改动。
重复上面的启动过程就好了,没错就是这么简单:放开multicast配置这行的注释——给zookeeper这行加上注释——启动!
错误参考:
如果使用multicast报错[DUBBO] Ignore empty notify urls for subscribe url的解决办法。