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

app展示网站模板免费下载某公司网络营销现状分析

app展示网站模板免费下载,某公司网络营销现状分析,成都做app定制,ps设计网站首页效果图文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现… 文章目录 Pre核心内容服务端结构概述注册中心的实现1. 注册中心的架构2. 面向接口编程的设计3. 注册中心的接口设计4. SPI机制的应用 小结 Pre Simple RPC - 01 框架原理及总体架构初探 Simple RPC - 02 通用高性能序列化和反序列化设计与实现 Simple RPC - 03 借助Netty实现异步网络通信 Simple RPC - 04 从零开始设计一个客户端上 Simple RPC - 05 从零开始设计一个客户端下_ 依赖倒置和SPI 核心内容 服务端结构概述注册中心和RPC服务的结构及作用。注册中心实现通过单机版的注册中心实现共享元数据分析其接口设计和SPI机制。RPC服务实现理解服务端处理RPC请求的核心逻辑包括如何注册服务和处理请求。请求分发机制深入了解RequestInvocation和RpcRequestHandler类中的请求分发机制。代码分析与总结通过代码实例进一步理解设计思想并总结整体架构和设计原则。 服务端结构概述 在RPC框架中服务端可以分为两个主要部分注册中心和RPC服务。 注册中心负责管理服务元数据并提供服务发现的功能。RPC服务负责处理客户端发来的RPC请求并调用相应的业务服务。 简单来说注册中心的作用是帮助客户端来寻址找到对应 RPC 服务的物理地址RPC 服务用于接收客户端桩的请求调用业务服务的方法并返回结果。 注册中心的实现 1. 注册中心的架构 通常一个完整的注册中心包括客户端和服务端两部分 客户端向调用方提供 API负责与注册中心服务端的通信。 服务端实际管理和记录每个 RPC 服务的注册信息并将这些信息存储在元数据中。当客户端需要查找服务时服务端会返回对应的服务地址。 在本例中出于简化考虑我们实现了一个单机版的注册中心。这个注册中心只有客户端部分多个客户端通过读写同一个本地元数据文件实现服务信息的共享。 该注册中心只能在单机环境下运行不支持跨服务器调用。 2. 面向接口编程的设计 尽管当前实现是单机版的注册中心但通过“面向接口编程”的设计模式我们可以在不修改已有代码的情况下通过 SPI 插件机制扩展出一个支持跨服务器调用的注册中心例如基于 HTTP 协议的实现。 3. 注册中心的接口设计 在 RPC 框架的接入点接口 RpcAccessPoint 中增加了一个用于获取注册中心实例的方法 public interface RpcAccessPoint extends Closeable {/*** 获取注册中心的引用* param nameServiceUri 注册中心 URI* return 注册中心引用*/NameService getNameService(URI nameServiceUri); }该方法接受一个注册中心的 URI 作为参数并返回一个 NameService 接口的实例。这个 NameService 接口表示注册中心的客户端可以用来和注册中心服务端通信。 NameService 接口中定义了与注册中心通信的核心方法 public interface NameService {/*** 返回所有支持的协议*/CollectionString supportedSchemes();/*** 连接注册中心* param nameServiceUri 注册中心地址*/void connect(URI nameServiceUri); }supportedSchemes 方法返回注册中心支持的协议例如 file 或 http。connect 方法根据 URI 建立与注册中心的连接。 完整代码如下 /*** 注册中心接口定义* 该接口用于服务的注册和发现支持多种通信协议** author artisan*/ public interface NameService {/*** 获取所有支持的协议** return 支持的协议集合*/CollectionString supportedSchemes();/*** 连接注册中心** param nameServiceUri 注册中心的URI地址*/void connect(URI nameServiceUri);/*** 注册服务** param serviceName 服务名称* param uri 服务的URI地址* throws IOException 如果连接或注册失败则抛出此异常*/void registerService(String serviceName, URI uri) throws IOException;/*** 查询服务地址** param serviceName 服务名称* return 服务的URI地址* throws IOException 如果查找失败则抛出此异常*/URI lookupService(String serviceName) throws IOException; } 4. SPI机制的应用 通过 SPI 机制RpcAccessPoint 可以根据 URI 中指定的协议动态加载不同的 NameService 实现类。例如在单机版注册中心中NameService 的实现类是 LocalFileNameService其具体功能是读写本地文件存储和查找服务信息。 public class LocalFileNameService implements NameService {Overridepublic CollectionString supportedSchemes() {return Collections.singleton(file);}Overridepublic void connect(URI nameServiceUri) {// 连接到本地文件初始化文件读写工具}// 其他方法实现... }通过这种方式新的注册中心实现可以通过 SPI 动态添加到系统中。例如要实现一个基于 HTTP 的注册中心只需开发一个新的 NameService 实现类并将其添加到系统的 CLASSPATH 中即可。 LocalFileNameService代码如下 /*** LocalFileNameService 类实现了 NameService 接口提供了一种基于文件系统来管理服务名称和URI的实现方式* 它使用 file 协议来操作本地文件并将服务信息存储在文件中* author artisan*/ public class LocalFileNameService implements NameService {private static final Logger logger LoggerFactory.getLogger(LocalFileNameService.class);/*** 支持的协议集合本实现仅支持 file 协议*/private static final CollectionString schemes Collections.singleton(file);/*** 用于存储服务信息的文件对象*/private File file;/*** 返回此服务支持的协议集合** return 支持的协议集合*/Overridepublic CollectionString supportedSchemes() {return schemes;}/*** 连接到指定的名称服务URI如果支持该URI的协议则将URI解析为本地文件* 此方法首先检查给定的URI是否使用受支持的协议如果协议受支持则将URI转换为本地文件路径* 如果不支持该协议则抛出运行时异常** param nameServiceUri 名称服务的URI用于连接和解析* throws RuntimeException 如果URI的协议不受支持则抛出此异常*/Overridepublic void connect(URI nameServiceUri) {// 检查URI的协议是否在支持的协议列表中if (schemes.contains(nameServiceUri.getScheme())) {// 如果协议受支持则将URI转换为本地文件路径file new File(nameServiceUri);} else {// 如果协议不受支持则抛出异常throw new RuntimeException(Unsupported scheme!);}}/*** 注册服务将服务名称和服务URI写入到文件中* 此方法是同步的以确保并发访问时的数据一致性** param serviceName 服务名称* param uri 服务的URI* * throws IOException 如果发生I/O错误*/Overridepublic synchronized void registerService(String serviceName, URI uri) throws IOException {// 记录服务注册的日志信息logger.info(Register service: {}, uri: {}., serviceName, uri);// 使用RandomAccessFile和FileChannel来读写文件并确保资源在使用后能够正确关闭try (RandomAccessFile raf new RandomAccessFile(file, rw);FileChannel fileChannel raf.getChannel()) {// 获取文件锁以确保并发访问时的数据一致性FileLock lock fileChannel.lock();try {// 获取文件长度用于后续判断文件是否为空int fileLength (int) raf.length();Metadata metadata;byte[] bytes;// 如果文件长度大于0说明文件非空读取并解析文件内容if (fileLength 0) {bytes new byte[(int) raf.length()];ByteBuffer buffer ByteBuffer.wrap(bytes);// 循环读取文件内容到ByteBuffer中while (buffer.hasRemaining()) {fileChannel.read(buffer);}// 解析字节码为Metadata对象metadata SerializeSupport.parse(bytes);} else {// 如果文件为空创建一个新的Metadata对象metadata new Metadata();}// 根据服务名获取或创建一个空的URI列表ListURI uris metadata.computeIfAbsent(serviceName, k - new ArrayList());// 如果列表中不存在该URI则添加进去if (!uris.contains(uri)) {uris.add(uri);}// 记录更新后的Metadata信息logger.info(metadata.toString());// 将Metadata对象序列化为字节码bytes SerializeSupport.serialize(metadata);// 清空文件为写入新的字节码做准备fileChannel.truncate(bytes.length);// 将文件指针移到文件开头准备写入fileChannel.position(0L);// 将字节码写入文件fileChannel.write(ByteBuffer.wrap(bytes));// 强制将写入操作刷入磁盘fileChannel.force(true);} finally {// 释放文件锁lock.release();}}}/*** 根据服务名称查找服务的URI* 如果文件中存在对应的服务URI则随机返回一个** param serviceName 服务名称* return 服务的URI如果找不到则返回null* throws IOException 如果发生I/O错误*/Overridepublic URI lookupService(String serviceName) throws IOException {Metadata metadata;// 使用try-with-resources语句确保文件资源正确关闭try (RandomAccessFile raf new RandomAccessFile(file, rw);FileChannel fileChannel raf.getChannel()) {// 获取文件锁以确保数据的一致性FileLock lock fileChannel.lock();try {// 读取文件内容到字节数组byte[] bytes new byte[(int) raf.length()];ByteBuffer buffer ByteBuffer.wrap(bytes);// 循环读取直到文件末尾while (buffer.hasRemaining()) {fileChannel.read(buffer);}// 如果文件非空则反序列化为Metadata对象否则创建新的空Metadata对象metadata bytes.length 0 ? new Metadata() : SerializeSupport.parse(bytes);// 记录日志logger.info(metadata.toString());} finally {// 释放文件锁lock.release();}}// 从Metadata中获取服务的所有URIListURI uris metadata.get(serviceName);// 如果没有找到对应的URI列表返回nullif (null uris || uris.isEmpty()) {return null;} else {// 随机选择一个URI返回return uris.get(ThreadLocalRandom.current().nextInt(uris.size()));}} } 小结 面向接口编程设计时面向接口编程使得系统具有良好的扩展性可以通过增加 SPI 插件方式扩展新的功能。单机版注册中心当前实现的是一个单机版的注册中心通过本地文件共享元数据不支持跨服务器调用。SPI机制通过 SPI 机制可以动态加载不同的 NameService 实现支持多种协议的注册中心。 这种设计模式确保了系统的灵活性和可扩展性为后续的功能扩展提供了便利。
http://www.w-s-a.com/news/890270/

相关文章:

  • 本地生活服务平台app网站关键词优化原理
  • 建网站的公司叫什么重庆论坛建站模板
  • 湖北网站制作公司银川网站建设哪家不错
  • 网站后台演示地址服装网站建设公司推荐
  • 湖北钟祥建设局网站旅游哪个网站最好
  • 浙江建设工程信息网站辽宁建设工程信息网场内业绩什么意思
  • 郑州做网站公司 汉狮网络专业图片搜集网站怎么做
  • 网站托管是什么品牌推广营销平台
  • 制作网站的难度贵州省兴义市建设局网站
  • 永春建设局网站室内设计师培训班学费多少
  • 做仿站如何获取网站源码windows2012做网站
  • 网站建设最好的公司东莞外贸网站
  • 普兰店网站建设一般做网站什么价格
  • 网站建设的发展目标甘肃网站设计公司
  • 常州西站建设规划室内装修设计学校哪里好
  • 大连网站制作选择ls15227如何编辑网站
  • 网站发稿平台迪士尼网站是谁做的
  • 常州有哪些好的网站建设案例wordpress 360 插件
  • 模板网站有后台么柳城网站建设
  • 地方门户网站制作一级做c爱片的网站
  • 自己上传图片做动漫图网站北京福田汽车
  • 一级a做爰片免费网站录像ps做网站图片水印
  • 网页广告投放成都优化推广公司
  • 网站开发 印花税网页制作站点
  • 创建个人网站有什么好处国外建站系统
  • 桂林学校网站制作2018年网站设计公司
  • 建网站不想用怎样撤销搜狗收录提交入口网址
  • 做简单网站需要学什么软件有哪些南通优普网站建设
  • 网站排版尺寸湖北交投建设集团集团网站
  • 南京网站设计公司有哪些公司看动漫是怎么做视频网站