当前位置: 首页 > news >正文

Alibaba spring cloud Dubbo使用(基于Zookeeper或者基于Nacos+泛化调用完整代码一键启动)

Quick Start

Dubbo!用更优雅的方式来实现RPC调用吧 - 掘金

dubbo+zookeeper demo

项目结构:

在这里插入图片描述

RpcService

仅仅是提供服务的接口:

public interface HelloService {String sayHello(String name);
}

DubboServer

pom:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>DubboServer</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboServer</name><description>DubboServer</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency><!-- Dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.5</version></dependency><!-- Spring Context Extras --><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.12</version></dependency><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 这是个编译java代码的 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration><executions><execution><phase>compile</phase><goals><goal>compile</goal></goals></execution></executions></plugin></plugins></build></project>

DubboServerApplication:

package com.example.dubboserver;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo(scanBasePackages = {"com.example.dubboserver"})
public class DubboServerApplication {public static void main(String[] args) {SpringApplication.run(DubboServerApplication.class, args);}}

HelloServiceImpl实现dubbo服务:

package com.example.dubboserver;import com.alibaba.dubbo.config.annotation.Service;
import com.example.rpcservice.HelloService;
import org.springframework.stereotype.Component;@Component
@Service
public class HelloServiceImpl implements HelloService {@Overridepublic String sayHello(String name) {return "hello " + name + "!";}
}

配置文件application.yaml:

dubbo:application:name: example-providerregistry:address: zookeeper://43.143.229.22:2181protocol:name: dubboport: 20880

zookeeper是我的一台云服务器,zookeeper需要先部署好。

DubboClient

pom文件与Server相似:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.5.5</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>DubboClient</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboClient</name><description>DubboClient</description><properties><java.version>8</java.version></properties><dependencies><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>com.alibaba.boot</groupId><artifactId>dubbo-spring-boot-starter</artifactId><version>0.2.0</version></dependency><!-- Dubbo --><dependency><groupId>com.alibaba</groupId><artifactId>dubbo</artifactId><version>2.6.5</version></dependency><!-- Spring Context Extras --><dependency><groupId>com.alibaba.spring</groupId><artifactId>spring-context-support</artifactId><version>1.0.2</version></dependency><dependency><groupId>org.apache.zookeeper</groupId><artifactId>zookeeper</artifactId><version>3.4.12</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

DubboClientApplication:

package com.example.dubboclient;import com.alibaba.dubbo.config.spring.context.annotation.EnableDubbo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@EnableDubbo(scanBasePackages = {"com.example.dubboclient"})
public class DubboClientApplication {public static void main(String[] args) {SpringApplication.run(DubboClientApplication.class, args);}}

RpcService:

package com.example.dubboclient;import com.alibaba.dubbo.config.annotation.Reference;
import com.example.rpcservice.HelloService;
import org.springframework.stereotype.Service;@Service
public class RpcService {@Referenceprivate HelloService helloService;public String getHelloServiceResponse(String name) {return helloService.sayHello(name);}
}

通过Reference注解标识这是一个dubbo服务接口。

TriggerController:(通过get方法触发dubbo调用,debug用)

package com.example.dubboclient;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
@RequestMapping("/demo/dubbo")
public class TriggerController {@Autowiredprivate RpcService rpcService;@GetMapping("/{name}")public String getTime(@PathVariable("name") String name) {return rpcService.getHelloServiceResponse(name);}}

配置文件:

server:port: 8081
dubbo:application:name: example-consumerregistry:address: zookeeper://43.143.229.22:2181client: curatorprotocol:name: dubboserver: falseconsumer:timeout: 3000

dubbo使用nacos作为注册中心

dubbo也可以用nacos作为注册中心。使用docker一键启动nacos2: docker run --name nacos-quick -e MODE=standalone -p 8848:8848 -p 9848:9848 -p 9849:9849 -d nacos/nacos-server:2.0.2 ,如果是部署在云服务器上的话记得防火墙暴露接口。

client和server的代码与上面zookeeper的一致,但是依赖和配置换了,依赖采用alibaba-spring-cloud来提供。这里我为了方便没有创建父项目写dependencyManagement,而是直接在子项目写来管理包版本,这种做法不是很规范。

Server

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/></parent><groupId>com.example</groupId><artifactId>DubboServer</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboServer</name><description>DubboServer</description><properties><spring-cloud-clibaba.version>2021.0.1.0</spring-cloud-clibaba.version><spring-cloud.version>2021.0.1</spring-cloud.version></properties><dependencyManagement><dependencies><!-- spring cloud 版本控制 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 版本控制 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-clibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos 配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><!-- 这是个编译java代码的 --><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><version>3.2</version><configuration><source>1.8</source><target>1.8</target><encoding>UTF-8</encoding></configuration><executions><execution><phase>compile</phase><goals><goal>compile</goal></goals></execution></executions></plugin></plugins></build></project>

application.yaml:

spring:main:# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖allow-circular-references: trueapplication:name: demo-servercloud:nacos:config:enable: falsediscovery:server-addr: 123.56.98.228:8848namespace: publicdubbo:consumer:retries: 5protocol:port: -1name: dubboscan:# 扫描实现类的包路径(可配置多个或数组)base-packages: com.example.dubboserver # 更改为自己dubbo实现类的路径registry:address: nacos://${spring.cloud.nacos.discovery.server-addr}?namespace=${spring.cloud.nacos.discovery.namespace}cloud:# 默认*订阅所有, 所以在此处写一个不存在的提供者# (可订阅多个用,隔开或者用数组的配置方式 -: name)subscribed-services: "-"

