分类信息网站做推广,vi设计手册模板ppt,网站 建设 申请报告,做网站的eclip很早以前#xff0c;在刚开始搞Spring Cloud基础教程的时候#xff0c;写过这样一篇文章#xff1a;《微服务架构的基础框架选择#xff1a;Spring Cloud还是Dubbo#xff1f;》#xff0c;可能不少读者也都看过。之后也就一直有关于这两个框架怎么选的问题出来#xff…很早以前在刚开始搞Spring Cloud基础教程的时候写过这样一篇文章《微服务架构的基础框架选择Spring Cloud还是Dubbo》可能不少读者也都看过。之后也就一直有关于这两个框架怎么选的问题出来其实文中我有明确的提过Spring Cloud与Dubbo的比较本身是不公平的主要前者是一套较为完整的架构方案而Dubbo只是服务治理与RPC实现方案。
由于Dubbo在国内有着非常大的用户群体但是其周边设施与组件相对来说并不那么完善。很多开发者用户又很希望享受Spring Cloud的生态因此也会有一些Spring Cloud与Dubbo一起使用的案例与方法出现但是一直以来大部分Spring Cloud整合Dubbo的使用方案都比较别扭。这主要是由于Dubbod的注册中心采用了ZooKeeper而开始时Spring Cloud体系中的注册中心并不支持ZooKeeper所以很多方案是存在两个不同注册中心的之后即使Spring Cloud支持了ZooKeeper但是由于服务信息的粒度与存储也不一致。所以长期以来在服务治理层面上这两者一直都一套完美的融合方案。
直到Spring Cloud Alibaba的出现才得以解决这样的问题。在之前的教程中我们已经介绍过使用Spring Cloud Alibaba中的Nacos来作为服务注册中心并且在此之下可以如传统的Spring Cloud应用一样地使用Ribbon或Feign来实现服务消费。这篇我们就来继续说说Spring Cloud Alibaba下额外支持的RPC方案Dubbo。
入门案例
我们先通过一个简单的例子来直观地感受Nacos服务注册中心之下利用Dubbo来实现服务提供方与服务消费方。这里省略Nacos的安装与使用如果对Nacos还不了解可以查看本系列的使用Nacos实现服务注册与发现下面就直接进入Dubbo的使用步骤。
构建服务接口
创建一个简单的Java项目并在下面定义一个抽象接口比如
public interface HelloService { String hello(String name);}构建服务接口提供方
第一步创建一个Spring Boot项目在pom.xml中引入第一步中构建的API包以及Spring Cloud Alibaba对Nacos和Dubbo的依赖比如
dependencies !-- 第一步中构建的API包 -- dependency groupIdcom.didispace/groupId artifactIdalibaba-dubbo-api/artifactId version0.0.1-SNAPSHOT/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency !--groupIdcom.alibaba.cloud/groupId-- groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-dubbo/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency //.../dependencies这里需要注意两点
必须包含spring-boot-starter-actuator包不然启动会报错。spring-cloud-starter-dubbo包需要注意groupId根据具体使用的spring cloud alibaba版本依赖来确定。 项目孵化期间使用的groupId为org.springframework.cloud项目孵化之后使用的groupId修改为了com.alibaba.cloud所以用户需要注意是否使用正确。避免加载不到对应JAR包的问题。
第二步实现Dubbo接口
Servicepublic class HelloServiceImpl implements HelloService { Override public String hello(String name) { return hello name; }}注意这里的Service注解不是Spring的而是org.apache.dubbo.config.annotation.Service注解。
第三步配置Dubbo服务相关的信息比如
spring.application.namealibaba-dubbo-serverserver.port8001spring.cloud.nacos.discovery.server-addr127.0.0.1:8848# 指定 Dubbo 服务实现类的扫描基准包dubbo.scan.base-packagescom.didispace.alibaba.dubbo.serverdubbo.protocol.namedubbodubbo.protocol.port-1dubbo.registry.addressspring-cloud://localhost配置说明如下
dubbo.scan.base-packages: 指定 Dubbo 服务实现类的扫描基准包dubbo.protocol: Dubbo 服务暴露的协议配置其中子属性 name 为协议名称port 为协议端口 -1 表示自增端口从 20880 开始dubbo.registry: Dubbo 服务注册中心配置其中子属性 address 的值 “spring-cloud://localhost”说明挂载到 Spring Cloud 注册中心
注意如果使用Spring Boot 2.1及更高版本时候需要增加配置spring.main.allow-bean-definition-overridingtrue
第四步创建应用主类比如
EnableDiscoveryClientSpringBootApplicationpublic class DubboServerApplication { public static void main(String[] args) { SpringApplication.run(DubboServerApplication.class, args); }}构建服务接口消费方
第一步创建一个Spring Boot项目在pom.xml中引入第一步中构建的API包以及Spring Cloud Alibaba对Nacos和Dubbo的依赖具体内容与服务提供方一致
dependencies !-- 第一步中构建的API包 -- dependency groupIdcom.didispace/groupId artifactIdalibaba-dubbo-api/artifactId version0.0.1-SNAPSHOT/version /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId /dependency dependency !--groupIdcom.alibaba.cloud/groupId-- groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-dubbo/artifactId /dependency dependency groupIdorg.springframework.cloud/groupId artifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId /dependency //.../dependencies第二步配置Dubbo服务相关的信息比如
spring.application.namealibaba-dubbo-clientserver.port8002spring.cloud.nacos.discovery.server-addr127.0.0.1:8848dubbo.protocol.namedubbodubbo.protocol.port-1dubbo.registry.addressspring-cloud://localhostdubbo.cloud.subscribed-servicesalibaba-dubbo-server注意
这里多增加了dubbo.cloud.subscribed-services参数表示要订阅服务的服务名这里配置的alibaba-dubbo-server对应的就是上一节服务提供方的spring.application.name的值也就是服务提供方的应用名。如果使用Spring Boot 2.1及更高版本时候需要增加配置spring.main.allow-bean-definition-overridingtrue。
第三步创建应用主类并实现一个接口在这个接口中调用Dubbo服务比如
EnableDiscoveryClientSpringBootApplicationpublic class DubboClientApplication { public static void main(String[] args) { SpringApplication.run(DubboClientApplication.class, args); } Slf4j RestController static class TestController { Reference HelloService helloService; GetMapping(/test) public String test() { return helloService.hello(didispace.com); } }}注意这里的Reference注解是org.apache.dubbo.config.annotation.Reference
测试验证
完成了上面的所有开发之后我们可以将Nacos、服务提供者、服务消费者依次启动起来。在完成启动之后我们可以在Nacos控制台的服务列表中看到上面定义的两个服务比如 接下来我们就可以通过调用服务消费者中定义的/test接口来触发dubbo服务的消费了。如果一切顺畅应该可以得到如下结果
$ curl localhost:8002/testhello didispace.com小结
通过上面的例子如果你曾经同时玩过Spring Cloud和Dubbo一定会深有感触。你不用再同时顾虑Eureka和Zookeeper的配置也不同同时关注这两个中间件的健康只需要关注和维护好Nacos一个即可。而对于Dubbo的配置和使用来说配置还是相当简单的而代码编写上与以往的Dubbo没什么大的不同。在Spring Cloud Alibaba的整合之下Dubbo用户既可以享受到原本RPC带来性能优势又可以更好的享受Spring Cloud的各种福利而对于Spring Cloud用户来说在服务治理层面又对了一个不错的可选项。可以说这块的整合是真正的让这两大用户群体得到了很好的融合起到了互相成就的作用。
参考资料官方文档
代码示例
本文介绍内容的客户端代码示例读者可以通过查看下面仓库中的alibaba-dubbo-api、alibaba-dubbo-server、alibaba-dubbo-client项目
Githubhttps://github.com/dyc87112/SpringCloud-Learning/Giteehttps://gitee.com/didispace/SpringCloud-Learning/
如果您对这些感兴趣欢迎star、follow、收藏、转发给予支持