当前位置: 首页 > news >正文

手机网站 滑动翻页京山网站设计公司

手机网站 滑动翻页,京山网站设计公司,企业管理咨询服务有限公司,济南市建设执业资格注册中心网站前言:利用netty异步事件驱动的网络通信模型,来实现rpc通信 一、大致目录结构: 二、两个端:服务端(发布),客户端(订阅消费),上代码: 1.服务端&am…

前言:利用netty异步事件驱动的网络通信模型,来实现rpc通信

一、大致目录结构:

二、两个端:服务端(发布),客户端(订阅消费),上代码:

1.服务端(发布):

RPCServer:

代码:

public class RpcServer {private Map<String, Object> registryMap = new HashMap<>();private List<String> classCache = new ArrayList<>();// 1.实现发布;实现方式:// 1.1查找指定目录下的所有接口,放入一个集合中// 1.2遍历所有接口,放入一个map中存放接口路径及接口名称// 1.3发送方法相关信息public void publish(String providerPackage) throws Exception {getProviderClass(providerPackage);doRegister();NioEventLoopGroup parentGroup = new NioEventLoopGroup();NioEventLoopGroup childGroup = new NioEventLoopGroup();try {ServerBootstrap serverBootstrap = new ServerBootstrap();serverBootstrap.group(parentGroup, childGroup).option(ChannelOption.SO_BACKLOG, 1024).childOption(ChannelOption.SO_KEEPALIVE, true).channel(NioServerSocketChannel.class).childHandler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline = socketChannel.pipeline();pipeline.addLast(new ObjectEncoder());pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE, ClassResolvers.cacheDisabled(null)));pipeline.addLast(new RpcServerHandler(registryMap));}});ChannelFuture future = serverBootstrap.bind(9999).sync();System.out.println("服务端监听9999端口,启动成功。。。");future.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();} finally {parentGroup.shutdownGracefully();childGroup.shutdownGracefully();}}private void doRegister() throws Exception {if (classCache.size() > 0) {for (String className :classCache){Class<?> clazz = Class.forName(className);String interfaceName = clazz.getInterfaces()[0].getName();registryMap.put(interfaceName, clazz.newInstance());}}}/*** 获取当前目录下的所有接口,汇总到一个集合中* @param providerPackage*/private void getProviderClass(String providerPackage) {URL resource =         this.getClass().getClassLoader().getResource(providerPackage.replaceAll("\\.", "/"));File file = null;if (resource != null) {file = new File(resource.getFile());}if (file != null) {for (File f : Objects.requireNonNull(file.listFiles())) {if (f.isDirectory()) {getProviderClass(providerPackage + "." + f.getName());} else if (f.getName().endsWith(".class")) {String fileName = f.getName().replace(".class", "").trim();classCache.add(providerPackage + "." + fileName);}}}}}

服务端处理器:用于处理消费端发送过来的接口数据

代码:

public class RpcServerHandler extends ChannelInboundHandlerAdapter {private Map<String, Object> registryMap;public RpcServerHandler(Map<String, Object> registryMap) {this.registryMap = registryMap;}@Overridepublic void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {System.out.println("rpc-server收到客户端消息:" + msg);if (msg instanceof InvokeMessage) {InvokeMessage method = (InvokeMessage) msg;Object result = "rpc-server端没有该方法";// 判断是否存在该方法if (registryMap.containsKey(method.getClassName())) {Object provider = registryMap.get(method.getClassName());result = provider.getClass().getMethod(method.getMethodName(), method.getParamTypes()).invoke(provider, method.getParamValues());}// 把方法返回结果,发给订阅者ctx.channel().writeAndFlush(result);ctx.close();}}@Overridepublic void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {cause.printStackTrace();ctx.close();}
}

接口的实现类:这里的接口是客户端的接口Api

代码:

public class SsenServiceApiImpl implements SsenServiceApi {@Overridepublic String hellRpc(String name) {return name + "实现类方法";}
}

2.客户端:(订阅消费)

这里采用JDK原生的基于接口的动态代理f发

public class RpcProxy {// JDK基于接口的动态代理,用于创建代理对象public static <T> T create(Class<?> clazz) {return (T) Proxy.newProxyInstance(clazz.getClassLoader(),new Class[]{clazz},new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {if (Object.class.equals(method.getDeclaringClass())) {return method.invoke(proxy, method, args);}// 通过netty将接口信息发送给提供者,获取指定方法return RpcInvoke(clazz, method, args);}});}private static Object RpcInvoke(Class<?> clazz, Method method, Object[] args) {NioEventLoopGroup eventGroup = new NioEventLoopGroup();RpcClientHandler rpcClientHandler = new RpcClientHandler();try {Bootstrap bootstrap = new Bootstrap();bootstrap.group(eventGroup).channel(NioSocketChannel.class).option(ChannelOption.TCP_NODELAY, true).handler(new ChannelInitializer<SocketChannel>() {@Overrideprotected void initChannel(SocketChannel socketChannel) throws Exception {ChannelPipeline pipeline = socketChannel.pipeline();pipeline.addLast(new ObjectEncoder());pipeline.addLast(new ObjectDecoder(Integer.MAX_VALUE,ClassResolvers.cacheDisabled(null)));pipeline.addLast(rpcClientHandler);}});// 绑定指定服务地址ChannelFuture future = bootstrap.connect("localhost", 9999).sync();// 指定接口信息发送给提供者InvokeMessage invokeMessage = new InvokeMessage();invokeMessage.setClassName(clazz.getName());invokeMessage.setMethodName(method.getName());invokeMessage.setParamTypes(method.getParameterTypes());invokeMessage.setParamValues(args);future.channel().writeAndFlush(invokeMessage).sync();future.channel().closeFuture().sync();} catch (Exception e) {e.printStackTrace();} finally {eventGroup.shutdownGracefully();}return rpcClientHandler.getResult();}}
http://www.yayakq.cn/news/725477/

相关文章:

