东莞手机网站设计公司,在线网页代理太太猫,大连黄页企业名录,门户网站建设方案是什么意思文章目录 概念整理基本概念概念助记前提RPC与HTTP类比RPC接口类的一些理解 实例代码主体结构父项目公共接口项目提供者项目项目结构POM文件实现配置文件实现公共接口实现程序入口配置启动项目检查是否可以注入到Nacos 消费者项目项目结构POM文件实现配置文件实现注册RPC服务类实… 文章目录 概念整理基本概念概念助记前提RPC与HTTP类比RPC接口类的一些理解 实例代码主体结构父项目公共接口项目提供者项目项目结构POM文件实现配置文件实现公共接口实现程序入口配置启动项目检查是否可以注入到Nacos 消费者项目项目结构POM文件实现配置文件实现注册RPC服务类实例运行结果 概念整理
基本概念
RPC可以理解为一种网络服务调用形式具有服务提供方服务调用方调用功能请求参数和响应参数的类似概念RPC有多种实现途径或组合框架Nacos Dubbo只是一种比较简单的实现方式相比于HTTP请求 RPC更适合在微服务节点之间进行高效的信息传输。原因之一是在OSI模型中HTTP在第七层RPC在第五层所以RPC实现更加底层处理过程更加简单通讯效率更高。RPC必须要有【服务注册中心】这个组成部分对提供者和消费者之间提供通讯桥梁即提供者和消费者之间没有直连关系 提供者提供RPC服务并注册到服务中心消费者访问服务中心调用其中的RPC服务
概念助记 以下概念不是官方解释仅为了方便第一次接触RPC时方便理解RPC的相关概念 前提
对于普通Spring Boot项目在后台传输信息时服务调用方下称消费者可以直接访通过服务提供方下称提供者提供的公开URL在java后台用Fegin、RestTemplate或者HttpClient工具发起形如get http:\\目标节点IP:端口\functionUrl?param xxxx这样的请求在Spring Cloud项目里引入了【服务中心】各节点都注册到中心里所以调用URL变成了get http:\\目标服务在服务中心的名字\functionUrl?param xxxx可以简单理解HTTP请求操作的中心就是URL而RPC使用接口Interface(就是java原生的那个interface类型)替换对URL的操作
RPC与HTTP类比
RPCHTTP提供者Spring Cloud节点Spring Cloud或Spring Boot节点消费者Spring Cloud节点Spring Cloud或Spring Boot节点服务发现中心必选可选调用目标名服务中心注册名服务中心注册名或目标IP端口调用URL的PathURL接口类的方法名PathURL请求参数接口方法入参path或者body参数响应结果接口方法返回值请求Response的body请求包含其他内容无header状态参数等
RPC接口类的一些理解
RPC接口从代码层面定义一个节点功能的名称入参、返回值等结果相当于定义HTTP请求的RequestMap的路径和Controller的参数和返回值RPC接口对提供者和调用者同时可见RPC接口在提供者内部实现具体的业务逻辑即存在Imp类完成具体的业务功能RPC接口在调用者内部没有实现类但可以像Mybatis的Mapper接口一样注入并调用接口方法实现接口功能可以理解为在Dubbo和Nacos的支持下其他框架也可以调用者内部的接口生成了一个动态代理实例这个实例的内部逻辑就是发起RPC网络请求去执行提供者实现的接口类逻辑。使用起来可以类比Mybatis的Mapper接口只定义Mapper接口但这个接口使用时可以被注入调用方法时也有具体的实现逻辑。
实例代码
主体结构 父项目
父项目没有任何javayml文件仅利用pom.xml限制当前项目各个模块之间的版本统一性具体的NacosSpringBootCloudDubbo版本情况如下 版本一定要配套否则会有各种启动异常 JDK 8Spring boot 2.7.18Spring Cloud 2021.0.6Spring Cloud Alibaba 2021.0.6.0内置 Nacos client 2.2.0dubbo3.2.14
使用Dubbo 3版本引入依赖、项目配置和代码注解都会与Dubbo2有大差异一定要注意。
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionparentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.18/version/parentpackagingpom/packaginggroupIdcom/groupIdartifactIddubbo/artifactIdversion0.0.1-SNAPSHOT/versionnamedubbo/namedescriptiondubbo/descriptionpropertiesjava.version8/java.versionspring-boot.version2.7.18/spring-boot.versionspring-cloud-alibaba.version2021.0.6.0/spring-cloud-alibaba.versionspring.cloud.version2021.0.6/spring.cloud.versiondubbo.version3.2.14/dubbo.versionmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/properties!-- 统一管理配置在此模块下的子模块要引入依赖必须声明groupId和artifactId不需要声明版本--dependencyManagementdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-dependencies/artifactIdversion${spring-boot.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-dependencies/artifactIdversion${spring.cloud.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-alibaba-dependencies/artifactIdversion${spring-cloud-alibaba.version}/versiontypepom/typescopeimport/scope/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-bom/artifactIdversion${dubbo.version}/versiontypepom/typescopeimport/scope/dependency/dependencies/dependencyManagementbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build/project公共接口项目
项目结构 定义公共接口
package com.common;public interface IHelloService {String provider(String content);
}POM文件里可以不用实现任何Dependence不需要在Application.yml中配置任何参数
提供者项目
项目结构 POM文件实现
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIddubbo-provider/artifactIdversion1.0/versionparentgroupIdcom/groupIdartifactIddubbo/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../../dubbo/relativePath/parentdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactId/dependencydependencygroupIdcom/groupIdartifactIddubbo-interface/artifactIdversion0.0.1-SNAPSHOT/versionscopecompile/scope/dependency/dependencies
/project特别注意 1. Nacos的实现包含了nacos-config和nacos-discovery两个包 2. dubbo-spring-boot-starter的groupId是apache不是alibaba 配置文件实现
# SpringCloud服务注册和发现
server:port: 8881
spring:cloud:nacos: #2.3以后Nacos版本都建议配置discovery和config两个discovery:server-addr: localhost:8848config:server-addr: localhost:8848#Dubbo服务实现类的扫描基准包路径
dubbo:application:name: dubbo-providerscan:base-packages: com.provider#Dubbo服务暴露的协议配置protocol:name: dubbo #name为协议名称默认为dubboport: -1 #port为协议端口-1 表示自增端口从 20880 开始registry: # 必须包含此节点配置address: nacos://localhost:8848 # 注意应该nacos开头否则没法注册
公共接口实现
package com.provider;import com.common.IHelloService;
import org.apache.dubbo.config.annotation.DubboService;DubboService //该注解说明当前实现类为RPC服务类
public class HelloServiceImp implements IHelloService {Overridepublic String provider(String content) {System.out.println(into Service1Imp);return 服务提供者- content;}
}程序入口配置
package com.provider;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;EnableDiscoveryClient
SpringBootApplication
//不用再使用EnableDubbo注解
public class ProviderApplication {public static void main(String[] args) {SpringApplication.run(ProviderApplication.class, args);}}启动项目检查是否可以注入到Nacos 消费者项目
项目结构 这里使用JunitTest来验证RPC是否可以正常调用
POM文件实现
?xml version1.0 encodingUTF-8?
project xmlnshttp://maven.apache.org/POM/4.0.0 xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersionartifactIddubbo-customer/artifactIdversion1.0/versionparentgroupIdcom/groupIdartifactIddubbo/artifactIdversion0.0.1-SNAPSHOT/versionrelativePath../../dubbo/relativePath/parentpropertiesjava.version1.8/java.version/propertiesdependenciesdependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-web/artifactId/dependencydependencygroupIdorg.springframework.cloud/groupIdartifactIdspring-cloud-starter-bootstrap/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-config/artifactId/dependencydependencygroupIdcom.alibaba.cloud/groupIdartifactIdspring-cloud-starter-alibaba-nacos-discovery/artifactId/dependencydependencygroupIdorg.apache.dubbo/groupIdartifactIddubbo-spring-boot-starter/artifactId/dependencydependencygroupIdcom/groupIdartifactIddubbo-interface/artifactIdversion0.0.1-SNAPSHOT/versionscopecompile/scope/dependencydependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactIdscopetest/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactId/plugin/plugins/build
/project再次强调 1. Nacos的实现包含了nacos-config和nacos-discovery两个包 2. dubbo-spring-boot-starter的groupId是apache不是alibaba 配置文件实现
server:port: 8882
#Spring配置
spring:application:name: dubbo-consumercloud:discovery: #禁止该服务注册到Nacos服务列表中register-enabled: falsenacos:discovery:server-addr: localhost:8848
dubbo:cloud:subscribed-services: dubbo-provider #表示要订阅服务的服务名若需订阅多应用使用,分割。protocol:name: dubboport: 20881 # 同一台物理机既要启动提供者又要启动消费者时必须指定dubbo端口号如果用默认端口则会冲突registry: #必须要配置此属性否则会启动异常address: nacos://localhost:8848 #必须是nacos开头application:qosEnable: false # 该参数默认为true如果不手工改为false则需要修改qosPort默认端口号防止端口冲突
# qosPort: 8883
# qosAcceptForeignIp: false再次强调 dubbo3版本的消费者必须追以下属性
dubbo.registry.address:dubbo.application.qosEnable:dubbo.application.qosPortdubbo.application.qosAcceptForeignIp
关于Qos配置问题可以参考这篇博客Dubbo启动时qos-server can not bind localhost:22222错误解决
注册RPC服务类实例
package com.customer;import com.common.IHelloService;
import org.apache.dubbo.config.annotation.DubboReference;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;SpringBootTest(webEnvironment SpringBootTest.WebEnvironment.RANDOM_PORT)
public class HelloTest {DubboReferenceprivate IHelloService helloService;Testpublic void RPCTest(){String result helloService.provider(Lily);System.out.println(运行结果 result);}
}运行结果