与 Dubbo 的区别
Solon 与 Dubbo 的比较,具体是指 Solon Remoting 与 Dubbo 的比较。Solon Remoting 包括有:
- Solon Remoting Rpc(本章比较的就是它)
- Solon Remoting SocketD(它适合与 RSocket 比较)
1、Solon Remoting Rpc 与 Dubbo 的相似点
- 者是面向接口的远程方法调用方式
- 都支持 Http、Socket、WebSocket 三种通道
- 都支持 多种序列化方案
- 都采用 内核 + 通道 + 序列化 的组成结构
2、观感上的几个不同处
接口 | Solon Rpc | Dubbo2 | Dubbo3 |
---|---|---|---|
服务引用 | @NamiClient | @Reference | @DubboReference |
服务实现 | @Remoting | @Service | @DubboService |
注册形式 | 以服务为单位注册(仅一条记录) | 以接口为单位注册 | 以服务为单位注册(好像是这样) |
注册与发现 | Solon Cloud 的注册与发现标准 | 有自己的适配 | 有自己的适配 |
其它 | 可与k8s service映射 | 支持异步 |
注1:Solon 以服务为单位注册,在注册与发现的速度会快很多;在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;
}
服务实现
@SolonMain
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);
}
}
服务引用
@SolonMain
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();
}
}