client

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.6.3</version><relativePath/></parent><groupId>com.example</groupId><artifactId>DubboClient</artifactId><version>0.0.1-SNAPSHOT</version><name>DubboClient</name><description>DubboClient</description><properties><spring-cloud-clibaba.version>2021.0.1.0</spring-cloud-clibaba.version><spring-cloud.version>2021.0.1</spring-cloud.version></properties><dependencyManagement><dependencies><!-- spring cloud 版本控制 --><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency><!-- spring cloud alibaba 版本控制 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-alibaba-dependencies</artifactId><version>${spring-cloud-clibaba.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><dependencies><dependency><groupId>com.example</groupId><artifactId>RpcService</artifactId><version>0.0.1-SNAPSHOT</version><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId></dependency><!-- nacos 配置 --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId></dependency><!-- dubbo --><dependency><groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-dubbo</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>

application.yaml:

spring:main:# spring boot 2.6.3默认不允许循环依赖, dubbo的这个版本存在循环依赖allow-circular-references: trueapplication:name: demo-clientcloud:nacos:config:enable: falsediscovery:server-addr: 123.56.98.228:8848namespace: publicdubbo:consumer:retries: 5protocol:port: -1name: dubbo # 协议名称

测试

先上nacos看看服务 ip:8848/nacos:

在这里插入图片描述

其中有一个是dubbo自己的服务,剩下三个一个是client应用,一个是server应用,一个是暴露的RpcService服务。

浏览器输入:http://localhost:8080/demo/dubbo/dsasdfaasdf

响应:

在这里插入图片描述

没啥问题。

dubbo泛化调用

dubbo泛化调用即在调用方不引入服务方接口包的情况下直接调用服务接口。

适用场景:

比如你做了一个网关项目,网关需要调用后端的多个服务的多个接口,这些接口假如都是dubbo,网关需要引入所有服务的接口包才能调用,这显然不太合理,网关的代码应该和后端服务解耦。

那如何实现泛化调用呢?

  1. 服务方不需要更改配置。
  2. 调用方更改rpc调用的代码。

不使用泛化调用的代码:

@Service
public class RpcService {@Referenceprivate HelloService helloService; // 普通调用public String getHelloServiceResponse(String name) {return helloService.sayHello(name); // 普通调用}
}

改为泛化调用:

@Service
public class RpcService {@DubboReference(interfaceName = "com.example.rpcservice.HelloService", generic = true)private GenericService genericService;public String getHelloServiceResponse(String name) {Object res = genericService.$invoke("sayHello" , new String[]{"java.lang.String"},new Object[]{name});return (String) res;}
}

可以看到将原本的具体的Service接口改为了GenericService, @DubboReference中写明了调用的接口全限定名称,并且generic打开为true。

至此完成泛化调用改动,还是挺简单的。

相关文章:

  • FloodFill算法——图像渲染
  • 第十二届蓝桥杯省赛CC++ 研究生组
  • ubuntu2310制作离线源
  • GraphPad Prism 10:一站式数据分析解决方案
  • Linux设备驱动开发 - 三色LED呼吸灯分析
  • 算法体系-15 第十五节:贪心算法(下)
  • Python之Web开发中级教程----ubuntu安装MySQL
  • 【C语言基础篇】内存处理函数(二)memove的介绍及模拟实现
  • WebClient上载文件——实现将本地文件同步到远端服务器上
  • 是德科技keysight N1912A双通道功率计
  • jvm提供的远程调试 简单使用
  • docker基础(七)之docker start/stop/kill/restart/pause/unpause
  • 两款新春烟花代码-烟花模拟器网站源码
  • DashScope - 阿里模型服务灵积
  • Springboot+vue的四川美食分享网站+数据库+报告+免费远程调试
  • [原]深入对比数据科学工具箱:Python和R 非结构化数据的结构化
  • 「译」Node.js Streams 基础
  • 【140天】尚学堂高淇Java300集视频精华笔记(86-87)
  • avalon2.2的VM生成过程
  • HTTP那些事
  • Linux CTF 逆向入门
  • python 学习笔记 - Queue Pipes,进程间通讯
  • Python中eval与exec的使用及区别
  • Vue 动态创建 component
  • Vue.js 移动端适配之 vw 解决方案
  • Vue实战(四)登录/注册页的实现
  • 关于Java中分层中遇到的一些问题
  • 汉诺塔算法
  • 后端_MYSQL
  • 入门到放弃node系列之Hello Word篇
  • 试着探索高并发下的系统架构面貌
  • 小程序 setData 学问多
  • 怎么将电脑中的声音录制成WAV格式
  • 最近的计划
  • ​一些不规范的GTID使用场景
  • $(function(){})与(function($){....})(jQuery)的区别
  • (Ruby)Ubuntu12.04安装Rails环境
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)ssm航空客运订票系统 毕业设计 141612
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (六)vue-router+UI组件库
  • (区间dp) (经典例题) 石子合并
  • (三)Honghu Cloud云架构一定时调度平台
  • (十六)串口UART
  • (原)Matlab的svmtrain和svmclassify
  • (转)负载均衡,回话保持,cookie
  • .halo勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .Net - 类的介绍
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .net Application的目录
  • .net mvc部分视图
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • [ C++ ] STL_list 使用及其模拟实现
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析