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*/
(interfaceClass &#61; IHelloService.class, version &#61; "2.0.0")
public class HelloService implements IHelloService {public 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;
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*/
public class HelloServiceTest { (interfaceClass &#61; IHelloService.class, version &#61; "2.0.0")private IHelloService helloService;public int a &#61; 0; ("/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;
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*/
(interfaceClass &#61; IHelloService.class, version &#61; "1.0.0")
public class HelloService implements IHelloService {public 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技术依赖
-
zookeeper, 使用zookeeper进行服务注册与发现(服务名称作为服务提供者启动之后创建zk持久性节点保存, 服务对应的地址创建为临时性节点的内容, 实现动态 发现服务宕机和上线, 临时性节点表示为&#39;host:port$weight&#39;, host:port代表服务地址, weight表示为该服务地址的权重, 用来实现负载均衡, 负载均衡算法参考 dubbo的负载均衡算法, 基于权重的负载均衡算法)
-
netty, 使用netty进行服务之间的网络通信, netty的使用参考<>这本书。
-
kryo, 使用kryo进行序列化和反序列化。
-
动态代理(本项目提供了原生JDK动态代理和CGLIB来实现的动态代理, 用户可以自行配置使用哪种代理方式), 具体工作流程如: 重写BeanPostProcess来实现 解析Bean的字段是否包含
Reference
注解, 如果包含就创建个代理对象注入。
storm-rpc功能点
- 服务注册和发现
- 负载均衡
- 集成spring boot
- 远程调用
- 断线重连(后续增加)
后记
storm-rpc从开始开发到一个版本的推出前前后后经历了一周多, 实现借鉴了dubbo的很多代码, 期待你的加入能让storm-rpc走向完善。
项目地址