springboot 整合 dubbo

  作者:记性不好的阁主

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








相关推荐

评论 抢沙发

表情

分类选择