1. 引入
直连是指不通过注册中心 直接实现服务器和客户端之间的点到点服务
不过我看的案例中服务端都需要将服务写完之后上传到Maven仓库 客户端git之后才能使用 这和本地下载拷贝一个jar在使用有区别吗? 这样能体现rpc调用吗?
2. 项目设计
因为只是想简单的体现Dubbo框架远程调用的功能 就简单设计一个 同时还可以用到学过的pb序列化。
在网络信息传输的时候传输pd的二进制序列。
客户端:
1. 构建一个存储了字段和字段值的map 表示一个Person对象的全部信息 (这样就不需要在客户端也构造一个Person类了 本来远端调用就有可能碰到两个项目中实体类不一致的情况 此时也得能实现服务;
2. 通过序列化 将这个map传输到服务端 调用服务端的服务 计算出出生年份 性别 和 拥有书籍的数量;
3. 得到的出生年份 性别 和 拥有书籍的数量 回显在页面上。
服务端:
1. 反序列化 解析得到这个map的键值对应关系;
2. 通过反射技术 重构出Person类;
3. 调用三个service 得到信息;
4. 将信息序列化 回传给服务端。
先这样写 后续把拦截器加上去 序列化和反序列化的操作可以放在拦截器中。
或者考虑用代理模式实现 invoke中写核心的计算 序列化和反序列化可以作为代理模式的副产品完成。
3. Dubbo的引入
1. Dubbo的配置引入
1)需要在服务端的配置文件中暴露服务端提供服务的接口名 和 具体服务实现的类名
<!--服务提供者声明名称:必须保证服务名称唯一,他的名称是dubbo内部使用的唯一标识,用项目名就行--><dubbo:applicationname="RPCServerDemo"/>
<!--访问服务协议的名称及端口号name:指定协议名称
port:指定协议端口号(默认20880)--><dubbo:protocolname="dubbo"port="20880"/>
<!--暴露服务接口interface:暴露服务接口的全限定类名ref:接口引用的实现类在spring容器中的标识registry:如果不使用注册中心,则值为N/A,直连--><dubbo:serviceinterface="service.PersonService"ref="personService"registry="N/A"/>
<!--将接口的实现类加载到Spring容器中--><beanid="personService"class="service.impl.PersonServiceImpl"/>
2)同样在客户端的配置文件中需要声明唯一的消费者名字 和 需要调用的服务的名字
<!--声明服务消费者名称:保证唯一性--><dubbo:applicationname="PRCClientDemo"/><!--引用远程服务接口:id:远程服务接口对象名称interface:调用远程接口的全限定类名
url:访问服务接口的地址registry:不使用注册中心,值为:N/A-->
<dubbo:referenceid="personService"interface="service.PersonService"
url="dubbo://localhost:20880"registry="N/A"/>
2. 添加监听器
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class></listener>
3. 在消费者的依赖中引入
服务端的服务实现之后 需要打包上传到maven仓库
需要在消费者的pom文件中引入生产者包的依赖 才能实现远端调用(那这和直接下载到本地的区别在哪)
???写了半天发现这确实和下载一个maven到本地再引用没区别 这和RPC有🔨关系
这用不用Dubbo框架 有差吗? 直接引呗