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。

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/769999.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EDR下的线程安全

文章目录 前记进程断链回调执行纤程内存属性修改early birdMapping后记reference 前记 触发EDR远程线程扫描关键api&#xff1a;createprocess、createremotethread、void&#xff08;指针&#xff09;、createthread 为了更加的opsec&#xff0c;尽量采取别的方式执行恶意代…

【Flutter学习笔记】10.3 组合实例:TurnBox

参考资料&#xff1a;《Flutter实战第二版》 10.3 组合实例&#xff1a;TurnBox 这里尝试实现一个更为复杂的例子&#xff0c;其能够旋转子组件。Flutter中的RotatedBox可以旋转子组件&#xff0c;但是它有两个缺点&#xff1a; 一是只能将其子节点以90度的倍数旋转二是当旋转…

2002-2023年各地级市环境规制强度数据(环保词频统计)

2002-2023年各地级市环境规制强度数据&#xff08;环保词频统计&#xff09; 1、时间&#xff1a;2002-2023年 2、来源&#xff1a;政府工作报告 3、指标&#xff1a; 行政区划代码、年份、城市、所属省份、文本总长度、仅中英文-文本总长度、文本总词频-全模式、文本总词频…

瑞_23种设计模式_职责链模式

文章目录 1 责任链模式&#xff08;Chain of Responsibility Pattern&#xff09;★★★1.1 介绍1.2 概述1.3 职责链模式的结构1.4 职责链模式的优缺点1.5 职责链模式的使用场景 2 案例一2.1 需求2.2 代码实现 3 案例二3.1 需求3.2 代码实现 4 JDK源码解析&#xff08;FilterCh…

软件测试 - postman高级使用

断言 概念&#xff1a;让程序代替人判断测试用例执行的结果是否符合预期的一个过程 特点&#xff1a; postman断言使用js编写&#xff0c;断言写在postman的tests中 tests脚本在发送请求之后执行&#xff0c;会把断言的结果最终在testresult中进行展示 常用的postman提供的…

C++剑指offer与高频面试题源码解答与分析

这是博主在当初秋招刷题时候记录的剑指offer第二版以及一些高频题的C源码和解法分析&#xff0c;可以说把这上面的题练好了面试不虚&#xff0c;最后也顺利帮助我拿下baidu ali meituan等多家大厂offer。整篇文章写了大概5W个字&#xff0c;也是积累了很长一段时间的作品&#…

SpringMVC | Spring MVC中的“拦截器”

目录: 一、拦截器 &#xff1a;1. 拦截器的 “概述”2. 拦截器的 “定义” (创建“拦截器”对象)3. 拦截器的 “配置” (让“拦截器”对象生效)4. 拦截器的 “执行流程”“单个拦截器”的执行流程“多个拦截器”的执行流程 二、应用案例一实现用户登录权限验证 作者简介 &#…

ssm006基于java的少儿编程网上报名系统+vue

少儿编程网上报名系统 摘 要 在国家重视教育影响下&#xff0c;教育部门的密确配合下&#xff0c;对教育进行改革、多样性、质量等等的要求&#xff0c;使教育系统的管理和运营比过去十年前更加理性化。依照这一现实为基础&#xff0c;设计一个快捷而又方便的网上少儿编程网上…

利用PSR,三步实现业务快速加载

01 什么是PSR PSR是通信业界在BSS/OSS域面向产品设计和业务开通过程中提出的一个标准化信息分层解耦和映射的框架&#xff0c;按照国际电信论坛TMF推荐的SID信息框架的标准&#xff0c;主要分为产品域、服务域和资源域等三层&#xff0c;支撑通信业务的快速加载和敏捷开通。 TM…

vscode下c++的boost库安装

Boost Downloadshttps://www.boost.org/users/download/下载最新的库文件。在shell中&#xff0c;使用命令bootstrap.bat gcc生成b2.exe文件。然后是.\b2.exe toolsetgcc生成库文件&#xff0c;在stage\lib文件夹下把stage\lib文件夹中的库文件拷贝到mingw64\x86_64-w64-mingw3…

