dubbo+spring boot搭建微服务 demo
最近比较流行服务化架构,服务化架构比较主流的实现有SOA和微服务。这里我使用分布式服务框架dubbo和spring boot做简单的集成demo。
在微服务框架中有两个角色:是服务的提供者(provider),服务消费者(consumer)。
一个服务既可以是服务提供者同时也可以是服务消费者。
搭建步骤
- 创建spring boot 项目 ,要创建两个项目,一个服务提供者(provider)项目,一个服务消费者(consumer)项目;
- 添加dubbo-spring-boot-starter 依赖;
- 书写服务提供者代码,并且用dubbo发布服务;
- 书写服务消费者代码,使其远程调用服务提供者,拿到返回值;
- 测试;
说明
1.了解dubbo的童鞋都知道dubbo可以向注册中心注册服务,推荐使用zookeeper作为注册中心。但本demo采用直连的方式,不走注册中心。
2.为了清楚我们使用配置文件的方式进行dubbo的配置。
3.使用的IDE是:eclipse。
1. 创建spring boot 项目 ,要创建两个项目,一个服务提供者(provider)项目,一个服务消费者(consumer)项目;
我在这里采用在线的创建方式:https://start.spring.io/ 创建spring boot应用。
在线创建好项目后直接导入到eclipse中:
2. 添加 dubbo-spring-boot-starter 依赖;
在两个项目的po’m.xml 中添加dubbo-spring-boot-starter依赖
<dependency>
<groupId>com.alibaba.spring.boot</groupId>
<artifactId>dubbo-spring-boot-starter</artifactId>
<version>2.0.0</version>
</dependency>
3. 书写服务提供者代码,并且用dubbo发布服务;
dubbo是采用服务接口的方式来发布服务的,也就是说我们对外暴露的是我们的一个服务接口,具体的实现由具体业务来定。
所以我们要定义一个接口:
public interface ServiceAPI {
public String getMessage(String message);
}
接口定义完成后,作为我们的服务提供者,我们还需要去实现这个接口。也就是我们要提供接口服务的具体实现类。
public class ProviderImpl implements ServiceAPI {
//这里进行简单的实现
public String getMessage(String message) {
return "springboot-dubbo-provider"+message;
}
}
服务接口与服务接口具体的实现都定义完成后,我们要去向dubbbo注册我们的服务
1,创建spring-dubbo.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应用名称 -->
<dubbo:application name="springboot-dubbo-provider" />
<!-- 发布者 dubbo协议 -->
<dubbo:protocol name="dubbo" port="20880" />
<!-- 定义bean -->
<bean id="providerImpl" class="com.immo.renpeng.springbootdubbo.apiImpl.ProviderImpl" />
<!-- dubbo服务 发布者发布服务 需要暴露的服务接口 -->
<dubbo:service interface="com.immo.renpeng.springbootdubbo.ServiceAPI" ref="providerImpl" registry="N/A" />
</beans>
配置文件说明(也可参考官网:http://dubbo.apache.org/zh-cn/):
<dubbo:application name="" > 标识一个dubbo服务的名称,注意不要和其他服务重名即可。
<dubbo:protocol name="dubbo" port="20880" /> 定义支持的协议:这里采用dubbo协议,和默认的端口号。
dubbo协议是同步的,也就说如果我的调用方没有接收到提供方返回的数据时会阻塞,长时间的阻塞会影响服务性能。
<dubbo:service interface="com.immo.renpeng.springbootdubbo.ServiceAPI" ref="providerImpl" registry="N/A" />
dubbo对外发布的服务,interface是我们要发布服务的接口,ref是我们发布服务接口的具体实现类,registry=“N/A” 是我们采用直连的方式调用服务。
- 配置文件添加完成之后我们需要在我们项目启动的时候进行读取:
在项目启动类上加:
@ImportResource("classpath:spring-dubbo.xml")
代码如下:
@SpringBootApplication
@ImportResource("classpath:spring-dubbo.xml")
public class SpringbootDubboApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDubboApplication.class, args);
}
}
完整的包结构:
以上服务提供者就完成了。
4. 书写服务消费者代码,使其远程调用服务提供者,拿到返回值;
上边服务提供者发布了一个接口,下边我们就书写服务消费者消费这个接口。
首先我们要定义一个与服务提供者相同的接口:
public interface ServiceAPI {
public String getMessage(String message);
}
所谓相同指的是接口名与包路径完全相同。为什么要定义这个接口呢?下边知道啦。
我们有了这个接口之后要进行配置,服务消费者:
<?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名称 -->
<dubbo:application name="springboot-dubbo-consumer" />
<!-- 远程服务调用代理 -->
<dubbo:reference id="consumerImpl" interface="com.immo.renpeng.springbootdubbo.ServiceAPI" url="dubbo://localhost:20880" />
</beans>
配置文件说明(也可参考官网:http://dubbo.apache.org/zh-cn/):
<dubbo:application name="" > 标识一个dubbo服务的名称,注意不要和其他服务重名即可。
<dubbo:reference id="consumerImpl" interface="com.immo.renpeng.springbootdubbo.ServiceAPI" url="dubbo://localhost:20880" />
远程调用的代理类,id="" 名字可以随意,interface 服务消费者代理的那个接口(或者服务消费者消费的那个接口),url 采用的那个服务提供方的地址。
这里我们就知道我们刚才写的那个接口是为远程的服务提供者做代理使用,这个接口的实现是由url标识的那个提供者提供的。
最后我们要消费这个服务并且在启动类上添加读取配置文件:
@SpringBootApplication
@ImportResource("classpath:spring-dubbo.xml")
public class SpringbootDubboConsumerApplication {
public static void main(String[] args) {
ConfigurableApplicationContext count = SpringApplication.run(SpringbootDubboConsumerApplication.class, args);
//获取服务提供商的实现
ServiceAPI impl = (ServiceAPI)count.getBean("consumerImpl");
//调用提供者方法
System.out.println(impl.getMessage("你好 dubbo"));
}
}
包结构:
我们的服务消费者也书写完成。
5. 测试
首先启动服务提供者:
然后启动服务消费者:
在控制台看到打印信息,说明我们的服务调用成功了。