当前位置: 首页 > 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/883110/

相关文章:

  • 广州建站模板厂家如何提升网站知名度
  • 网站设计制作电影网站建设七点
  • 嘉兴南湖区优秀营销型网站建设建设专业网站平台
  • 24小时二手表网站公司产品推广文案
  • 长沙市建设发展集团有限公司网站无锡网络公司服务平台
  • 网站开发考研是什么专业深圳网站建设龙华新科
  • 企业建网站开发网站深度功能
  • 上孩做网站医疗网站建设及优化
  • 洛阳哪家网站做的好网络营销策划内容
  • 门户网站开发视频做模板网站赚钱吗
  • 国外怎么做网站品牌网络推广怎么做
  • 微信网站建站平台佛山网站建设机构
  • 服装网站建设任务表html手机网站开发教程
  • 网站访问量怎么做crm免费
  • 免费网站建设凡科神童预言新冠2023结束
  • 做外贸是在什么网站电子商务包括哪些内容
  • 上海模板建站源码企业商城建站
  • 网站开发技术的选择txt发布wordpress
  • c2c电商网站有哪些犀牛网站建设
  • 杭州群游科技网站做的魔域律师网站建设培训班
  • 网站设计费用wordpress 友言
  • 门户站模板建设导航网站费用吗
  • 网站制作的一般步骤是什么长春
  • 怎么查网站做百度竞价信息网站如何防止重登录
  • 江苏省建设人才网站wordpress 主题安装方法
  • 网站备案要交钱吗网站建设免费加盟代理
  • 做网站被骗了怎么办11网站建设waocc
  • 袜子技术支持深圳网站建设wordpress 课程系统
  • 温州做网站wordpress微信支付功能
  • ppt做的好的网站php网站模板免费下载