上一篇文章《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. EventEmitter的前端实现

    EventEmitter简介 EventEmitter是Node.js的内置模块events提供的一个类,它是Node事件流的核心,EventEmitter是服务端的东西, 前端已经有event-em ...

  2. Spring Cloud Gateway 服务网关快速上手

    Spring Cloud Gateway 服务网关 API 主流网关有NGINX.ZUUL.Spring Cloud Gateway.Linkerd等:Spring Cloud Gateway构建于 ...

  3. F#周报2019年第33期

    新闻 宣告.NET Core 3.0预览版8 新的fable.io站点伴随着更多文档发布 正在努力使你的团队相信F#的益处?Compositional IT能够提供帮助 提名2019年度F#社区英雄 ...

  4. Go_笔试题记录-不熟悉的

    1.golang中没有隐藏的this指针,这句话的含义是() A. 方法施加的对象显式传递,没有被隐藏起来 B. golang沿袭了传统面向对象编程中的诸多概念,比如继承.虚函数和构造函数 C. go ...

  5. hbase rowkey 设计

    HBase中的rowkey是按字典顺序排序的,通过rowkey查询可以对千万级的数据实现毫秒级响应.然而,如果rowkey设计不合理的话经常会出现一个很普遍的问题----热点.当大量client的请求 ...

  6. 你是否真的了解全局解析锁(GIL)

    关于我 一个有思想的程序猿,终身学习实践者,目前在一个创业团队任team lead,技术栈涉及Android.Python.Java和Go,这个也是我们团队的主要技术栈. Github:https:/ ...

  7. javascript导出csv文件(excel)

    这里贴出JavaScript导出csv文件(excel)的代码. /** * 导出excel * @param {Object} title 标题列key-val * @param {Object} ...

  8. java 局部变量成员变量区别

    首先,成员变量可直接初始化(即赋值),也可不赋值,不赋值java按照以下类型自动赋值 局部变量调用前必须初始化(赋值),java不会自动处理 局部变量可以和成员变量重名(但不建议),如果在当前对象的方 ...

  9. Java和Tomcat安装教程

    jdk安装与配置1.下载好对应的jdk2.安装JDK 直接运行exe可执行程序,默认安装即可:备注:路径可以选其他盘符,路径要全部为英文. 3.配置环境变量 新建变量名:JAVA_HOME,变量值:D ...

  10. Redis学习总结(三)--Redis持久化

    Redis 是将数据存储在内存中的,如果出现断电或系统故障的时候数据就会存在丢失的现象,Redis通过将数据持久化到硬盘中来避免这个问题的出现,我们今天就来学习下 Redis 持久化. Redis 持 ...