-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
12 changed files
with
182 additions
and
14 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
15 changes: 15 additions & 0 deletions
15
rpc-common/src/main/java/cn/fzzfrjf/enumeration/RpcError.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,15 @@ | ||
package cn.fzzfrjf.enumeration; | ||
|
||
|
||
import lombok.AllArgsConstructor; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@AllArgsConstructor | ||
public enum RpcError { | ||
|
||
SERVICE_NOT_REGISTERED("服务未能成功注册"), | ||
SERVICE_NOT_FOUND("未能找到服务"); | ||
|
||
private String message; | ||
} |
18 changes: 18 additions & 0 deletions
18
rpc-common/src/main/java/cn/fzzfrjf/exception/RpcException.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,18 @@ | ||
package cn.fzzfrjf.exception; | ||
|
||
import cn.fzzfrjf.enumeration.RpcError; | ||
|
||
public class RpcException extends RuntimeException{ | ||
|
||
public RpcException(RpcError rpcError,String detail){ | ||
super(rpcError.getMessage() + detail); | ||
} | ||
|
||
public RpcException(RpcError rpcError){ | ||
super(rpcError.getMessage()); | ||
} | ||
|
||
public RpcException(RpcError rpcError,Throwable cause){ | ||
super(rpcError.getMessage(),cause); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,5 +1,5 @@ | ||
package cn.fzzfrjf.core; | ||
|
||
public interface CommonServer { | ||
public void register(Object service ,int port); | ||
public void start(int port); | ||
} |
41 changes: 41 additions & 0 deletions
41
rpc-server/src/main/java/cn/fzzfrjf/core/DefaultServerPublisher.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cn.fzzfrjf.core; | ||
|
||
import cn.fzzfrjf.enumeration.RpcError; | ||
import cn.fzzfrjf.exception.RpcException; | ||
import cn.fzzfrjf.service.ServerPublisher; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
|
||
import java.util.Set; | ||
import java.util.concurrent.ConcurrentHashMap; | ||
|
||
public class DefaultServerPublisher implements ServerPublisher { | ||
|
||
private static final Logger logger = LoggerFactory.getLogger(DefaultServerPublisher.class); | ||
private final ConcurrentHashMap<String,Object> serviceMap = new ConcurrentHashMap<>(); | ||
private final Set<String> registeredService = ConcurrentHashMap.newKeySet(); | ||
@Override | ||
public synchronized <T> void publishService(T service) { | ||
String serviceName = service.getClass().getCanonicalName(); | ||
if(serviceMap.containsKey(serviceName)) return; | ||
registeredService.add(serviceName); | ||
Class<?>[] interfaces = service.getClass().getInterfaces(); | ||
if(interfaces.length == 0){ | ||
throw new RpcException(RpcError.SERVICE_NOT_REGISTERED); | ||
} | ||
for (Class<?> anInterface : interfaces) { | ||
serviceMap.put(anInterface.getCanonicalName(),service); | ||
} | ||
logger.info("向接口:{}注册服务:{}",interfaces,serviceName); | ||
} | ||
|
||
@Override | ||
public synchronized Object getService(String serviceName) { | ||
Object o = serviceMap.get(serviceName); | ||
if(null == o){ | ||
throw new RpcException(RpcError.SERVICE_NOT_FOUND); | ||
} | ||
return o; | ||
} | ||
} |
35 changes: 35 additions & 0 deletions
35
rpc-server/src/main/java/cn/fzzfrjf/core/RequestHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package cn.fzzfrjf.core; | ||
|
||
import cn.fzzfrjf.entity.RpcRequest; | ||
import cn.fzzfrjf.entity.RpcResponse; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import java.lang.reflect.InvocationTargetException; | ||
import java.lang.reflect.Method; | ||
|
||
public class RequestHandler { | ||
|
||
private static final Logger logger = LoggerFactory.getLogger(RequestHandler.class); | ||
|
||
public Object handle(RpcRequest rpcRequest,Object service){ | ||
Object result = null; | ||
try{ | ||
result = doMethod(rpcRequest,service); | ||
}catch (InvocationTargetException|IllegalAccessException e){ | ||
logger.error("反射调用时发生错误:",e); | ||
} | ||
return result; | ||
} | ||
|
||
private Object doMethod(RpcRequest rpcRequest , Object service) throws InvocationTargetException, IllegalAccessException { | ||
Method method; | ||
try{ | ||
method = service.getClass().getMethod(rpcRequest.getMethodName(),rpcRequest.getParameterTypes()); | ||
}catch (NoSuchMethodException e){ | ||
logger.error("调用方法时有错误发生:",e); | ||
return RpcResponse.fail(rpcRequest.getRequestId()); | ||
} | ||
return method.invoke(service,rpcRequest.getParameters()); | ||
} | ||
} |
41 changes: 41 additions & 0 deletions
41
rpc-server/src/main/java/cn/fzzfrjf/core/RequestHandlerThread.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package cn.fzzfrjf.core; | ||
|
||
import cn.fzzfrjf.entity.RpcRequest; | ||
import cn.fzzfrjf.entity.RpcResponse; | ||
import cn.fzzfrjf.service.ServerPublisher; | ||
import org.slf4j.Logger; | ||
import org.slf4j.LoggerFactory; | ||
|
||
import java.io.IOException; | ||
import java.io.ObjectInputStream; | ||
import java.io.ObjectOutputStream; | ||
import java.net.Socket; | ||
|
||
public class RequestHandlerThread implements Runnable{ | ||
|
||
private static final Logger logger = LoggerFactory.getLogger(RequestHandlerThread.class); | ||
|
||
private final RequestHandler handler; | ||
private final ServerPublisher serverPublisher; | ||
private final Socket socket; | ||
|
||
public RequestHandlerThread(RequestHandler handler,ServerPublisher serverPublisher,Socket socket){ | ||
this.handler = handler; | ||
this.serverPublisher = serverPublisher; | ||
this.socket = socket; | ||
} | ||
|
||
@Override | ||
public void run() { | ||
try(ObjectInputStream ois = new ObjectInputStream(socket.getInputStream()); | ||
ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream())){ | ||
RpcRequest rpcRequest = (RpcRequest) ois.readObject(); | ||
Object service = serverPublisher.getService(rpcRequest.getInterfaceName()); | ||
Object result = handler.handle(rpcRequest, service); | ||
oos.writeObject(RpcResponse.success(result,rpcRequest.getRequestId())); | ||
oos.flush(); | ||
}catch (IOException | ClassNotFoundException e){ | ||
logger.error("调用或发送时发生错误:",e); | ||
} | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 8 additions & 0 deletions
8
rpc-server/src/main/java/cn/fzzfrjf/service/ServerPublisher.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,8 @@ | ||
package cn.fzzfrjf.service; | ||
|
||
public interface ServerPublisher { | ||
|
||
<T> void publishService(T service); | ||
|
||
Object getService(String serviceName); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
8 changes: 6 additions & 2 deletions
8
test-server/src/main/java/cn/fzzfrjf/test/SocketServerTest.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,13 +1,17 @@ | ||
package cn.fzzfrjf.test; | ||
|
||
import cn.fzzfrjf.core.DefaultServerPublisher; | ||
import cn.fzzfrjf.core.SocketServer; | ||
import cn.fzzfrjf.entity.HelloService; | ||
import cn.fzzfrjf.service.HelloServiceImpl; | ||
import cn.fzzfrjf.service.ServerPublisher; | ||
|
||
public class SocketServerTest { | ||
public static void main(String[] args) { | ||
SocketServer socketServer = new SocketServer(); | ||
ServerPublisher serverPublisher = new DefaultServerPublisher(); | ||
HelloService helloService = new HelloServiceImpl(); | ||
socketServer.register(helloService,9000); | ||
serverPublisher.publishService(helloService); | ||
SocketServer socketServer = new SocketServer(serverPublisher); | ||
socketServer.start(9000); | ||
} | ||
} |