上一篇文章《Spring Cloud Alibaba | Dubbo 与 Spring Cloud 完美结合》我们介绍了 Dubbo Spring Cloud 的基本使用,使用的服务中心为 Spring Cloud Alibaba 提供的 Nacos,Dubbo 内部提供了基于 Dubbo 的 RPC 调用,同时,Dubbo Spring Cloud 在整合了 Spring Cloud 之后,可以直接提供 HTTP 接口,同 Spring Cloud 无缝衔接,直接支持 Feign、RestTemplate 等方式的远程调用,在提供 HTTP 服务的同时可以提供 Dubbo 服务。Dubbo Spring Cloud 支持 HTTP 远程调用级大的方便了我们的对接外部系统,无需对 Dubbo 再做二次封装。
1. 案例实战
接下来,我们通过一个简单的案例来介绍一下 Dubbo Spring Cloud 通过注解的方式是如何同时提供 Dubbo 服务和 HTTP 服务的。
1.1 创建父工程 dubbo-spring-cloud-http
工程依赖 pom.xml 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring Cloud Nacos Service Discovery -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
1.2 创建子工程 dubbo_provider_web,服务提供方
工程依赖 pom.xml 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/pom.xml
<dependencies>
<!-- API -->
<dependency>
<groupId>com.springcloud</groupId>
<artifactId>dubbo_api</artifactId>
<version>${project.version}</version>
</dependency>
<!-- Dubbo Spring Cloud Starter -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-dubbo</artifactId>
</dependency>
</dependencies>
这里引入 Dubbo Spring Cloud 工具包和 Dubbo API 依赖包。
配置文件参考上一节配置,这里不再赘述。
接口实现类 UserServiceI.java 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/src/main/java/com/springcloud/dubbo_provider_web/service/UserServiceI.java
@Service(version = "1.0.0")
@RestController
@Slf4j
public class UserServiceI implements UserService {private Map<Long, UserModel> usersRepository = Maps.newHashMap();
@Override
@PostMapping("/save")
public UserModel save(@RequestBody UserModel user) {return usersRepository.put(user.getId(), user);
}
@Override
@DeleteMapping("/remove")
public void remove(@RequestParam("id") Long userId) {usersRepository.remove(userId);
}
@Override
@GetMapping("/findAll")
public Collection<UserModel> findAll() {return usersRepository.values();
}
}
-
@Service
注解有很多有关服务的配置属性,这里使用 version 定义当前接口版本,此处版本仅在 Dubbo 调用时生效,HTTP 调用无效,更多相关配置可以参考源码org.apache.dubbo.config.annotation.Service
。
1.3 创建子工程 spring_cloud_consumer,web 服务消费方
工程依赖 pom.xml 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/pom.xml
<dependencies>
<!-- API -->
<dependency>
<groupId>com.springcloud</groupId>
<artifactId>dubbo_api</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-openfeign</artifactId>
</dependency>
</dependencies>
配置文件 application.yml 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/resources/application.yml
server:
port: 8080
spring:
application:
name: spring-cloud-consumer-server
cloud:
nacos:
discovery:
server-addr: 192.168.44.129:8848
接口测试类 UserController.java 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/java/com/springcloud/spring_cloud_consumer/controller/UserController.java
@RestController
public class UserController {
@Autowired
UserRemote userRemote;
@Autowired
RestTemplate restTemplate;
@PostMapping("/saveByFeign")
public UserModel saveByFeign(@RequestBody UserModel user) {return userRemote.save(user);
}
@DeleteMapping("/removeByFeign")
public void removeByFeign(@RequestParam("id") Long userId) {userRemote.remove(userId);
}
@GetMapping("/findAllByFeign")
public Collection<UserModel> findAllByFeign() {return userRemote.findAll();
}
@PostMapping("/saveByRestTemplate")
public UserModel saveByRestTemplate(@RequestBody UserModel user) {return restTemplate.postForObject("http://dubbo-spring-cloud-provider-web/save/", user, UserModel.class);
}
@DeleteMapping("/removeByRestTemplate")
public void removeByRestTemplate(@RequestParam("id") Long userId) {restTemplate.delete("http://dubbo-spring-cloud-provider-web/remove?id=" + userId);
}
@GetMapping("/findAllByRestTemplate")
public Collection<UserModel> findAllByRestTemplate() {return restTemplate.getForObject("http://dubbo-spring-cloud-provider-web/findAll/", Collection.class);
}
}
共计三个测试接口,这里提供两种测试方式,一种是通过 Feign 调用,另一种是通过 RestTemplate 调用。
SpringCloudConsumerApplication.java 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/spring_cloud_consumer/src/main/java/com/springcloud/spring_cloud_consumer/SpringCloudConsumerApplication.java
@SpringBootApplication
@EnableFeignClients
@EnableDiscoveryClient
public class SpringCloudConsumerApplication {public static void main(String[] args) {SpringApplication.run(SpringCloudConsumerApplication.class, args);
}
@LoadBalanced
@Bean
public RestTemplate restTemplate() {return new RestTemplate();
}
}
使用 @EnableFeignClients
开启 Feign 功能,将 RestTemplate 以 Bean 的形式注入 Spring 中。
1.4 创建子工程 dubbo_consumer 作为 Dubbo 服务的消费方
接口测试类 UserController.java 如下:
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_consumer/src/main/java/com/springcloud/dubbo_consumer/controller/UserController.java
@RestController
public class UserController {@Reference(version = "1.0.0")
UserService userService;
@PostMapping("/save")
public UserModel save(@RequestBody UserModel user) {return userService.save(user);
}
@DeleteMapping("/remove")
public void remove(@RequestParam("id") Long userId) {userService.remove(userId);
}
@GetMapping("/findAll")
public Collection<UserModel> findAll() {return userService.findAll();
}
}
这里 @Reference
注解需指明调用服务提供者接口的版本号,如果未指明版本号,将无法调用我们前面的服务提供者的接口。
2. 测试
我们使用测试工具 PostMan 进行测试,顺次启动三个子工程 provider_web、spring_cloud_consumer 和 dubbo_consumer,首先测试组件 Feign 访问,使用 PostMan 向:http://localhost:8080/saveByFeign 发送 POST 请求,如图:
测试链接:http://localhost:8080/findAllByFeign,如图:
测试 RestTemplate 访问,如图:
至此,spring_cloud_consumer 测试成功,下面继续测试 dubbo_consumer,如图:
3. 示例代码
示例代码 -Github
示例代码 -Gitee
4. 参考
Dubbo Spring Cloud 官方文档