springboot集成dubbo
前言
dubbo是一个分布式的高性能Java RPC服务治理框架。
由于之前dubbo不更新没怎么用它。不过现在已经成为Apache的一员了,所以就不用担心这个问题了。
dubbo官网:http://dubbo.apache.org,还有中文版,不错。
模块划分:
这里将接口和用到的bean放在dubbo-interface,服务提供方dubbo-provider,服务消费方dubbo-consumer。
具体使用
1.项目结构
父pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.donny</groupId>
<artifactId>springboot-dubbo-demo</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>dubbo-interface</module>
<module>dubbo-provider</module>
<module>dubbo-consumer</module>
</modules>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.7.RELEASE</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
</project>
2.dubbo-interface
这里定义一个UserService,并提供2个方法。
public interface UserService {
String sayHello(String name);
List<User> findAllUsers();
}
public class User implements Serializable{
private Long id;
private String name;
private int age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
PS:注意User要实现序列化接口。
3.dubbo-provider
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot-dubbo-demo</artifactId>
<groupId>com.donny</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-provider</artifactId>
<name>dubbo-provider</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<dependencies>
<dependency>
<groupId>com.donny</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8080
dubbo:
registry:
address: localhost:2181
logging:
level:
root: info
dubbo-provider.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 提供方应用信息,用于计算依赖关系 -->
<dubbo:application name="dubbo-provider" />
<!-- 注册中心服务地址 -->
<dubbo:registry id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />
<!-- 用dubbo协议在30001 -->
<dubbo:protocol name="dubbo" port="30001" />
<!-- 声明需要暴露的服务接口 -->
<dubbo:service interface="com.donny.service.UserService" ref="userService"
version="1.0" registry="zookeeper"/>
<!-- 具体服务接口的实现 -->
<bean id="userService" class="com.donny.service.UserServiceImpl" />
</beans>
UserService实现
public class UserServiceImpl implements UserService {
@Override
public String sayHello(String name) {
return "Hello," + name;
}
@Override
public List<User> findAllUsers() {
List<User> users = new ArrayList<User>(3);
User user0 = new User();
user0.setId(1L);
user0.setName("张三");
user0.setAge(18);
users.add(user0);
User user1 = new User();
user1.setId(2L);
user1.setName("李四");
user1.setAge(28);
users.add(user1);
User user2 = new User();
user2.setId(3L);
user2.setName("王五");
user2.setAge(38);
users.add(user2);
return users;
}
}
Springboot主类
@SpringBootApplication
@ImportResource("classpath:dubbo-provider.xml")
public class DubboProviderApp
{
public static void main( String[] args ) throws IOException {
SpringApplication.run(DubboProviderApp.class,args);
System.in.read(); // 为保证服务一直开着,利用输入流的阻塞来模拟
}
}
4.dubbo-consumer
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<parent>
<artifactId>springboot-dubbo-demo</artifactId>
<groupId>com.donny</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
<modelVersion>4.0.0</modelVersion>
<artifactId>dubbo-consumer</artifactId>
<name>dubbo-consumer</name>
<url>http://www.example.com</url>
<dependencies>
<dependency>
<groupId>com.donny</groupId>
<artifactId>dubbo-interface</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>dubbo</artifactId>
<version>2.6.2</version>
<exclusions>
<exclusion>
<artifactId>spring</artifactId>
<groupId>org.springframework</groupId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.zookeeper</groupId>
<artifactId>zookeeper</artifactId>
<version>3.4.6</version>
<exclusions>
<exclusion>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
</exclusion>
<exclusion>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>com.github.sgroschupf</groupId>
<artifactId>zkclient</artifactId>
<version>0.1</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-framework</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>2.8.0</version>
</dependency>
</dependencies>
</project>
application.yml
server:
port: 8081
dubbo:
registry:
address: localhost:2181
dubbo-consumer.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://code.alibabatech.com/schema/dubbo http://code.alibabatech.com/schema/dubbo/dubbo.xsd">
<!-- 消费方应用名 -->
<dubbo:application name="dubbo-consumer" />
<!-- 注册中心服务地址 -->
<dubbo:registry id="zookeeper" protocol="zookeeper" address="${dubbo.registry.address}" />
<!-- 引用UserService服务-->
<dubbo:reference id="userService" interface="com.donny.service.UserService"
check="false" version="1.0" url="" registry="zookeeper" protocol="dubbo" timeout="15000"/>
</beans>
Springboot主类
@SpringBootApplication
@ImportResource("classpath:dubbo-consumer.xml")
public class DubboConsumerApp
{
public static void main( String[] args )
{
SpringApplication.run(DubboConsumerApp.class,args);
}
}
测试类
@RunWith(SpringJUnit4ClassRunner.class)
@SpringBootTest(classes = DubboConsumerApp.class)
public class DubboConsumerTest
{
@Autowired
private UserService userService;
@Test
public void testSayHello() {
String result = userService.sayHello("jack");
System.out.println(result);
assertEquals(result,"Hello,jack");
}
@Test
public void testFindAllUers() {
List<User> users = this.userService.findAllUsers();
if (null != users && !users.isEmpty()) {
for (User user : users) {
System.out.println(user);
}
}
assertNotNull(users);
assertEquals(users.size(),3);
}
}
PS:这里注册中心使用的zookeeper。
5.使用dubbo-spring-boot-starter
springboot提供了非常多的starter,要用什么就使用spring-boot-starter-xxx即可。dubbo也提供了相应的starter。
dubbo-spring-boot-starter的github地址:https://github.com/alibaba/dubbo-spring-boot-starter。使用还是比较简单的,这里不再赘述。
dubbo-spring-boot-starter的使用也可以参考这篇:https://blog.csdn.net/romantic112/article/details/79687942。
参考:https://blog.csdn.net/qq_27384769/article/details/79465781
下一篇: springboot集成dubbo