目錄
目的:
自己動手寫一個RPC框架,懂得運行原理
使用技術
1..netty
2.動態代理
3.負載均衡算法
4.ZK
5.自動掃包
6.註解
時序圖
用例圖
具體代碼
Share
業務web的接口jar包
我只列出一個接口
public interface UserService { String getUserName(Long userId); Boolean deleteUser(Long userId); } |
Core
rpc框架的核心,service和web端都要引用這個jar。
引用core的項目,需要採用 掃包的方式,來把core裏面的service放到spring上下文。
我這個例子裏面因爲 都是寫在同一個包下的,所以不需要這一步了。
這裏有 客戶端代碼,服務器端代碼,netty的代碼
Service
Web
使用步驟
服務器端:
1.需要使用RPC的service上,加一個註解@MyRpcProvide
2.掃包來加載core項目的service:cn.com.lzh.core
2.配置yml
myrpc: server: run: true netty: host: 127.0.0.1 port: 8801 zk: address: 127.0.0.1 |
參考MyRpcConfig裏面的註解
客戶端
1.在boot的啓動上加註解@MyRpcConsumer("cn.com.lzh.service"),告知需要使用RPC使用RPC動態代理的接口包名
2.配置YML
myrpc: zk: address: 127.0.0.1 |
運行結果
1.運行ZK服務端
2.運行服務器程序
這時候如果打開ZK的可視化客戶端,會發現service已經保存了。
3.客戶端寫一個測試方法
@RestController @SpringBootApplication @MyRpcConsumer("cn.com.lzh.service") public class MyRpcBizWeb { @Autowired private UserService userService;
public static void main(String[] args) { SpringApplication.run(MyRpcBizWeb.class, args); }
@RequestMapping(value = "test", method = { RequestMethod.POST, RequestMethod.GET }) public void test() throws Exception { try { String user = userService.getUserName(1111L); System.out.println("getUserName:" + user); boolean delUser = userService.deleteUser(123L); System.out.println("delUser:" + delUser); } catch (Exception e) { e.printStackTrace(); } } } |
運行:http://localhost:8080/test
代碼下載:https://download.csdn.net/download/lan861698789/12131822