热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

那些年我造的轮子之RPC

storm-rpc快速开始(使用SpringBoot)Api接口IHelloService.javapackageme.stormma.api;***authorstormmast

storm-rpc

快速开始(使用Spring Boot)

Api

接口IHelloService.java

package me.stormma.api;/*** @author stormma stormmaybin@gmail.com*/
public interface IHelloService {String sayHello(String name);
}

服务接口pom依赖

xml version="1.0" encoding="UTF-8"?>
<project xmlns&#61;"http://maven.apache.org/POM/4.0.0"xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion>
<artifactId>storm-rpc-spring-boot-starter-test-apiartifactId>
project>

Provider

服务提供者实现HelloService.java

package me.stormma.storm.rpc.spring.boot.starter.test.provider.provider;import me.stormma.annoation.Provider;
import me.stormma.api.IHelloService;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
&#64;Provider(interfaceClass &#61; IHelloService.class, version &#61; "2.0.0")
public class HelloService implements IHelloService {&#64;Overridepublic String sayHello(String name) {return "hello " &#43; name &#43; "!";}
}

服务提供者pom依赖

xml version&#61;"1.0" encoding&#61;"UTF-8"?>
<project xmlns&#61;"http://maven.apache.org/POM/4.0.0" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion>
<groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starter-test-providerartifactId><version>0.0.1-SNAPSHOTversion><packaging>jarpackaging><name>storm-rpc-spring-boot-starter-test-providername><description>storm-rpc-spring-boot-starter-test-providerdescription><parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.0.RELEASEversion><relativePath/> parent><properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding><java.version>1.8java.version>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency><dependency><groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starterartifactId><version>1.0.0version>dependency><dependency><groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starter-test-apiartifactId><version>1.0.0version>dependency>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>
project>

服务提供者启动类StormRpcSpringBootStarterTestProviderApplication.java

package me.stormma.storm.rpc.spring.boot.starter.test.provider;import me.stormma.rpc.spring.boot.annotation.EnableStormRpcConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;SpringBootApplication
&#64;EnableStormRpcConfiguration
public class StormRpcSpringBootStarterTestProviderApplication {public static void main(String[] args) {SpringApplication.run(StormRpcSpringBootStarterTestProviderApplication.class, args);}
}

服务提供者配置文件application.properties

spring.storm.rpc.server&#61;true
spring.storm.rpc.host&#61;127.0.0.1
spring.storm.rpc.port&#61;52057
spring.storm.rpc.weight&#61;3
spring.storm.rpc.registry&#61;139.199.27.243:2181
spring.storm.rpc.basePackage&#61;me.stormma.storm.rpc.spring.boot.starter.test.provider
spring.storm.rpc.name&#61;provider

Consumer

服务消费者测试类HelloServiceTest.java

package me.stormma.storm.rpc.spring.boot.starter.test.consumer.consumer;import me.stormma.api.IHelloService;
import me.stormma.rpc.spring.boot.annotation.Reference;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
&#64;RestController
public class HelloServiceTest {&#64;Reference(interfaceClass &#61; IHelloService.class, version &#61; "2.0.0")private IHelloService helloService;public int a &#61; 0;&#64;GetMapping("/say/hello/{name}")public String test(&#64;PathVariable String name) {return helloService.sayHello(name);}
}

服务消费者pom依赖

xml version&#61;"1.0" encoding&#61;"UTF-8"?>
<project xmlns&#61;"http://maven.apache.org/POM/4.0.0" xmlns:xsi&#61;"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&#61;"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0modelVersion>
<groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starter-test-consumerartifactId><version>0.0.1-SNAPSHOTversion><packaging>jarpackaging><name>storm-rpc-spring-boot-starter-test-consumername><description>Demo project for Spring Bootdescription><parent><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-parentartifactId><version>2.0.0.RELEASEversion><relativePath/> parent><properties><project.build.sourceEncoding>UTF-8project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8project.reporting.outputEncoding><java.version>1.8java.version>properties><dependencies><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-webartifactId>dependency><dependency><groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starter-test-apiartifactId><version>1.0.0version>dependency><dependency><groupId>me.stormmagroupId><artifactId>storm-rpc-spring-boot-starterartifactId><version>1.0.0version>dependency><dependency><groupId>org.springframework.bootgroupId><artifactId>spring-boot-starter-testartifactId><scope>testscope>dependency>dependencies><build><plugins><plugin><groupId>org.springframework.bootgroupId><artifactId>spring-boot-maven-pluginartifactId>plugin>plugins>build>
project>

服务消费者启动类StormRpcSpringBootStarterTestConsumerApplication.java

package me.stormma.storm.rpc.spring.boot.starter.test.consumer;import me.stormma.rpc.spring.boot.annotation.EnableStormRpcConfiguration;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;&#64;SpringBootApplication
&#64;EnableStormRpcConfiguration
public class StormRpcSpringBootStarterTestConsumerApplication {public static void main(String[] args) {SpringApplication.run(StormRpcSpringBootStarterTestConsumerApplication.class, args);}
}

