Dubbo Spring Cloud 之 HTTP 实战
上一篇文章《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
***
org.springframework.boot
spring-boot-starter-actuator
org.springframework.boot
spring-boot-starter-web
com.alibaba.cloud
spring-cloud-starter-alibaba-nacos-discovery
org.projectlombok
lombok
true
org.springframework.boot
spring-boot-starter-test
test
1.2 创建子工程dubbo_provider_web,服务提供方
工程依赖pom.xml如下:
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/pom.xml
***
com.springcloud
dubbo_api
${project.version}
com.alibaba.cloud
spring-cloud-starter-dubbo
这里引入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 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 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
***
com.springcloud
dubbo_api
${project.version}
org.springframework.cloud
spring-cloud-starter-openfeign
配置文件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 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 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 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 官方文档
扫描二维码关注「极客挖掘机」公众号!
作者:极客挖掘机
定期发表作者的思考:技术、产品、运营、自我提升等。
本文版权归作者极客挖掘机和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
如果您觉得作者的文章对您有帮助,就来作者个人小站逛逛吧:极客挖掘机
分类: Alibaba, dubbo, javahttps://www.cnblogs.com/babycomeon/p/11553757.html