Merge pull request #14 from GGBoooond/main

修复限流返回fail信息时的解析失败问题
This commit is contained in:
GG.Bond 2024-07-27 02:25:01 +08:00 committed by GitHub
commit 911fab58b0
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 31 additions and 9 deletions

View File

@ -13,9 +13,7 @@
1.先安装并开启zookeeper 1.先安装并开启zookeeper
[windows 环境下zookeeper的安装与配置]: https://blog.csdn.net/fisherish/article/details/118974827?spm=1001.2014.3001.5506 安装参考https://blog.csdn.net/fisherish/article/details/118974827?spm=1001.2014.3001.5506
2.运行Server包下的TestServer,再运行Client包下的TestClient 2.运行Server包下的TestServer,再运行Client包下的TestClient

View File

@ -16,12 +16,27 @@ public class TestClient {
public static void main(String[] args) throws InterruptedException { public static void main(String[] args) throws InterruptedException {
ClientProxy clientProxy=new ClientProxy(); ClientProxy clientProxy=new ClientProxy();
UserService proxy=clientProxy.getProxy(UserService.class); UserService proxy=clientProxy.getProxy(UserService.class);
for(int i = 0; i < 15; i++) {
Integer i1 = i;
new Thread(()->{
try{
User user = proxy.getUserByUserId(i1);
User user = proxy.getUserByUserId(1); System.out.println("从服务端得到的user="+user.toString());
System.out.println("从服务端得到的user="+user.toString());
User u=User.builder().id(100).userName("wxx").sex(true).build(); Integer id = proxy.insertUserId(User.builder().id(i1).userName("User" + i1.toString()).sex(true).build());
Integer id = proxy.insertUserId(u); System.out.println("向服务端插入user的id"+id);
System.out.println("向服务端插入user的id"+id); } catch (NullPointerException e){
System.out.println("user为空");
e.printStackTrace();
}
}).start();
}
} }
//User user = proxy.getUserByUserId(1);
//System.out.println("从服务端得到的user="+user.toString());
//
//User u=User.builder().id(100).userName("wxx").sex(true).build();
//Integer id = proxy.insertUserId(u);
//System.out.println("向服务端插入user的id"+id);
} }

View File

@ -39,6 +39,7 @@ public class NettyRPCServerHandler extends SimpleChannelInboundHandler<RpcReques
RateLimit rateLimit=serviceProvider.getRateLimitProvider().getRateLimit(interfaceName); RateLimit rateLimit=serviceProvider.getRateLimitProvider().getRateLimit(interfaceName);
if(!rateLimit.getToken()){ if(!rateLimit.getToken()){
//如果获取令牌失败进行限流降级快速返回结果 //如果获取令牌失败进行限流降级快速返回结果
System.out.println("服务限流!!");
return RpcResponse.fail(); return RpcResponse.fail();
} }

View File

@ -4,6 +4,7 @@ import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext; import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder; import io.netty.handler.codec.ByteToMessageDecoder;
import part1.common.Message.MessageType; import part1.common.Message.MessageType;
import part1.common.Message.RpcResponse;
import part1.common.serializer.mySerializer.Serializer; import part1.common.serializer.mySerializer.Serializer;
import java.util.List; import java.util.List;
@ -35,7 +36,9 @@ public class MyDecoder extends ByteToMessageDecoder {
//4.读取序列化数组 //4.读取序列化数组
byte[] bytes=new byte[length]; byte[] bytes=new byte[length];
in.readBytes(bytes); in.readBytes(bytes);
System.out.println("bytes==="+new String(bytes));
Object deserialize= serializer.deserialize(bytes, messageType); Object deserialize= serializer.deserialize(bytes, messageType);
out.add(deserialize); out.add(deserialize);
} }
} }

View File

@ -43,9 +43,14 @@ public class JsonSerializer implements Serializer {
break; break;
case 1: case 1:
RpcResponse response = JSON.parseObject(bytes, RpcResponse.class); RpcResponse response = JSON.parseObject(bytes, RpcResponse.class);
// 如果类型为空说明返回错误
if(response.getDataType()==null){
obj = RpcResponse.fail();
break;
}
Class<?> dataType = response.getDataType(); Class<?> dataType = response.getDataType();
//判断转化后的response对象中的data的类型是否正确 //判断转化后的response对象中的data的类型是否正确
if(! dataType.isAssignableFrom(response.getData().getClass())){ if(!dataType.isAssignableFrom(response.getData().getClass())){
response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType)); response.setData(JSONObject.toJavaObject((JSONObject) response.getData(),dataType));
} }
obj = response; obj = response;