代理模式:静态代理和动态代理
1|0静态代理
/** * 静态代理 * * @author nami404 * * @date 2024/6/25 18:32 */ public class UserServiceProxy implements UserService { public User getUser(User user) { // 指定序列化器 JdkSerializer serializer = new JdkSerializer(); // 发请求 RpcRequest rpcRequest = RpcRequest.builder() .serviceName(UserService.class.getName()) .methodName("getUser") .parameterType(new Class[]{User.class}) .args(new Object[]{user}) .build(); try { byte[] bodyBytes = serializer.serialize(rpcRequest); byte[] result; try (HttpResponse httpResponse = HttpRequest.post("http://localhost:8080") .body(bodyBytes) .execute()) { result = httpResponse.bodyBytes(); } RpcResponse rpcResponse = serializer.deserialize(result, RpcResponse.class); return (User) rpcResponse.getData(); } catch (IOException e) { e.printStackTrace(); } return null; } }
UserService接口:
public interface UserService { /** * 获取用户 * * @param user * @return */ User getUser(User user); }
2|0动态代理
/** * 服务代理(JDK 动态代理) * * @author nami404 * * @date 2024/6/25 18:44 */ public class ServiceProxy implements InvocationHandler { /** * 调用代理 * * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //指定序列化器 JdkSerializer serializer = new JdkSerializer(); //构造请求 RpcRequest rpcRequest = RpcRequest.builder() .serviceName(method.getDeclaringClass().getName()) .methodName(method.getName()) .parameterType(method.getParameterTypes()) .args(args) .build(); try { // 序列化 byte[] bodyBytes = serializer.serialize(rpcRequest); // 发送请求 // todo 注意,这里地址是硬编码(需要使用注册中心和服务发现机制解决) try (HttpResponse httpResponse = HttpRequest.post("http://localhost:8080") .body(bodyBytes) .execute()) { byte[] result = httpResponse.bodyBytes(); // 反序列化 RpcResponse rpcResponse = serializer.deserialize(result, RpcResponse.class); return rpcResponse.getData(); } } catch (IOException e) { e.printStackTrace(); } return null; } }
工厂模式:
/** * 服务代理工厂(用于创建代理对象) * @author nami404 * * @date 2024/6/25 18:44 */ public class ServiceProxyFactory { /** * 根据服务类获取代理对象 * * @param serviceClass * @return * @param <T> */ public static <T> T getProxy(Class<T> serviceClass) { return (T) Proxy.newProxyInstance(serviceClass.getClassLoader(), new Class[]{serviceClass}, new ServiceProxy()); } }
实际调用方式:
UserService userService = ServiceProxyFactory.getProxy(UserService.class);
__EOF__

本文作者:techgy
本文链接:https://www.cnblogs.com/techgy/p/18269243.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/techgy/p/18269243.html
关于博主:I am a good person
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
2023-06-26 mac电脑安装软件报错“软件已经损坏”的解决方案