Spring boot 集成dubbo
开发环境
- JDK 1.8
- Spring boot 2.0.4.RELEASE
- dubbo-starter 2.0.0 with dubbo 2.6.0
Pom.xml
这里使用的zookeeper作为注册中心,所以需要导入zookeeper相关的两个jar包,相关依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.apache.zookeeper/zookeeper -->
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.13</version>
<type>pom</type>
</dependency>
<!-- https://mvnrepository.com/artifact/com.101tec/zkclient -->
<dependency>
<groupId>com.101tec</groupId>
<artifactId>zkclient</artifactId>
<version>0.10</version>
</dependency>
</dependencies>
Provider
application.properties
server.port=8080
dubbo.application.name=user-provider
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
dubbo.protocol.port=20880
定义接口UserService
package cn.demo.service;
public interface UserService {
String getUsername(int id);
}
实现UserService
package cn.demo.provider.service.impl;
import cn.demo.service.UserService;
import com.alibaba.dubbo.config.annotation.Service;
/**
* 注意这里@Service注解需要使用dubbo的
*/
@Service
public class UserServiceImpl implements UserService {
@Override
public String getUsername(int id) {
switch (id){
case 1 : return "zhangsan";
case 2 : return "lisi";
case 3 : return "wangwu";
case 4 : return "zhaosi";
default: return "can't find name";
}
}
}
Spring boot 启动类
package cn.demo.provider;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
//配置dubbo扫描的包,这里区别于官网使用@EnableDubboConfiguration
@EnableDubbo(scanBasePackages = "cn.demo.provider")
public class DubboUserApplication {
public static void main(String[] args) {
//这里手动设置本机ip,当本地是多网卡环境时,dubbo会默认取出第一块非localhost网卡的ip,但是有时候第一块网卡的ip可能不是正确的本机ip
System.setProperty("DUBBO_IP_TO_REGISTRY","192.168.43.234");
SpringApplication.run(DubboUserApplication.class, args);
}
}
Consumer
application.properties
server.port=8081
dubbo.application.name=user-consumer
dubbo.registry.address=zookeeper://127.0.0.1:2181
dubbo.protocol.name=dubbo
UserController
package cn.demo.dubbo.comsume.controller;
import cn.demo.service.UserService;
import com.alibaba.dubbo.config.annotation.Reference;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserController {
//使用reference注解即可实现userService的注入
@Reference
private UserService userService;
@RequestMapping("/username/{id}")
public String username(@PathVariable int id){
return userService.getUsername(id);
}
}
Spring boot 启动类
package cn.demo.dubbo.comsume;
import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import com.alibaba.dubbo.spring.boot.annotation.EnableDubboConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
@SpringBootApplication
@EnableDubbo(scanBasePackages = "cn.demo.dubbo")
public class DubboComsumeApplication {
public static void main(String[] args) {
ConfigurableApplicationContext run = SpringApplication.run(DubboComsumeApplication.class, args);
}
}
-
为什么使用EnableDubbo,因为作为provider时使用该注解无法读取application.properties中的配置,原因还没找到,EnableDubbo能很好的工作
-
代码在此dubbo-demo