Closed funky-eyes closed 5 years ago
服务端什么样子,客户端什么样子贴出方便重现
@qmdx 除了Controller,其它基本上都是代码生成工具生成,然后把service换为dubbo的service注解 客户端:
import com.alibaba.dubbo.config.annotation.Reference;
@Reference(version = "1.0.0")
IFrontUserSelectService selectUser;
执行代码:
FrontUser userFrontUser = new FrontUser();
userFrontUser.setMobileNum(user.getPhone());
userFrontUser.setUserPass(MD5Util2.getStringMD5(user.getPassword()));
QueryWrapper<FrontUser> ew = new QueryWrapper<FrontUser>();
ew.setEntity(userFrontUser);
userFrontUser = selectUser.getOne(ew);
yml:
dubbo:
registry:
id: my-registry
address: zookeeper://127.0.0.1:2181?client=curator
application:
name: dubbo-demo-client
qos-enable: false
服务端: yml:
server:
port: 8080
spring:
datasource:
dynamic:
primary: master #设置默认的数据源或者数据源组,默认值即为master
datasource:
master:
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
url:
slave_1:
username: root
password:
driver-class-name: com.mysql.jdbc.Driver
url:
dbcp2:
initial-size: 6
min-idle: 3
max-wait-millis: 60000
validation-query: select 'x'
time-between-eviction-runs-millis: 60000
soft-min-evictable-idle-time-millis: 30000
test-on-borrow: false
test-on-return: false
test-while-idle: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
dubbo:
protocol:
serialization: java
scan:
base-packages: com.example
application:
qos-enable: false
name: testserver
registry:
id: my-registry
# address: zookeeper://172.17.0.2:2181?client=curator
address: zookeeper://127.0.0.1:2181?client=curator
mybatis-plus:
mapper-locations: classpath:/mapper/*Mapper.xml
typeAliasesPackage: com.baomidou.springboot.entity
typeEnumsPackage: com.baomidou.springboot.entity.enums
global-config:
db-config:
field-strategy: not-empty
id-type: auto
db-type: mysql
configuration:
map-underscore-to-camel-case: true
cache-enabled: true
service:
import com.example.entity.FrontUser;
import com.example.mapper.FrontUserMapper;
import com.example.service.IFrontUserSelectService;
import com.alibaba.dubbo.config.annotation.Service;
import com.baomidou.dynamic.datasource.annotation.DS;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.transaction.annotation.Transactional;
/**
* <p>
* 前端用户表 服务实现类
* </p>
*
* @author Funkye
* @since 2019-04-10
*/
@Service(version = "1.0.0")
@Transactional
@DS("slave")
public class FrontUserSerlectServiceImpl extends ServiceImpl<FrontUserMapper, FrontUser>
implements IFrontUserSelectService {
}
不支持也不推荐把 wrapper 进行 dubbo 传输
@miemieYaho 3.1.0前包括2.x都是支持的,现在突然不支持,让一直用的老用户如何升级?
3.x 一直都不支持何来 3.1.0 前都支持?
@miemieYaho 如果不支持3.1.0我是怎么用的好好的?
那你就继续用 3.1.0 吧
@miemieYaho 问题是你们一开始可以,后来不行呀,如果每一次迭代要让开发者去更改大量的业务代码您觉得合适吗?
不好意思,我们从来就没有说过支持 dubbo 传值,你可以自己搜搜 issue 里面关于 dubbo 传值的报错有多少有多早.changelog 里面也没有说过任何修复的说明.而且我们以后也不会去支持 dubbo 传递
作为RPC服务,参数应该用明确的类型,而不应该用Wrapper/Map/JSON这种类型,可维护性差!!!
@miemieYaho 哥,问题我反馈在这了,您可以去看下去年我发的问题,当时您没跟我说不支持,叫我升级版本,我升级版本后,一直可用,所以用到了3.1.1突然发现就不行了 https://github.com/baomidou/mybatis-plus/issues/475
@yuxiaobin 是的,我已经决定要改了,谢谢指点
这里统一解释下, mp 一开始就不打算支持 dubbo 序列化 wrapper 处于安全考虑, wrapper 的 sql 操作性太强,如果直接传递底层服务不可控。花点时间改下吧
@yuxiaobin 是的,我已经决定要改了,谢谢指点
@a364176773 如果确实有特殊需求需要传递wrapper,如接收方需要的条件查询比较多,我用java序列化成字节流然后接收方反序列化拿到了wrapper.
@Sidfate 您好,我用的就是dubbo配置成java的序列化工具,在3.1.1以前的版本没有问题,到了3.1.1才出现,所以我怀疑只是dubbo的传输刚好引发了mp其中的一个bug,希望您看一下我的异常信息,看看是不是3.1.1存在其他的bug
@a364176773 我的意思不是配置dubbo的序列化方式,而是你传递的参数,改成byte[]方式传递,就是手动序列化和反序列化。
@Sidfate 好的了解了,非常感谢
@Sidfate 您好,我尝试了您建议的转换为byte[]后再转换为qw的对象后数据丢失了,就是qw里构造的条件全没了,异常信息是因为我getone结果有多条的错误,请问你能帮我看一下吗 这个是controller的接口代码
@ApiOperation(value = "测试")
@PostMapping(value = "testUser")
public JsonResult testUser(@ApiParam(name = "id", value = "id", required = true) @RequestParam Integer id) {
QueryWrapper<FrontUser> ew = new QueryWrapper<FrontUser>();
ew.select("id").eq("id", id);
logger.info(ew.getSqlSelect());
return renderSuccess(selectUser.getOne(SerializableUtil.serialize(ew)));
}
下面是远程调用的实现:
@Override
public FrontUser getOne(byte[] bytes) {
// TODO Auto-generated method stub
QueryWrapper<FrontUser> qw = (QueryWrapper<FrontUser>) SerializableUtil.unserialize(bytes);
return getOne(qw);
}
然后是序列化的工具类代码:
public class SerializableUtil {
public static byte[] serialize(Object object) {
ObjectOutputStream oos = null;
ByteArrayOutputStream baos = null;
try {
// 序列化
baos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(baos);
oos.writeObject(object);
byte[] bytes = baos.toByteArray();
return bytes;
} catch (Exception e) {
}
return null;
}
public static Object unserialize(byte[] bytes) {
ByteArrayInputStream bais = null;
try {
// 反序列化
bais = new ByteArrayInputStream(bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
return ois.readObject();
} catch (Exception e) {
}
return null;
}
}
@a364176773 我也是这么转的,但是我没有问题,你的FrontUser是哪边提供的,还有dubbo接收方转出来的内容是什么。
@Sidfate 您好,我是有一个公用api的项目的,provider跟消费者两边都是依赖了这个项目 一个是工具类一个是api,消费者跟提供者都是依赖于这个,api里是有个实体包里面就是放这些实体,frontuser等等,还有请问您dubbo接收的时候序列化用的默认的还是跟我 一样配置了个java序列化方式?
<dependency>
<groupId>together_api</groupId>
<artifactId>together_api</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>together_util</groupId>
<artifactId>together_util</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
@Sidfate 您好,请问您也是3.1.1版本吗,还有我上面的问题可以帮忙看下吗
@a364176773
@Sidfate 您好,我用的是3.11 dubbo2.5.10 3.0.6确实可以, 3.1.1就不行了
mybatis-plus就做为单独的dao层把,还是需要自己封装一层dubbo service层的把?或者官方有木有dubbo+mybatis-plus的最佳实践可以Demo一下?
当前使用版本(必须填写清楚,否则不予处理)
3.1.1
该问题是怎么引起的?*([最新版](https://search.maven.org/search?q=g:com.baomidou%20a:mybatis-)上已修复的会直接close掉)**
3.1.0时没有任何异常,3.1.1后,远程调用,如果是构建QueryWrapper,然后把QueryWrapper传输到服务端,直接会出现序列化异常
重现步骤
selectUser.getOne(new QueryWrapper().eq("mobileNum", user.getPhone()));
报错信息
消费者:
提供服务端: