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
<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. 示例代码
4. 参考
Dubbo Spring Cloud 之 HTTP 实战的更多相关文章
- Spring Cloud Alibaba入门实战之nacos(一)
Spring Cloud Alibaba入门实战之nacos(一) 前情介绍 Spring Cloud Alibaba 是阿里巴巴提供的新一代的微服务解决方案,相信会有越来越多采用微服务架构的公司 ...
- 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析
API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...
- Spring Cloud Sleuth进阶实战
转载请标明出处: http://blog.csdn.net/forezp/article/details/76795269 本文出自方志朋的博客 为什么需要Spring Cloud Sleuth 微服 ...
- java/spring boot/dubbo/spring cloud/微服务/SOA/分布式经典电子书籍pdf下载
微服务系列 官方文档是最好的资料了. spring cloud官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.RELEASE/si ...
- 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
一.写在前面 相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这是非常火的一门技术. 如果只是用户量很少的传统IT系统,使用Spring Cloud可能还暴露不出 ...
- Spring Cloud 微服务实战
Eureka 服务治理 Maven dependency 与spring boot的版本的对应 Finchley兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x Dal ...
- Spring Cloud微服务实战:手把手带你整合eureka&zuul&feign&hystrix
转载自:https://www.jianshu.com/p/cab8f83b0f0e 代码实现:https://gitee.com/ccsoftlucifer/springCloud_Eureka_z ...
- Dubbo Spring Cloud Motan
跨语言统一治理.Golang,谈谈另辟蹊径的开源RPC框架Motan_搜狐科技_搜狐网 https://www.sohu.com/a/207389967_467759
- Dubbo 与 Spring Cloud 完美结合
Dubbo 与 Spring Cloud 完美结合 1. 概述 可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时 ...
随机推荐
- EFCore + MySql codeFirst 迁移 Migration出现的问题
第二次使用Migration update-database的时候出现以下错误: System.NotImplementedException: The method or operation is ...
- scrapy xpath用法
一.实验环境 1.Windows7x64_SP1 2.anaconda3 + python3.7.3(anaconda集成,不需单独安装) 3.scrapy1.6.0 二.用法举例 1.开启scrap ...
- rwcheck:为嵌入式设备设计的读写压测工具
我设计的一款读写压测工具,开源在我的github仓库 rwcheck是一个对嵌入式设备进行读写压测的工具 什么是rwcheck 正如其名,rwcheck工具用于读写压测.它是什么工作原理呢?为什么要用 ...
- VS引用文件出现黄色感叹号丢失文件,应该如何解决?
VS是微软开发的一款超级强大的IDE,深受广大.net开发者喜爱. 但是再强大,也会有它的bug和缺点. 多人协同开发时,不知道你有没有遇到一个这样的情况:第二天上班,早早来到公司,打开电脑,拉取一下 ...
- Zookeeper一致性级别
一致性级别划分 关于分布式系统一致性级别的划分,有些文章划分为强一致性,顺序一致性以及弱一致性. 最终一致性属于弱一致性,最终一致性根据更新数据后各进程访问到数据的时间和方式的不同划分为: 因果一致性 ...
- C++标准库函数 end 的实现原理(非类型模板参数)
在刚开始学习<C++ Primer>的时候遇到了 end 函数,感觉很神奇,但又很迷惑:为什么能获得数组的尾后指针呢?编译器也不会在内存中申请一块空间放数组元素的个数啊!最近再一次遇到了 ...
- C#_HttpWebRequest保存cookies模拟登录的方法
CookieContainer cookies = new CookieContainer(); string url = "http://www.google.com.hk/"; ...
- spring全家桶的pom的基本配置
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- Android Studio启动模拟器失败
启动Android Studio的模拟器报“Emulator: Process finished with exit code -1073741819 (0xC0000005)”错误教程: 1.进入该 ...
- 在 Web 级集群中动态调整 Pod 资源限制
作者阿里云容器平台技术专家 王程阿里云容器平台技术专家 张晓宇(衷源) ## 引子 不知道大家有没有过这样的经历,当我们拥有了一套 Kubernetes 集群,然后开始部署应用的时候,我们应该给容器分 ...