使用方法

  1. @Component
  2. public class HelloClient {
  3. @Reference // dubbo 注解
  4. private HelloService helloService;
  5. public String hello() {
  6. return helloService.hello("World");
  7. }
  8. }
  9. @Service // dubbo 注解
  10. @Component
  11. public class HelloServiceImpl implements HelloService {
  12. @Override
  13. public String hello(String name) {
  14. return "Hello " + name;
  15. }
  16. }

核心原理

image.png

实现接口

对外服务:

  1. /**
  2. * RPC 框架对外提供的服务接口
  3. */
  4. public interface RpcAccessPoint extends Closeable{
  5. /**
  6. * 客户端获取远程服务的引用
  7. * @param uri 远程服务地址
  8. * @param serviceClass 服务的接口类的 Class
  9. * @param <T> 服务接口的类型
  10. * @return 远程服务引用
  11. */
  12. <T> T getRemoteService(URI uri, Class<T> serviceClass);
  13. /**
  14. * 服务端注册服务的实现实例
  15. * @param service 实现实例
  16. * @param serviceClass 服务的接口类的 Class
  17. * @param <T> 服务接口的类型
  18. * @return 服务地址
  19. */
  20. <T> URI addServiceProvider(T service, Class<T> serviceClass);
  21. /**
  22. * 服务端启动 RPC 框架,监听接口,开始提供远程服务。
  23. * @return 服务实例,用于程序停止的时候安全关闭服务。
  24. */
  25. Closeable startServer() throws Exception;
  26. }

注册中心:

  1. /**
  2. * 注册中心
  3. */
  4. public interface NameService {
  5. /**
  6. * 注册服务
  7. * @param serviceName 服务名称
  8. * @param uri 服务地址
  9. */
  10. void registerService(String serviceName, URI uri) throws IOException;
  11. /**
  12. * 查询服务地址
  13. * @param serviceName 服务名称
  14. * @return 服务地址
  15. */
  16. URI lookupService(String serviceName) throws IOException;
  17. }

用户使用

服务接口:

  1. public interface HelloService {
  2. String hello(String name);
  3. }

真正调用:

  1. URI uri = nameService.lookupService(serviceName);
  2. HelloService helloService = rpcAccessPoint.getRemoteService(uri, HelloService.class);
  3. String response = helloService.hello(name);
  4. logger.info(" 收到响应: {}.", response);

服务实现:

  1. public class HelloServiceImpl implements HelloService {
  2. @Override
  3. public String hello(String name) {
  4. String ret = "Hello, " + name;
  5. return ret;
  6. }
  7. }

服务流程:

  1. rpcAccessPoint.startServer();
  2. URI uri = rpcAccessPoint.addServiceProvider(helloService, HelloService.class);
  3. nameService.registerService(serviceName, uri);

目录结构:
image.png

参考文章:
https://learn.lianglianglee.com/%E4%B8%93%E6%A0%8F/%E6%B6%88%E6%81%AF%E9%98%9F%E5%88%97%E9%AB%98%E6%89%8B%E8%AF%BE/31%20%20%E5%8A%A8%E6%89%8B%E5%AE%9E%E7%8E%B0%E4%B8%80%E4%B8%AA%E7%AE%80%E5%8D%95%E7%9A%84RPC%E6%A1%86%E6%9E%B6%EF%BC%88%E4%B8%80%EF%BC%89%EF%BC%9A%E5%8E%9F%E7%90%86%E5%92%8C%E7%A8%8B%E5%BA%8F%E7%9A%84%E7%BB%93%E6%9E%84.md