上一篇文章《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再作二次封装。html
接下来,咱们经过一个简单的案例来介绍一下Dubbo Spring Cloud经过注解的方式是如何同时提供Dubbo服务和HTTP服务的。java
工程依赖pom.xml以下:git
代码清单:Alibaba/dubbo-spring-cloud-http/pom.xmlgithub
<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>
工程依赖pom.xml以下:web
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/pom.xmlspring
<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依赖包。apache
配置文件参考上一节配置,这里再也不赘述。api
接口实现类UserServiceI.java以下:app
代码清单:Alibaba/dubbo-spring-cloud-http/dubbo_provider_web/src/main/java/com/springcloud/dubbo_provider_web/service/UserServiceI.javaide
@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
。工程依赖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中。
接口测试类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
注解需指明调用服务提供者接口的版本号,若是未指明版本号,将没法调用咱们前面的服务提供者的接口。
咱们使用测试工具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,如图:
原文出处:https://www.cnblogs.com/babycomeon/p/11553757.html