Spring Boot + MyBatis

一、配置依赖 <!-- MyBatis --> <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>3.5.3</version> </dependency> <!-- junit测试依赖 --&g…

【C语言】【Leetcode】88. 合并两个有序数组

文章目录 一、题目二、思路再思考 一、题目 链接: link 二、思路 这题属于简单题&#xff0c;比较粗暴的做法就是直接比较两个数组&#xff0c;先把第二个数组加到第一个的后面&#xff0c;如何冒泡排序&#xff0c;这种方法简单粗暴但有效&#xff0c;可是不适用于这题&…

Python利用Turtle小乌龟实现推箱子游戏

文章目录&#xff1a; 一&#xff1a;运行效果 1.演示 2.思路和功能 二&#xff1a;代码 文件架构 level.py PushBox.py 必备知识&#xff1a;python图形化编程turtle小乌龟 一&#xff1a;运行效果 1.演示 效果图◕‿◕✌✌✌ Python利用Turtle小乌龟实现推箱子游戏运…

python5:基于多进程的并发编程、基于协程的并发编程的学习笔记

进程 为什么要使用多进程&#xff1f;——GIL的存在&#xff0c;多线程实际不是并发执行 将任务分为两类&#xff1a;IO密集型&#xff08;多线程&#xff09;CPU密集型&#xff08;多进程&#xff09; 多进程的基本用法 concurrent.futures.process.ProcessPoolExecutor#进…

程序员35岁会失业吗?‍

程序员35岁会失业吗&#xff1f;&#x1f468;‍&#x1f4bb;&#x1f552; 程序员35岁会失业吗&#xff1f;&#x1f468;‍&#x1f4bb;&#x1f552;摘要引言技术更新与个人适应性持续学习的重要性实用学习方法 职业发展路径多样性职业转型的机会实践案例分享 企业文化与就…

【SpringBoot】如何定义接口

定义get接口 使用GetMapping定义一个基本get接口 RestController //表示定义一个json格式返回给前端 public class test {private Map<String,Object> map new HashMap<>();GetMapping(value "/test") //定义接口路径public Object userInfo(Strin…

代码随想录训练营Day32:● 122.买卖股票的最佳时机II ● 55. 跳跃游戏 ● 45.跳跃游戏II

122.买卖股票的最佳时机II 题目链接 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/ 题目描述 思路 看完视频讲解之后豁然开朗啊简直了&#xff01;&#xff01;&#xff01; 统计后一天减去前一天&#xff0c;差值为正数的&#xff0c;再…

图论基础|417. 太平洋大西洋水流问题、827.最大人工岛、127. 单词接龙

目录 417. 太平洋大西洋水流问题 827.最大人工岛 127. 单词接龙 417. 太平洋大西洋水流问题 题目链接(opens new window) 有一个 m n 的矩形岛屿&#xff0c;与 太平洋 和 大西洋 相邻。 “太平洋” 处于大陆的左边界和上边界&#xff0c;而 “大西洋” 处于大陆的右边界…

css的active事件在手机端不生效的解决方法

需求&#xff1a;需求就是实现点击图中的 “抽奖” 按钮&#xff0c;实现一个按钮Q弹的放大缩小动画 上面是实现的效果&#xff0c;pc端&#xff0c;点击触发 :active 问题&#xff1a;但是这种方式在模拟器上可以&#xff0c;真机H5一调试就没生效了&#xff0c;下面是简单…

数据结构·二叉树(1)

目录 1 树的概念及结构 1.1 树的结构 1.2 树的概念 1.3树的表示 2 二叉树的概念及结构 2.1二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的存储结构 1 树的概念及结构 1.1 树的结构 前面所学到的顺序表链表等&#xff0c;都是线性的数据结构&#xff0c;今天介绍的树&am…