服务消费者配置文件application.properties

spring.storm.rpc.discover&#61;139.199.27.243:2181
spring.storm.rpc.name&#61;consumer
server.port&#61;8090

快速开始(原生)

Api

服务接口IHelloService.java

package me.stormma.api;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
public interface IHelloService {String sayHello(String name);
}

Provider

服务提供者实现HelloService.java

package me.stormma.provider;import me.stormma.annoation.Provider;
import me.stormma.api.IHelloService;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
&#64;Provider(interfaceClass &#61; IHelloService.class, version &#61; "1.0.0")
public class HelloService implements IHelloService {&#64;Overridepublic String sayHello(String name) {return "hello " &#43; name;}
}

服务提供者启动类ServerBootstrap.java

package me.stormma.provider;import me.stormma.constants.Constants;
import me.stormma.rpc.model.ServerInfo;
import me.stormma.rpc.netty.bootstrap.RpcServer;
import me.stormma.rpc.registry.ServiceRegistry;
import me.stormma.rpc.registry.zk.ZookeeperServiceRegistry;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
public class ServerBootstrap {public static void main(String... args) throws Exception {String zkServer &#61; "139.199.27.243:2181";ServiceRegistry serviceRegistry &#61; new ZookeeperServiceRegistry(zkServer);ServerInfo serverInfo &#61; new ServerInfo(Constants.DEFAULT_HOST, Constants.DEFAULT_PORT, Constants.SERVER_DEFAULT_WEIGHT);RpcServer rpcServer &#61; new RpcServer(serviceRegistry, serverInfo);rpcServer.start("me.stormma.provider");}
}

Consumer

服务消费者实现类ConsumerClient.java

package me.stormma.consumer;import me.stormma.api.IHelloService;
import me.stormma.rpc.proxy.DefaultProxy;
import me.stormma.rpc.registry.ServiceDiscover;
import me.stormma.rpc.registry.zk.ZookeeperServiceDiscover;/*** &#64;author stormma stormmaybin&#64;gmail.com*/
public class ConsumerClient {public static void main(String[] args) {String zkServer &#61; "139.199.27.243:2181";ServiceDiscover serviceDiscover &#61; new ZookeeperServiceDiscover(zkServer);DefaultProxy proxy &#61; new DefaultProxy(serviceDiscover);IHelloService helloService &#61; proxy.createProxy(IHelloService.class, "1.0.0");System.out.println(helloService.sayHello("stormma"));System.exit(0);}
}

storm-rpc技术依赖

  1. zookeeper, 使用zookeeper进行服务注册与发现(服务名称作为服务提供者启动之后创建zk持久性节点保存, 服务对应的地址创建为临时性节点的内容, 实现动态 发现服务宕机和上线, 临时性节点表示为&#39;host:port$weight&#39;, host:port代表服务地址, weight表示为该服务地址的权重, 用来实现负载均衡, 负载均衡算法参考 dubbo的负载均衡算法, 基于权重的负载均衡算法)

  2. netty, 使用netty进行服务之间的网络通信, netty的使用参考<>这本书。

  3. kryo, 使用kryo进行序列化和反序列化。

  4. 动态代理(本项目提供了原生JDK动态代理和CGLIB来实现的动态代理, 用户可以自行配置使用哪种代理方式), 具体工作流程如: 重写BeanPostProcess来实现 解析Bean的字段是否包含Reference注解, 如果包含就创建个代理对象注入。

storm-rpc功能点

  1. 服务注册和发现
  2. 负载均衡
  3. 集成spring boot
  4. 远程调用
  5. 断线重连(后续增加)

后记

storm-rpc从开始开发到一个版本的推出前前后后经历了一周多, 实现借鉴了dubbo的很多代码, 期待你的加入能让storm-rpc走向完善。

项目地址



推荐阅读
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 关键词:Golang, Cookie, 跟踪位置, net/http/cookiejar, package main, golang.org/x/net/publicsuffix, io/ioutil, log, net/http, net/http/cookiejar ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Android开发实现的计时器功能示例
    本文分享了Android开发实现的计时器功能示例,包括效果图、布局和按钮的使用。通过使用Chronometer控件,可以实现计时器功能。该示例适用于Android平台,供开发者参考。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Activiti7流程定义开发笔记
    本文介绍了Activiti7流程定义的开发笔记,包括流程定义的概念、使用activiti-explorer和activiti-eclipse-designer进行建模的方式,以及生成流程图的方法。还介绍了流程定义部署的概念和步骤,包括将bpmn和png文件添加部署到activiti数据库中的方法,以及使用ZIP包进行部署的方式。同时还提到了activiti.cfg.xml文件的作用。 ... [详细]
author-avatar
手机用户2502887947_784
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有