# syyrjx-rpc **Repository Path**: magellan41/syyrjx-rpc ## Basic Information - **Project Name**: syyrjx-rpc - **Description**: 手写一个简单的rpc框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2023-01-09 - **Last Updated**: 2024-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 工程简介 一个基于springboot的简单的rpc框架 演示: ## 注册中心 ### pom ```xml xyz.syyrjx syyrjx-rpc-registry 0.0.1 ``` ### properties ```properties xyz.syyrjx.rpc.registry.port=9001 #本机端口 xyz.syyrjx.rpc.registry.micro-seconds-to-dead=45000 #多久接收不到心跳判断为下线 xyz.syyrjx.rpc.registry.registry-address=localhost:9001,localhost:9002 #注册中心集群地址 ``` ### java代码 @SyyrjxRpcRegistryEnable @SpringBootApplication public class SyyrjxRpcRegistryTestApplication { ```java public static void main(String[] args) { SpringApplication.run(SyyrjxRpcRegistryTestApplication.class, args); } ``` ## api接口模块 ### pom ```xml xyz.syyrjx syyrjx-rpc-call-and-breaker 0.0.1 ``` ### 接口 ```java @SyyrjxRpcCallClient @SyyrjxRpcBreaker public interface MyInterface { //正常调用方法 String get(); @SyyrjxRpcBreaker //不忽略异常 String allException(); @SyyrjxRpcBreaker(ignoreException = {ArithmeticException.class}) //忽略部分异常 String ignoreException(); @SyyrjxRpcBreaker(timeout = 1000) //超时 String timeout(); } ``` ## 提供者 我这里搞了两个提供者pom文件相同,properties配置文件只有提供者端口号不同(一个6000,一个6001),java代码中正常调用方法get()的实现一个返回的是"提供者0正常调用",一个返回的是"提供者1正常调用",其它都相同 ### pom ```xml xyz.syyrjx syyrjx-rpc-provider 0.0.1 ``` 记得引入api接口模块 ### properties ```properties xyz.syyrjx.rpc.provider.host=localhost #本机名称 xyz.syyrjx.rpc.provider.port=6000 #本机端口号 xyz.syyrjx.rpc.provider.registry-address=localhost:9001,localhost:9002 #注册中心集群地址 ``` ### java代码 ```java @SyyrjxRpcProvider public class MyService implements MyInterface { @Override public String get() { return "提供者0正常调用"; } @Override public String allException() { throw new RuntimeException(); } @Override public String ignoreException() { int a = 10 / 0; return "忽略异常"; } @Override public String timeout() { try { Thread.sleep(10000); } catch (InterruptedException e) { e.printStackTrace(); } return "超时超时"; } } ``` ## 消费者 ### pom ```properties xyz.syyrjx syyrjx-rpc-consumer 0.0.1 ``` 记得引入api接口模块,由于api接口模块中已经引入了声明式调用模块call-and-breaker,这里不再重复引入 ### properties ```properties xyz.syyrjx.rpc.consumer.registry-address=localhost:9001,localhost:9002 ``` ### java代码 #### 可以使用声明式调用方式 调用示例 ```java @Component public class MyController { @Autowired private MyInterface myInterface; public void get() { System.out.println(myInterface.get()); } public void allException() { System.out.println(myInterface.allException()); } public void ignoreException() { System.out.println(myInterface.ignoreException()); } public void timeout() { System.out.println(myInterface.timeout()); } } ``` ```java @SyyrjxRpcConsumerEnable @SyyrjxRpcCallEnable({xyz.syyrjx.syyrjxrpcinterfacetest._interface.MyInterface.class}) @SpringBootApplication public class SyyrjxRpcConsumerTest1Application { public static void main(String[] args) throws InterruptedException, ExecutionException, IOException { ConfigurableApplicationContext run = SpringApplication.run(SyyrjxRpcConsumerTest1Application.class, args); MyController controller = run.getBean(MyController.class); controller.get(); } } ``` 调用结果 ![image-20230124154956505](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230124154956505.png) 也可以使用客户端服务器调用(不建议) ```java @SyyrjxRpcConsumerEnable @SyyrjxRpcCallEnable({xyz.syyrjx.syyrjxrpcinterfacetest._interface.MyInterface.class}) @SpringBootApplication public class SyyrjxRpcConsumerTest1Application { public static void main(String[] args) throws InterruptedException, ExecutionException, IOException { ConfigurableApplicationContext run = SpringApplication.run(SyyrjxRpcConsumerTest1Application.class, args); SyyrjxRpcConsumerClient client = run.getBean(SyyrjxRpcConsumerClient.class); System.out.println(client.remoteCall("接口全限定类名", "方法名", 入参).toString()); } } ``` ## 关于服务降级 在接口或方法上添加@SyyrjxRpcBreaker注解,可以指定忽略的异常 也可以不指定(接口上必须添加,接口上指定忽略的异常相当于接口下的方法都指定了这些异常需要忽略) 消费者本地添加一个接口同包下的降级类(类名为接口类名+Fallback),原方法名后添加Exception表示异常回调,原方法名后添加Timeout表示超时回调 ```java public class MyInterfaceFallback{ public String allExceptionException(Throwable throwable){ return "本地异常回调"; } //这个回调方法可能不会被调用,因为部分异常被忽略 public String ignoreExceptionException(Throwable throwable) { return "异常被忽略,不进行回调,抛出异常"; } public String timeoutTimeout() { return "本地超时回调"; } } ``` ### controller进行远程调用 ```java @SyyrjxRpcConsumerEnable @SyyrjxRpcCallEnable({xyz.syyrjx.syyrjxrpcinterfacetest._interface.MyInterface.class}) @SpringBootApplication public class SyyrjxRpcConsumerTest1Application { public static void main(String[] args) throws InterruptedException, ExecutionException, IOException { ConfigurableApplicationContext run = SpringApplication.run(SyyrjxRpcConsumerTest1Application.class, args); MyController controller = run.getBean(MyController.class); //正常调用 controller.get(); //不忽略异常 controller.allException(); //忽略部分异常 try { controller.ignoreException(); }catch (Exception e) { e.printStackTrace(); } //超时调用 controller.timeout(); } } ``` 调用结果 ![image-20230124154913656](C:\Users\ASUS\AppData\Roaming\Typora\typora-user-images\image-20230124154913656.png)