上一篇文章《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 官方文档

最新文章

  1. Rafy 框架 - 大批量导入实体
  2. MVC 问答
  3. pvoid64 pvoid
  4. Python自动化运维工具fabric的安装
  5. MAC机常用快捷键整理表格
  6. UIViewController生命周期测试
  7. UbuntuOpenStack core componennts
  8. Android While 循环导致的资源占用过高进而导致程序崩溃问题
  9. (简单) POJ 2253 Frogger,Dijkstra。
  10. 0.0 ABP官方文档翻译目录
  11. “玲珑杯”ACM比赛 Round #19题解&amp;源码【A,规律,B,二分,C,牛顿迭代法,D,平衡树,E,概率dp】
  12. Django中的模板渲染是什么
  13. 浏览器和服务器实现跨域(CORS)判定的原理
  14. Codeforces1101G (Zero XOR Subset)-less 【线性基】【贪心】
  15. CodeVs 1009
  16. Leetcode刷题第003天
  17. Python:判断文本中的用户名在数据库中是否存在,存在返回1,不存在返回0
  18. Beautiful Soup库基础用法(爬虫)
  19. mac 进程和线程工具
  20. hibernate 一级缓存,二级缓存,查询缓存

热门文章

  1. 解决!!-- krb5-libs.x86_64被卸载,yum不能使用,ssh不能连接
  2. Map集合的遍历(利用entry接口的方式)
  3. Kafka 系列(四)—— Kafka 消费者详解
  4. DRF (Django REST framework) 中的视图类
  5. SQL Server 数据完整性的实现——约束
  6. 《Java 8 in Action》Chapter 1:为什么要关心Java 8
  7. SpringCould-------使用Hystrix 实现断路器进行服务容错保护
  8. Python学习 之三 Python基础&amp;运算符
  9. 记录一下vue transition 过渡各状态()
  10. springBoot日志框架自动配置与原理