建立基础项目
建立一个maven
项目,然后建立一个api
模块,作为这个项目的总的调用接口
1 2
| learn-dubbo-demo/ ├── simple-api
|
https://github.com/liunaijie/learn-demo/tree/master/learn-dubbo-demo
https://github.com/liunaijie/learn-demo/tree/master/learn-dubbo-demo/sample-api
然后在api项目中创建接口,提供给生产者和消费者调用。
我这里定义一个了sayhello()
方法
使用zookeeper作为服务注册中心
1 2 3 4 5
| learn-dubbo-demo/ ├── simple-api ├── zookeeper-register └──zookeeper-consumer-sample └──zookeeper-provider-sample
|
这里使用zookeeper
作为dubbo
的服务注册中心,简单实现rpc的调用
新建两个子项目,一个作为生产者(spring-boot-starter
),一个作为消费者 (spring-boot-starter-web
)
在这两个module中都需要引入api的module
生产者:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| package cn.lnj.project.demo.dubbo.zookeeper.provider.service;
import cn.lnj.project.demo.dubbo.api.IUserService; import org.springframework.beans.factory.annotation.Value; import org.apache.dubbo.config.annotation.Service;
@Service(version = "${service.api.version}") public class UserServiceImpl implements IUserService { @Value("${dubbo.application.name}") private String serviceName;
@Override public String sayHello(String name) { System.out.println("zookeeper provider works"); return String.format("[%s] : Hello,i am work, %s", serviceName, name); }
}
|
然后写生产者的配置文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| spring: application: name: zookeeper-provider-sample
dubbo: application: name: zookeeper-provider-sample registry: address: zookeeper://****:2181 file: ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache scan: base-packages: cn.lnj.project.demo.dubbo.zookeeper.provider.service
service: api: version: 0.0.1
|
然后启动生产者会出现如下就表示我们生产者启动成功了。
我又进入zk里面查看了这个生产者的信息:
从这里我们可以看到存储了生产者信息的ip地址为192.168.0.18
。所以这也就要求了消费者与生产者在一个网段,否则不会调用成功。如果我将生产者与zk放到同一台机器上,那么这个ip地址就会变成127.0.0.1
,这样就要求消费者也要在同一台机器上。当然我们也可以修改本机的hosts来修改注册到zk上的地址,最终保证消费者能ping同生产者的ip才能调用成功。这个我认为是rpc
调用与http
调用的区别之一。
2.2消费者
首先是配置文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| spring: application: name: zookeeper-consumer-sample
dubbo: application: name: zookeeper-consumer-sample registry: address: zookeeper://****:2181 file: ${user.home}/dubbo-cache/${spring.application.name}/dubbo.cache
server: port: 8080 servlet: context-path: /zookeeper-consumer
service: api: version: 0.0.1
|
然后又写了一个controller来提供页面调用
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| package cn.lnj.project.demo.dubbo.zookeeper.consumer.controller;
import cn.lnj.project.demo.dubbo.api.IUserService; import org.apache.dubbo.config.annotation.Reference; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController;
@RestController public class UserController { @Reference(interfaceClass = IUserService.class,version = "${service.api.version}") private IUserService iUserService;
@RequestMapping(value = "/hello") public Object sayHello(@RequestParam(value = "name") String name) { return iUserService.sayHello(name); }
}
|
然后进行web页面调用:我传入了一个zookeeper的参数。出现了如下的结果就表示我们这个调用成功了