0、准备
使用docker安装zookeeper
参照随笔:https://www.aimaboge.com/note/26
zookeeper端口号为2181
一、生产者(dubbo-server)
1、引入dubbo依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、配置application.properties
连接到远程zookeeper,注册为生产者
## Dubbo 服务提供者配置
spring.dubbo.application.name=provider
spring.dubbo.registry.address=zookeeper://106.54.196.44:2181
spring.dubbo.protocol.name=dubbo
spring.dubbo.protocol.port=20880
spring.dubbo.scan=com.laoxu.dubbo.service
- spring.dubbo.scan 指定远程服务调用位置(生产者的service接口所在路径)
3、创建服务
项目结构
城市实体类
package com.laoxu.dubbo.entity;
import java.io.Serializable;
/**
* 城市实体类
*
* Created by bysocket on 07/02/2017.
*/
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 省份编号
*/
private Long provinceId;
/**
* 城市名称
*/
private String cityName;
/**
* 描述
*/
private String description;
public City() {
}
public City(Long id, Long provinceId, String cityName, String description) {
this.id = id;
this.provinceId = provinceId;
this.cityName = cityName;
this.description = description;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getProvinceId() {
return provinceId;
}
public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
远程调用服务接口
package com.laoxu.dubbo.service;
import com.laoxu.dubbo.entity.City;
public interface CityDubboService {
City findCityByName(String cityName);
}
服务逻辑
package com.laoxu.dubbo.service.impl;
import com.alibaba.dubbo.config.annotation.Service;
import com.laoxu.dubbo.entity.City;
import com.laoxu.dubbo.service.CityDubboService;
@Service(version = "1.0.0")
public class CityDubboServiceImpl implements CityDubboService {
@Override
public City findCityByName(String cityName) {
return new City(1L,2L,cityName,"是我的故乡");
}
}
代码说明:
- @Service 这里须使用dubbo的service注解,用于暴露服务,参数version指定对应版本
- 主要模拟了根据名字查找城市业务
二、消费者(dubbo-client)
1、引入dubbo依赖
<!-- Spring Boot Dubbo 依赖 -->
<dependency>
<groupId>io.dubbo.springboot</groupId>
<artifactId>spring-boot-starter-dubbo</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2、配置application.properties
连接远程zookeeper,注册为消费者
## 避免和 server 工程端口冲突
server.port=8081
## Dubbo 服务消费者配置
spring.dubbo.application.name=consumer
spring.dubbo.registry.address=zookeeper://106.54.196.44:2181
spring.dubbo.scan=com.laoxu.dubbo.service
3、项目结构
城市实体类
package com.laoxu.dubbo.entity;
import java.io.Serializable;
/**
* 城市实体类
*
* Created by bysocket on 07/02/2017.
*/
public class City implements Serializable {
private static final long serialVersionUID = -1L;
/**
* 城市编号
*/
private Long id;
/**
* 省份编号
*/
private Long provinceId;
/**
* 城市名称
*/
private String cityName;
/**
* 描述
*/
private String description;
public City() {
}
public City(Long id, Long provinceId, String cityName, String description) {
this.id = id;
this.provinceId = provinceId;
this.cityName = cityName;
this.description = description;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Long getProvinceId() {
return provinceId;
}
public void setProvinceId(Long provinceId) {
this.provinceId = provinceId;
}
public String getCityName() {
return cityName;
}
public void setCityName(String cityName) {
this.cityName = cityName;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}
调用远程服务接口
接口名字、方法名、所在包都须和远程服务相同
package com.laoxu.dubbo.service;
import com.laoxu.dubbo.entity.City;
public interface CityDubboService {
City findCityByName(String cityName);
}
消费者服务根据远程的version找到对应的生产者
package com.laoxu.dubbo.service;
import com.alibaba.dubbo.config.annotation.Reference;
import com.laoxu.dubbo.entity.City;
import org.springframework.stereotype.Component;
/**
* 城市 Dubbo 服务消费者
*
* Created by bysocket on 28/02/2017.
*/
@Component
public class CityDubboConsumerService {
@Reference(version = "1.0.0")
CityDubboService cityDubboService;
public City findCityByName(String cityName) {
return cityDubboService.findCityByName(cityName);
}
}
4、控制器测试
package com.laoxu.dubbo.controller;
import com.laoxu.dubbo.entity.City;
import com.laoxu.dubbo.service.CityDubboConsumerService;
import com.laoxu.dubbo.service.CityDubboService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
public class HelloController {
@Autowired
private CityDubboConsumerService cityDubboConsumerService;
@GetMapping("/123")
@ResponseBody
public City hello(@RequestParam("city") String cityName){
return cityDubboConsumerService.findCityByName(cityName);
}
}
这里findCityByName方法调用的就是生产者dubbo-server里的
测试 :访问 http://localhost:8081/123?city=%E6%9D%AD%E5%B7%9E
测试: 访问 http://localhost:8081/123?city=%E4%B8%8A%E6%B5%B7