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

Dubbo Spring Cloud 之 HTTP 实战的更多相关文章

  1. Spring Cloud Alibaba入门实战之nacos(一)

    Spring Cloud Alibaba入门实战之nacos(一) 前情介绍 ​ Spring Cloud Alibaba 是阿里巴巴提供的新一代的微服务解决方案,相信会有越来越多采用微服务架构的公司 ...

  2. 从0开始构建你的api网关--Spring Cloud Gateway网关实战及原理解析

    API 网关 API 网关出现的原因是微服务架构的出现,不同的微服务一般会有不同的网络地址,而外部客户端可能需要调用多个服务的接口才能完成一个业务需求,如果让客户端直接与各个微服务通信,会有以下的问题 ...

  3. Spring Cloud Sleuth进阶实战

    转载请标明出处: http://blog.csdn.net/forezp/article/details/76795269 本文出自方志朋的博客 为什么需要Spring Cloud Sleuth 微服 ...

  4. java/spring boot/dubbo/spring cloud/微服务/SOA/分布式经典电子书籍pdf下载

    微服务系列 官方文档是最好的资料了. spring cloud官方文档:https://cloud.spring.io/spring-cloud-static/Greenwich.RELEASE/si ...

  5. 【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

    一.写在前面   相信不少朋友都在自己公司使用Spring Cloud框架来构建微服务架构,毕竟现在这是非常火的一门技术. 如果只是用户量很少的传统IT系统,使用Spring Cloud可能还暴露不出 ...

  6. Spring Cloud 微服务实战

    Eureka 服务治理 Maven dependency 与spring boot的版本的对应 Finchley兼容Spring Boot 2.0.x,不兼容Spring Boot 1.5.x Dal ...

  7. Spring Cloud微服务实战:手把手带你整合eureka&zuul&feign&hystrix

    转载自:https://www.jianshu.com/p/cab8f83b0f0e 代码实现:https://gitee.com/ccsoftlucifer/springCloud_Eureka_z ...

  8. Dubbo Spring Cloud Motan

    跨语言统一治理.Golang,谈谈另辟蹊径的开源RPC框架Motan_搜狐科技_搜狐网 https://www.sohu.com/a/207389967_467759

  9. Dubbo 与 Spring Cloud 完美结合

    Dubbo 与 Spring Cloud 完美结合 1. 概述 可能说起来Dubbo,很多人都不陌生,这毕竟是一款从2012年就开始开源的Java RPC框架,中间由于各种各样的原因停止更新4年半的时 ...

随机推荐

  1. Salesforce LWC学习(四) 父子component交互 / component声明周期管理 / 事件处理

    我们在上篇介绍了 @track / @api的区别.在父子 component中,针对api类型的变量,如果声明以后就只允许在parent修改,son component修改便会导致报错. sonIt ...

  2. 编译Assimp傻瓜教程

    assimp的编译过程和搭建OpenGL环境时glfw的编译基本相同,建议先阅读环境搭建 下载源码 这里使用的是3.3.1版本,Github下载assimp源码 解压完你会得到 接下来我们要编译这些源 ...

  3. 关于阿里云Mysql分页查询不走索引的问题

    需要修改阿里云中的MYSQL 配置参数 : eq_range_index_dive_limit 阿里云上默认是 10 , 这个参数 表示 in 查询 条件超过 10 个 就不走索引,走全表扫描.如果我 ...

  4. Unity进阶之ET网络游戏开发框架 04-资源打包

    版权申明: 本文原创首发于以下网站: 博客园『优梦创客』的空间:https://www.cnblogs.com/raymondking123 优梦创客的官方博客:https://91make.top ...

  5. DRF (Django REST framework) 中的Request 与 Response

    DRF中的Request 与 Response 1. Request - REST framework 传入视图的request对象不再是Django默认的HttpRequest对象,而是REST f ...

  6. Redux概览

    简介 Redux 是一个有用的架构 Redux 的适用场景:多交互.多数据源 工作流程图 action 用户请求 //发出一个action import { createStore } from 'r ...

  7. 一个最简单的通过自定义注解形式实现AOP的例子

    1.首先实现AOP实例的第一步即声明切面类,两种方式(1.基于注解形式@Aspect,2.基于xml配置,一般都通过注解来声明切面类) 2.切入点表达式大致也有两种,一种是直接根据方法的签名来匹配各种 ...

  8. tf.name_scope() 和 tf.variable_scope() 的用法和玄机

    https://my.oschina.net/liusicong/blog/1593467

  9. 使用CodeBenchmark对逻辑代码进行并发测试

    一直对性能测试比较感兴趣,所以也写了不少的测试工具有WebApiBenchmark和TcpBenchmark等;但这些工具测试都是有针对性和配置的方式来进行功能有限所以很难适用更多的场景,所以单独开发 ...

  10. 「每日五分钟,玩转JVM」:线程共享区

    前言 上一篇中,我们了解了JVM中的线程独占区,这节课我们就来了解一下JVM中的线程共享区,JVM中的线程共享区是跟随JVM启动时一起创建的,包括堆(Heap)和方法区()两部分,而线程独占区的程序计 ...