  • 物流运输做网站的素材纯静态网站部署服务器
  • 公司电脑做网站wordpress后台增加管理页
  • 发布网站建设需求的经验免费域名申请国外
  • 微信网站建设公司费用自己做的网页发布
  • 深圳网站建设 罗湖wordpress积分商城主题
  • 网站建立安全连接失败个人网站实现与设计论文
  • 淄博网站建设公司羊肉片机wordpress智能插件
  • 建设购物网站的条件泉州制作网站设计
  • 企业官方网站建设目的深圳燃气公司电话
  • 玉溪的网站建设公司破解版 wordpress
  • 做网站推广的前期条件东莞小程序开发制作
  • 做网站主图多少钱佛山网站建设 合优
  • 制作网站的全过程外贸圈app
  • 手机公众平台网站开发wordpress创建空白网页
  • 国内网站设计案例欣赏网页设计代码html文件怎么查
  • 汕头免费模板建站长沙核酸检测点
  • 手机站喝茶影视网站设计师加油站
  • 企业网站建设的定位推广公众号有哪些方法
  • 邯郸做网站推广的地方公司建站模版
  • 做网站的企业是什么行业潜江资讯网官网
  • 宿州官方网站建设网站开发的问题有哪些
  • 淘宝上的网站建设南昌网站seo哪家公司好
  • 建设一个旅游网站的目的是什么中企动力技术支持网站
  • 网站做数据监测网站做到赣州第一名要多少钱
  • 网站首页加浮动窗口通州区住房和城乡建设部网站
  • 网站策划报告学校网站开发招标
  • 股票场外期权网站开发辽宁建设科技信息网网站
  • 做视频推广有哪几个网站涟源市住房与城乡建设局网站
  • 做网站好的cps推广是什么意思
  • 济南高新区网站建设北京搬家公司哪家服务最好