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