Solon

与 Dubbo 的区别

Solon 与 Dubbo 的比较,具体是指 Solon Remoting 与 Dubbo 的比较。Solon Remoting 是 Solon 内核的一部份,对 Solon 项目来说,是天然的存在。Solon Remoting 包括了:

  • Solon Remoting Rpc(本章对比较的就是它)
  • Solon Remoting SocketD(它适合与 RSocket 比较)

1、Solon Remoting Rpc 与 Dubbo 的相似点

  • 相属于 Interface 风格的 Rpc 框架
  • 都支持 Http、Socket、WebSocket 三种通道
  • 都支持 多种序列化方案
  • 都采用 内核 + 通道 + 序列化 的组成结构

2、观感上的几个不同处

接口Solon RpcDubbo2Dubbo3
服务引用@NamiClient@Reference@DubboReference
服务实现@Remoting@Service@DubboService
注册形式以服务为单位注册以接口为单位注册以服务为单位注册(好像是这样)
注册与发现Solon Cloud 的注册与发现标准有自己的适配有自己的适配
其它支持异步

注1:以服务为单位注册,在注册与发现的速度会快很多;在k8s部署时也可与k8s service映射。

注2:为什么是 @NamiClient 不是 @RemotingClient 或者 SolonClient ?困为 Nami 是 Solon 的女朋友,男女搭配干活不累。另外 Nami 是可独立使用的框架,独立使用时相当于 Feign。

3、示例

接口及相关申明(Interface 风格)

//申明接口
public interface UserService{
    void add(User user);
    User getById(long userId);
}

//定义模型 //继承 Serializable 接口,可适应任何序列化框架
@Data
public class User implements Serializable{ 
    long userId;
    String name;
    int level;
}

服务实现

public class ServerApp{
    public static void main(String[] args){
        Solon.start(ServerApp.class, args);
    }
}

@Maping("/rpc/v1/user")
@Remoting
public class UserServiceImpl implements UserService{
    @Inject
    UserMapper userMapper;
    
    @Override
    public void add(User user){
        userMapper.add(user);
    }
    
    @Override
    public User getById(long userId){
        return userMapper.getById(userId);
    }
}

服务引用

public class ClientApp{
    public static void main(String[] args){
        Solon.start(ClientApp.class, args);
    }
}

@Maping("user")
@Controller
public class UserController {
    //直接指定地址和序列化方案
    //@NamiClient(url = "http://localhost:9001/rpc/v1/user", headers = "Content-Type:application/json")
    //指定服务名(需引入发现服务插件,如:water-solon-plugin)
    @NamiClient(name = "userapi",  path="/rpc/v1/user", headers = "Content-Type:application/json")
    UserService userService;
    
    @Post
    @Mapping("register")
    public Result register(User user){
        //调用远程服务,添加用户
        userService.add(user);
        
        return Result.succeed();
    }
   
}