【设计模式系列学习笔记】9、原型模式 prototype

【Druid源码阅读】2. 初始化连接之异步创建连接 今天就连着昨天的思路,来看下连接到底是如何初始化的。 第14步: 初始化连接,数量为设置的初始连接数,并存放到数组中;(真正创建连接在这一步中) if (createScheduler != null && asyncInit) { // 异步 for (int i = 0; i < initialSize; ++i) { submitCreateTask(true); } } else if (!asyncInit) { //.. 阅读详情

原型模式prototype,用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象;

原型模式其实就是从一个对象再创建另外一个可定制的对象,而且不需要知道任何创建的细节;

对于java而言,就是克隆,需要实现Cloneable接口,并覆写clone方法,分为浅克隆和深克隆;

clone默认方法,如果字段是值类型的,则对该字段执行逐位复制,如果字段是引用类型的,则复制引用但不复制引用的对象,所以原始对象及其复本引用同一对象;

浅克隆,被克隆的对象的所有变量都含有与原来的对象相同的值,而所有的对其他对象的引用都仍然指向原来的对象;

深克隆,把引用对象的变量指向复制过的新对象,而不是原有的被引用的对象;

 

通过new产生一个对象需要非常繁琐的数据准备或访问权限时,则可以使用原型模式;

短时间内创建大量对象,并且new比较耗时时使用;

 

还可以通过序列化和反序列化实现深克隆

public static void main(String[] args) {
    Resume resume1 = new Resume("Jhon Smith");
    resume1.setPersonelInfo("female", 22);
    resume1.setWorkExperience("1998-2002", "XX Company");
    ByteArrayOutputStream bos = null;
    ObjectOutputStream oos = null;
    ByteArrayInputStream bis = null;
    ObjectInputStream ois = null;
    Resume resume2 = null;
    try {
        bos = new ByteArrayOutputStream();
        oos = new ObjectOutputStream(bos);
        oos.writeObject(resume1);
        byte[] bytes = bos.toByteArray();
        bis = new ByteArrayInputStream(bytes);
        ois = new ObjectInputStream(bis);
        resume2 = (Resume) ois.readObject();
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        close(ois);
        close(bis);
        close(oos);
        close(bos);
    }
    resume1.display();
    if (null != resume2) {
        resume2.setWorkExperience("2002-2006", "YY Company");
        resume2.display();
    }
}

private static void close(InputStream is) {
    if (null != is) {
        try {
            is.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

private static void close(OutputStream os) {
    if (null != os) {
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

具体代码详见

https://git.lug.ustc.edu.cn/hellboy0621/transformer_gof23.git

【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析 昨天只是极简入门,关于网关是怎么感知到我们的应用的,相信小伙伴们一定有疑问,今天先来看下 HTTP 用户如何接入 Soul,以及接入的流程是怎样的。 这是官网对于 HTTP 用户的文档,https://dromara.org/zh-cn/docs/soul/user-http.html。 官网文档明确指出,Soul 网关使用 divide 插件来处理http请求,我们在 soul-admin 页面中看到,第一个就是 divide 插件,而且是默认开启的。 Http请求接入网关,分2种情况,1种是 sp 阅读详情

相关推荐

银河麒麟鲲鹏aarch64架构安装docker和K8s

鲲鹏云服务器上安装docker-云社区-华为云 (huaweicloud.com) 这里我下载的版本是docker-18.09.3.tag docker 安装包地址:https://download.docker.com/linux/static/stable 配置system服务 在github对应分支的contrib/init/systemd/ 下面,提供了对应的docker.service以及docker.socket文件,可以直接拷贝到本地文件使用: 对应链接:https://github.c

qq_50007696的博客 9056

JavaScript学习笔记(三十四) 经典模式四-共享原型

经典模式四-共享原型(Classical Pattern #4—Share the Prototype) 不像前面的经典继承模式需要调用两次parent构造函数,下面这个模式根本不需要调用parent构造函数。 经验法则复用的成员应该添加到原型(prototype)而不是this。因此为了继承这个目的,任何值得继承的东西都应该在原型中。 那么你可以设置child的原型和parent的

乱七八糟 994

安卓集成华为HMS Scankit实现自定义扫码功能

实现扫码功能 使用的是集成华为扫描的SDK,UI界面借鉴的是谷歌官方的Zxing项目中的自定义view,两者结合实现。 先上效果图: 先在项目根级别(build.gradle)当中配置HMS Core SDK的Maven仓地址。 // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huawei.com/repo/'} // 配置HMS Core SDK的Maven仓地址。 maven {url 'https://developer.huaw

qq_47625961的博客 5510

axure网页预览_预览和导出HTML

概要在Axure RP中,可以通过导出HTML文件的方式预览原型,确保项目按计划发展。分享HTML文件支持有多种方式,和项目相关人员分享时,可以有多种选择。If you're planning to deliver an HTML output as part of your project involving Axure RP, you've got a number of options fo...

weixin_39826809的博客 1697

auboi5 + d435i 使用easy handeye进行标定时,遇到相关问题记录。

解决办法:在easy_handeye默认的 calibrate.launch 文件中move group 的默认值为 "manipulator",但针对每个人的机械臂,这个值需要更改。以aubo_i5为例,需要将其改为"manipulator_i5",或者自己编写launch文件时,传入参数move group的值,便能顺利解决问题!easy_handeye_calibration_server 进程出现崩溃。

weixin_61025092的博客 958

大疆智图002:大疆智图倾斜摄影建模流程

本文主要介绍大疆智图倾斜摄影建模流程,包括新建工程、成果路径设置、导入照片、第一遍空三、像控刺点、第二遍空三、精度报告查看、三维重建等流程。

qq_31762031的博客 1万+

用Chrome打开格式为html的原型文件报这个错

Google Chrome requires an extension to view locally stored projects. Alternatively, upload your RP file to Axure Share or use a different browser. 解决办法: 打开index.html,把下面这段代码注释掉。 /* KaTeX parse error: Double subscript at position 63: … if(CHROME_5_̲LOCA

m0_38109616的博客 1739

【DexGraspNet与多指手抓取算法详解】第四章 抓取检测网络架构设计

图 $G=(V, E)$ 包含两类节点:指尖节点 $V_{tip} = \{v_{tip}^i\}_{i=1}^{N_{finger}}$ 与物体表面节点 $V_{obj} = \{v_{obj}^j\}_{j=1}^{N_{surf}}$。节点特征包含位置 $x \in \mathbb{R}^3$ 、法向 $n \in \mathbb{R}^3$ 及视觉特征 $f \in \mathbb{R}^d$。

VectorShift的博客 440

Axure RP Pro - Prototype原型 - 关闭Internet Explorer打开原型时出现的安全警告

Axure RP Pro - Prototype原型 - 关闭Internet Explorer打开原型时出现的安全警告 由于原 型包含了JavaScript脚本,因此使用Internet Explorer打开原型时会出现“为帮助保护您的安全,Internet Explorer已经限制此文件显示可能访问您的计算机的活动内容。单击此处查看选项...”的提示。要去掉该提示可以通过如下设置:“工具...

baiguomeng 1225

90. 将 SAP ABAP 内表内容本地导出成 Excel 文件

这里文件扩展名为 csv,全称是 Comma-Separated Values,意思是这种类型的文件内容,由逗号分隔。除了 ASC 之外,另一个可用的选项是 BIN,适用于 PDF,EXE 等二进制文件的导出。支持海量的输入和输出参数,我们这个简单的本地导出场景里,大部分参数都用不上。这个分隔符的添加逻辑,编写在上图红色高亮矩形框内,使用的语法是。本教程有学习者向我提问,询问如何将 ABAP 某某函数的某某输出参数的值,导出成本地 Excel 文件。把这个内表的内容,下载到本地,以本地文件的方式保存。

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 1742

C#使用OpenCvSharp+微信模型识别多个二维码

本文介绍了一个基于OpenCvSharp和微信开源二维码检测器的多二维码识别项目。该项目通过C# WinForm实现,主要功能包括:加载图片、识别图片中的多个二维码并显示识别结果。核心代码使用了OpenCvSharp.WeChatQRCode类,通过预训练的caffe模型(detect.prototxt/detect.caffemodel和sr.prototxt/sr.caffemodel)进行二维码检测和解码。识别结果包括每个二维码的编号、内容及位置信息。项目适用于批量二维码识别场景,部署简单,识别效果良

遇见--专栏 123

prototype详解

每个函数都有一个prototype属性,这个属性是指向一个对象的引用,这个对象称为原型对象,原型对象包含函数实例共享的方法和属性。   在函数内定义的变量和函数如果不对外提供接口,那么外部将无法访问到,也就是变为私有变量和私有函数。 function Obj(){ var a=0; //私有变量 var fn=func...

zengshaotao的专栏 166

基于C#开发ABB机器人上位机系统:从操作控制到数据交互的全方位实现

ABB工业机器人是世界领先的自动化设备之一,广泛应用于焊接、装配、搬运、喷涂、包装等多个行业。机器人控制器:用于控制机器人运动、路径规划、状态监控等。上位机系统:提供人机交互界面,允许操作员与机器人进行交互,实现实时控制、参数调整和数据分析。上位机系统通过与机器人控制器通信,采集机器人状态数据,发送控制指令,实现远程监控和控制操作。通过高效的操作界面和数据交互,可以大大提高机器人的工作效率和系统的可维护性。基于C#开发ABB机器人上位机系统,能够实现高效的机器人控制与实时数据交互。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1178

设计模式学习笔记:原型模式(Prototype)

原型模式属于设计模式中的创建型模式。原型模式使用较小的代价创建重复的对象,提供了一种创建对象的最佳方式。 原型模式通常使用克隆来创建对象,它解决的问题是有些对象的创建代价过大的问题,例如一个对象需要花费较大的代价查询数据库后创建,这种情况我们就可以缓存这个对象,下一次创建时直接返回它的克隆,需要时再更新数据库,以此来减少数据库的调用。

爱辰 319

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Java指定屏幕区域截屏

截取指定屏幕区域的屏幕,并保存到指定文件夹中,Demo如下:import java.awt.Dimension; import java.awt.Rectangle; import java.awt.Robot; import java.awt.Toolkit; import java.awt.image.BufferedImage; import java.io.File; import jav...

hellboy0621的博客 6226

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain&#39;s apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath(&#39;DeepLearnToolbox&#39;));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand(&#39;state&#39;,0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W&#39;); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand(&#39;state&#39;,0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = &#39;sigm&#39;;%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, &#39;Too big error&#39;);```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand(&#39;state&#39;,0)sae = saesetup([784 100]);sae.ae{1}.activation_function = &#39;sigm&#39;;sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)&#39;)% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;;nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, &#39;Too big error&#39;);```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x&#39;,28,28,60000))/255;test_x = double(reshape(test_x&#39;,28,28,10000))/255;train_y = double(train_y&#39;);test_y = double(test_y&#39;);%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you&#39;ll get around 1.2% errorrand(&#39;state&#39;,0)cnn.layers = { struct(&#39;type&#39;, &#39;i&#39;) %input layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 6, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %sub sampling layer struct(&#39;type&#39;, &#39;c&#39;, &#39;outputmaps&#39;, 12, &#39;kernelsize&#39;, 5) %convolution layer struct(&#39;type&#39;, &#39;s&#39;, &#39;scale&#39;, 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, &#39;Too big error&#39;);```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, &#39;Too big error&#39;);%% ex2 neural net with L2 weight decayrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex3 neural net with dropoutrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex4 neural net with sigmoid activation functionrand(&#39;state&#39;,0)nn = nnsetup([784 100 10]);nn.activation_function = &#39;sigm&#39;; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex5 plotting functionalityrand(&#39;state&#39;,0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = &#39;softmax&#39;; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand(&#39;state&#39;,0)nn = nnsetup([784 20 10]); nn.output = &#39;softmax&#39;; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, &#39;Too big error&#39;);```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

IntelliJ IDEA License Server本地搭建教程

1、下载文件IntelliJIDEALicenseServer(v1.6).zip 下载链接:https://pan.baidu.com/s/1pYp5Tjy-eIvfb_Z--qIXUg 密码:sozy 2、找到自己操作系统的版本,我这里使用IntelliJIDEALicenseServer_linux_amd64,上传到服务器后运行 ./IntelliJIDEALicenseServ...

hellboy0621的博客 5318

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

将自定义jar包安装到Maven本地仓库中

1、进入自定义jar包所在文件夹,在地址栏中输入cmd命令,打开DOS命令窗口; 2、执行maven命令(前提是已经将maven配置OK) 友情提醒:执行命令前,务必检查本地maven与IDE中配置的是否是同一个maven! mvn install:install-file -Dfile=bbb.jar -DgroupId=com.aaa -DartifactId=bbb -Dvers...

hellboy0621的博客 2162

【Soul源码阅读】4.HTTP 用户接入 Soul 调用 /soul-client/springmvc-register 接口逻辑分析

今天我们紧接着昨天分析继续,如果想知道昨天分析了点儿啥,出门左转【Soul源码阅读】3.HTTP 用户接入 Soul 流程解析。 1. 前情回顾 好的,言归正传,昨天分析到我们自己的业务系统,会调用 soul-admin 一个接口,把需要 Soul 网关管理的接口注册,今天就具体看看到底干了点儿啥。 先看下调用的接口信息如下: /** * Instantiates a new Soul client bean post processor. * * @param soulSpringMvcC

hellboy0621的博客 2118

Eclipse安装Spring Tool Suite(STS)

1、查看Eclipse平台版本我的是4.7.3版本2、打开Spring Tool Suite下载官方网站https://spring.io/tools/sts/all根据自己版本找到与之对应的STS版本更新链接3、在线安装将刚才的更新链接粘贴到Work with里,回车,根据情况选择:之后一路Next,Accept等,等待重启;4、验证是否安装成功重启后,查看Preferences存在Spring...

hellboy0621的博客 1783

exe4j 将jar包封装为exe

1、准备工作: 下载并安装exe4j,下载路径为 https://download.youkuaiyun.com/download/hellboy0621/10687803 将java项目使用IDE导出为jar包,一定要保证导出后的jar包可以使用java -jar命令正常运行; 2、打开exe4j工具,欢迎页如下图,默认点击“Next”; 3、选择项目类型,这里选择“JAR in EXE mo...

hellboy0621的博客 1606

【Druid源码阅读】1. 初识Druid

Druid源码阅读

hellboy0621的博客 1541

【Druid源码阅读】9. 过滤器

在前面几天获取连接的代码中,经常会看到 filters 这个属性,今天一起来看下过滤器是如何工作的。 找一个单侧,把里面连接串和用户名密码改成自己的: src/test/java/com/alibaba/druid/pool/Case0.java 设置 stat 过滤器 里面有一行代码,就是设置过滤器的: dataSource.setFilters("stat"); public void setFilters(String filters) throws SQLException {

hellboy0621的博客 1431

【Spark学习笔记】1、Java-Maven-Spark项目环境搭建

现在学习个新技术,虽然网上资料多得很,但是质量参差不齐!恕在下愚昧,实在想不懂那些都不验证帖子里技术的正确性就直接转载的那些人,心里是怎么想的!你要是感觉帖子好,请默默的收藏到你的收藏夹里,等你确定帖子内容没错的时候你再转载好不好?你不知道你这样做,对这个技术的新手来说,无疑是灾难!你埋那么多坑,是怕别人学会了超越你吗? 哎,言归正传,以下是我自己的学习总结,如果有哪里有错误、有问题,欢迎批评指...

hellboy0621的博客 1368

【Soul源码阅读】1.初识 Soul

无论我们学习什么东西之前,都要先搞清楚我们要学习的是什么,就像一些哲学思考先要给出清晰的定义,否则后面的一切都无从谈起。 从今天开始,我来和大家一起,学习一款非常优秀的开源网关项目 Soul。 Soul 是什么呢?先来看下官网作者的定义: 这是一个异步的,高性能的,跨语言的,响应式的API网关。我希望能够有一样东西像灵魂一样,保护您的微服务。参考了Kong,Spring-Cloud-Gateway等优秀的网关后,站在巨人的肩膀上,Soul由此诞生! 里面提到了几个关键字,“异步”、“高性能”、“

hellboy0621的博客 1329

【Soul源码阅读】15.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(下)

目录 1.准备 2.页面操作 3.跟踪源码 3.1 soul-admin 端 3.2 soul-bootstrap 端 上一篇讲到使用 nacos 同步策略,在项目启动时的同步机制,今天来看下在页面操作时,是怎么同步的。 1.准备 按照昨天的帖子(【Soul源码阅读】14.soul-admin 与 soul-bootstrap 同步机制之 nacos 解析(上)),把项目启动起来,soul-admin、soul-bootstrap 和 soul-examples-http 三个项目,当然还有

hellboy0621的博客 1130

【Soul源码阅读】9.soul-admin 与 soul-bootstrap 同步机制之 websocket 解析

1.前情回顾 在第4篇中,我们分析了 HTTP 用户业务系统接入 Soul 网关后,会调用 soul-admin 的注册接口,把需要网关代理的接口信息全部注册到 soul-admin 上,在最后,会通过 websocket 长连接,将soul-admin 接收到的接口信息同步给 Soul 网关(即 soul-bootstrap),今天就来接着继续分析,数据是怎么同步到 soul-bootstrap 的。 不清楚流程的可以出门左转看下第4篇文章【Soul源码阅读】4.HTTP 用户接入 Soul 调用 .

hellboy0621的博客 1081
上一篇: 【设计模式系列学习笔记】8、工厂方法模式 vs 简单工厂模式
下一篇: Java注解
hellboy0621
博客等级 码龄9年 61粉丝 147原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值