关于代理:Wireguard部署

Wireguard部署背景应用Wireguard做VPN服务,平安的拜访内网中的资源应用Docker Compose部署frps部署在公网服务器上部署Frp服务端,配置文件frps.ini如下 [common]bind_port = ${port}# validation, same in frpc.initoken = ***# dashboard configdashboard_port = ${dashboard_port}dashboard_user = ${user}dashboard_pwd = ${passwd}bind port是承受Frp客户端连贯的端口(留神在云服务配置界面的防火墙配置中关上对应的端口)token用来验证Frp客户端连贯的合法性dashboard_port是Frp提供的dashboard的拜访端口,能够查看连贯状况执行docker run --restart=always --network host -d -v ${PWD}/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps 部署Frp服务端dashboard拜访端口能够不裸露在公网中,参考端口映射服务端部署Docker Compose联合 Frp内网穿透裸露部署在内网的VPN服务,wireguard.yaml version: "2"services: vpn: image: place1/wg-access-server volumes: - wg-data:/data ports: - 51820:51820/udp - 8000:8000 restart: unless-stopped cap_add: - NET_ADMIN environment: - WG_ADMIN_PASSWORD=admin - WG_WIREGUARD_PRIVATE_KEY=... devices: - /dev/net/tun:/dev/net/tun frp: image: snowdreamtech/frpc restart: always volumes: - ./frpc.ini:/etc/frp/frpc.ini container_name: frpc network_mode: "host"volumes: wg-data:WG_WIREGUARD_PRIVATE_KEY局部能够间接应用Wireguard生成一个私钥进去 ...

April 26, 2022 · 1 min · jiezi

关于代理:在终端使用代理

本地应用 Clash 做 查看 clash 代理配置 能够看到 127.0.0.1:7890 同时反对 http、socks5 协定的代理 在终端中间接运行: export http_proxy="http://127.0.0.1:7890"export https_proxy="http://127.0.0.1:7890"或者走 socket5 协定的话 export http_proxy="socks5://127.0.0.1:7890"export https_proxy="socks5://127.0.0.1:7890"或者罗唆间接设置 all_proxy export all_proxy=socks5://127.0.0.1:7890上面测试下代理是否失效 先查看本机公网 ip curl cip.cc 配置代理后再次查看本机公网 ip export all_proxy=socks5://127.0.0.1:7890curl cip.cc 能够看出,两次的公网地址不一样 参考 https://zhuanlan.zhihu.com/p/...

April 26, 2022 · 1 min · jiezi

关于代理:WSL2连接到宿主Windows程序的网络代理设置

WSL2想要连上宿主机Windows里设置的网络代理端口很是蛋疼。 前置条件PS C:\Users\overlord> wsl -l -v NAME STATE VERSION* Ubuntu-20.04 Running 2获取Host和WSL的ip首先咱们须要获取WSL2的动静IP,再每次Windows零碎重启之后,它会动静给WSL2调配一个新IP。 所以能够写个脚本displayip.sh,来动静获取。 #!/bin/bashecho "Host ip: $(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')"echo "WSL client ip: $(hostname -I | awk '{print $1}')"运行可查看以后Windows host主机ip、WSL的ip。 chmod +x displayip.sh ./displayip.shHost ip: 172.20.96.1WSL client ip: 172.20.99.149Windows应用的代理程序我用的Clash for Windows反对http和socks5代理。 代理端口为1081。 谬误尝试Windows Defender 里新增入站规定管理员权限ps运行: New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow会在Windows Defender 防火墙里减少开启一条入站规定“WSL”。这条规定容许全副接口名为 vEthernet (WSL) ——也就是WSL2的入站连贯。 在WSL的bash里ping宿主主机,测试连通: ...

February 25, 2022 · 2 min · jiezi

关于代理:日常记录2

谬误记录proxy代理,在低版本node上报错问题 const a = obj => new Proxy({},{ get(target, p){ return obj; }})应用proxy,代理一个空对象{}时,如果在get办法中,返回的属性是{}没有的,底层就会调用getOwnPropertyDescriptor属性,进而呈现问题,比方报如下问题 须要解决

February 16, 2022 · 1 min · jiezi

关于代理:nps-搭建代理

参考: https://blog.csdn.net/Qwertyuiop2016/article/details/122079699在客户端一栏点新增客户端, 其中Basic认证用户名和Basic认证明码 示意代理时的用户名明码 再填一下备注,其余默认即可 增加实现后会有个客户端命令: ./npc -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcp去 https://github.com/ehang-io/nps/releases 下载客户端可执行文件 如果是Linux下载linux_amd64_client.tar.gz,如果是Windows下载windows_amd64_client.tar.gz 解压之后有一个npc(npc.exe) 而后 Linux ./npc install -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcpWindows cmd执行npc.exe install -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcp接着就能够 npc start启动了, 这个时候看客户端列表应该曾经从离线变成在线了 点击http代理一栏,新增,服务器端口填一个不被占用的,比方2048,在用宝塔放通一下防火墙的这个端口(2048) 接着就能够用 http://user:passwd@hengdin.com:2048 这个代理了 socks5也是一样

January 4, 2022 · 1 min · jiezi

关于代理:Java基础动态代理

前言Mybatis的源码实现中,应用到了动静代理的设计思维,为了搞明确Mybatis中的动静代理,本篇文章会联合实例和源码对JDK动静代理进行学习,并会在最初总结JDK动静代理与CGLIB动静代理的区别,以帮忙更好的了解动静代理,为Mybatis源码的学习打下基础。 注释一. 代理模式在学习动静代理之前,先回顾一下设计模式中的代理模式。代理模式定义为,给被代理对象提供一个代理对象以管制对被代理对象的拜访,即拜访对象不适宜或者不能间接援用被代理对象时,代理对象作为拜访对象和被代理对象之间的中介。代理模式中,有三种角色,别离为形象主题(AbstractSubject),实在主题(RealSubject )和代理(Proxy),三种角色含意如下表所示。 角色含意形象主题(AbstractSubject)通过接口或者抽象类申明实在主题和代理须要实现的业务办法。实在主题(RealSubject)实现了形象主题中的业务办法,是代理所代表的实在对象,是最终要援用的对象。代理(Proxy)实现了形象主题,提供了与实在主题雷同的办法,其外部含有对实在主题的援用,能够拜访,管制或扩大实在主题的性能。代理模式的三种角色的关系用类图示意如下。 二. 动态代理依据代理模式中的代理类的字节码文件的创立机会,能够将代理分为动态代理和动静代理:动态代理在程序运行前,代理类的字节码文件就曾经存在,而动静代理则是在程序运行期间JVM通过反射机制为代理类生成字节码文件。本大节以一个例子对动态代理进行学习。 定义形象主题,如下所示。 public interface TestServiceA { void executeTestA(); void submitTestA();}public interface TestServiceB { void executeTestB(); void submitTestB();}上述定义了两个接口作为形象主题,上面定义一个实在主题来实现形象主题,如下所示。 public class RealObject implements TestServiceA, TestServiceB { @Override public void executeTestA() { System.out.println("Test A execute."); } @Override public void submitTestA() { System.out.println("Test A submit."); } @Override public void executeTestB() { System.out.println("Test B execute."); } @Override public void submitTestB() { System.out.println("Test B submit."); }}再定义一个代理类,如下所示。 public class ProxyObject implements TestServiceA, TestServiceB { private RealObject realObject; public ProxyObject(RealObject realObject) { this.realObject = realObject; } @Override public void executeTestA() { before(); realObject.executeTestA(); after(); } @Override public void submitTestA() { before(); realObject.submitTestA(); after(); } @Override public void executeTestB() { before(); realObject.executeTestB(); after(); } @Override public void submitTestB() { before(); realObject.submitTestB(); after(); } private void before() { System.out.println("Begin to do."); } private void after() { System.out.println("Finish to do."); }}能够看到,实在主题RealObject和代理ProxyObject均实现了形象主题,同时代理ProxyObject还持有实在主题RealObject的援用,因而须要通过ProxyObject能力拜访到RealObject,同时ProxyObject在执行RealObject的办法时,还能够执行一些额定的逻辑来扩大RealObject的性能。编写一个客户端程序,如下所示。 ...

November 8, 2021 · 5 min · jiezi

关于vue.js:Vue3Vue2实现数据响应式的区别

Vue2实现响应式的外围: 对象:通过defineProperty对对象的已有属性值的读取和批改进行劫持(监督/拦挡)数组:通过重写数组更新数组一系列更新元素的办法来实现元素批改的劫持1、应用observe函数遍历data的每个属性 2、调用Object.defineProperty()对每个属性做响应式解决:利用拦截器属性get()和set()办法做订阅-公布解决。 3、当对一个属性进行响应式解决的适宜,会实例化一个Dep实例,并将用到这个属性的组件所对应的Watcher实例全副寄存在subs数组里,当属性被批改时,告诉watcher,调用外面的render函数,进行dom的diff和更新。 问题: 须要遍历须要监听的每个对象的每个属性,对其增加definePropert办法,通过其外部的get()和set()办法进行数据的监听和拦挡,实现非常复杂。对象间接新增加的属性或删除已有属性,界面不会自动更新,须要应用Vue.set()间接通过下标替换元素或更新length,界面也不会自动更新数据的响应式解决和视图未齐全解耦Vue3实现响应式的外围:通过proxy代理:拦挡对data任意属性的任意操作,包含属性值的读写,属性的增加,属性的删除等。通过reflect反射,动静对被代理对象的相应属性进行特定的操作。 //申明一个一般对象,让其变成一个proxy代理响应式对象let user = { name: 'Liane', age: 18}//通过new运算符,实例化一个proxy对象,new Proxy(target, handler)//参数1、target--指标对象//参数2、handler--处理器对象,用来监督数据,及数据操作let proxyUser = new Proxy(user, { //获取指标对象的某个属性值 get(target, prop) { console.log('get办法调用了') //通过Reflect反射,对被代理对象(指标对象)的相应属性进行特定操作 return Reflect.get(target, prop) }, //批改指标对象的属性值/为指标对象增加新的属性 set(target, prop, value) { console.log('set办法调用了') return Reflect.set(target, prop, value) }, //删除指标对象上的某个属性值 deleteProperty(target, prop) { console.log('delete办法调用了') return Reflect.deleteProperty(target, prop) }})console.log(proxyUser) //Proxy {name:"Liane",age:18}//通过代理对象获取指标对象中的某个属性值console.log(proxyUser.name) //Liane//批改源对象的属性,代理对象的值也会批改user.name = 'Ann'console.log(proxyUser.name) //Ann//通过代理对象,批改指标对象上的属性值proxyUser.name = 'Rose'console.log(user.name) //Rose//通过代理对象,删除指标对象上的属性值delete proxyUser.nameconsole.log(user) //{age:18}</script >长处: 在咱们动静为data增加属性时,不须要做任何解决,这个属性就曾经是响应式的了。(不必循环遍历data的每个属性,对属性都做一遍响应式解决,而是间接代理整个data对象)数组的任何操作也能够触发相应。

April 19, 2021 · 1 min · jiezi

关于代理:vue2x-配置代理-proxy

vue2.x本地开发配置代理1、关上我的项目中config -> index.js文件 2、批改proxyTable中的内容proxyTable: { "/service-core": { // 把 localhost:8080 代理为上面的地址 target: "https://test.eastgrain.cn", // localhost:8080代理为这个地址 secure: true, // 如果是https,须要配置true changeOrigin: true, // 是否跨域 // pathRewrite: { // 重写,如果开发环境地址中不须要service-core,那么能够将其重写为'' // "^/service-core": "" // } } // 想要代理的地址:'localhost:8080/service-core/wechat/serviceAccount/qrCode/create' // 代理后的地址 'https://test.eastgrain.cn/service-core/wechat/serviceAccount/qrCode/create' // axios 申请接口写法 axios.get('/service-core/wechat/serviceAccount/qrCode/create')...}依照下面的办法能够配置多个代理。 3、重启我的项目,就能够实现本地代理了。

April 14, 2021 · 1 min · jiezi

关于代理:每日一题面试官问谈谈你对ES6的proxy的理解

关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle一、前言2020.12.23 日刚立的 flag,每日一题,题目类型不限度,能够是:算法题,面试题,论述题等等。 本文是「每日一题」第 8 题:[每日一题]面试官问:谈谈你对ES6的proxy的了解 往期「每日一题」: 第 7 题[[每日一题]面试官问:for in和for of 的区别和原理?](https://mp.weixin.qq.com/s/Rs...第 6 题[[每日一题]面试官问:Async/Await 如何通过同步的形式实现异步?](https://mp.weixin.qq.com/s/UA...第 5 道「每日一题」到底该如何答复:vue数据绑定的实现原理?第 4 道「每日一题」与面试官手撕代码:如何迷信高效的寻找反复元素?第 3 道「「每日一题」面试官问你对 Promise 的了解?可能是须要你能手动实现各个个性」第 2 道[「[每日一题]ES6 中为什么要应用 Symbol?」](https://mp.weixin.qq.com/s/om...第 1 道「一道面试题是如何引发深层次的灵魂拷问?」二、什么是Proxy?Proxy,代理,是ES6新增的性能,能够了解为代理器(即由它代理某些操作)。 Proxy 对象用于定义或批改某些操作的自定义行为,能够在外界对指标对象进行拜访前,对外界的拜访进行改写。 1、Proxy定义var proxy = new Proxy(target, handler)new Proxy()示意生成一个 Proxy 实例 target:指标对象handler:一个对象,其属性是当执行一个操作时定义代理的行为的函数。留神:要实现拦挡操作,必须是对 Proxy 实例进行操作,而不是针对指标对象 target 进行操作。 2、proxy拦挡get和set操作咱们先来看一下proxy拦挡get和set操作,示例代码如下: let handler = { get: function(target, key, receiver) { console.log(`getter ${key}!`) return Reflect.get(target, key, receiver) }, set: function(target, key, value, receiver) { console.log(`setter ${key}=${value}`) return Reflect.set(target, key, value, receiver) }}var obj = new Proxy({}, handler)obj.a = 1 // setter a=1obj.b = undefined // setter b=undefinedconsole.log(obj.a, obj.b) // getter a!// getter b!// 1 undefinedconsole.log('c' in obj, obj.c) // getter c!// false undefined3、proxy笼罩组件的原始行为咱们来看一下,示例代码如下: ...

January 10, 2021 · 3 min · jiezi

关于代理:每日一题面试官问谈谈你对ES6的proxy的理解

关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle一、前言2020.12.23 日刚立的 flag,每日一题,题目类型不限度,能够是:算法题,面试题,论述题等等。 本文是「每日一题」第 8 题:[每日一题]面试官问:谈谈你对ES6的proxy的了解 往期「每日一题」: 第 7 题[[每日一题]面试官问:for in和for of 的区别和原理?](https://mp.weixin.qq.com/s/Rs...第 6 题[[每日一题]面试官问:Async/Await 如何通过同步的形式实现异步?](https://mp.weixin.qq.com/s/UA...第 5 道「每日一题」到底该如何答复:vue数据绑定的实现原理?第 4 道「每日一题」与面试官手撕代码:如何迷信高效的寻找反复元素?第 3 道「「每日一题」面试官问你对 Promise 的了解?可能是须要你能手动实现各个个性」第 2 道[「[每日一题]ES6 中为什么要应用 Symbol?」](https://mp.weixin.qq.com/s/om...第 1 道「一道面试题是如何引发深层次的灵魂拷问?」二、什么是Proxy?Proxy,代理,是ES6新增的性能,能够了解为代理器(即由它代理某些操作)。 Proxy 对象用于定义或批改某些操作的自定义行为,能够在外界对指标对象进行拜访前,对外界的拜访进行改写。 1、Proxy定义var proxy = new Proxy(target, handler)new Proxy()示意生成一个 Proxy 实例 target:指标对象handler:一个对象,其属性是当执行一个操作时定义代理的行为的函数。留神:要实现拦挡操作,必须是对 Proxy 实例进行操作,而不是针对指标对象 target 进行操作。 2、proxy拦挡get和set操作咱们先来看一下proxy拦挡get和set操作,示例代码如下: let handler = { get: function(target, key, receiver) { console.log(`getter ${key}!`) return Reflect.get(target, key, receiver) }, set: function(target, key, value, receiver) { console.log(`setter ${key}=${value}`) return Reflect.set(target, key, value, receiver) }}var obj = new Proxy({}, handler)obj.a = 1 // setter a=1obj.b = undefined // setter b=undefinedconsole.log(obj.a, obj.b) // getter a!// getter b!// 1 undefinedconsole.log('c' in obj, obj.c) // getter c!// false undefined3、proxy笼罩组件的原始行为咱们来看一下,示例代码如下: ...

January 10, 2021 · 3 min · jiezi

关于代理:链式调用与proxy

链式调用尽管高兴,可每个办法前面的 return this 略显繁琐与俊俏,括号与引号也未免太多。 例如上面这个简略的logger new Logger() .addLabel("warn", "l4", "登录", "游客", "error") .addContent("失败") .addContent("明码不对") .end();你可能曾经对这样的封装司空见惯了,但其实他还能这样写! Log.warn.l4.label("登录", "游客").log("失败").error.明码不对;我感觉后者有一种简洁美 具体实现如下 class Logger { label: string[] = []; content: unknown[] = []; addLabel(...label: string[]) { this.label.push(...label); return this; } addContent(content: unknown) { this.content.push(content); return this; } end() { // 做一些存储打印之类的操作 console.log(this); }}function getLog() { const logger = new Logger(); /** 拜访链路 */ const propertyLink: (string | number | symbol)[] = []; const self = (new Proxy(/** 指标不重要,因为实际上应用 target */ getLog, { get(target, property, receiver) { propertyLink.push(property); // console.log(property); if (/** 表等级用 */ typeof property === "string" && /l\d+/.test(property)) { logger.addLabel(property); } else if (/** 间接增加标签 */ typeof property === "string" && ["warn", "error"].includes(property)) { logger.addLabel(property); } else if (/** 能够调用的办法 */ typeof property === "string" && ["log", "label"].includes(property)) { // 调用则增加内容 } else { //over logger.addContent(property); return logger.end(); } return self; }, apply(target, thisArg, argumentsList) { const previousProperty = propertyLink[propertyLink.length - 1]; if (previousProperty === "label") { logger.addLabel(...argumentsList); } else if (previousProperty === "log") { logger.addContent(argumentsList); } return self; }, }) as any) as Log; return self;}const Log = new Proxy(getLog(), { get() { return getLog(); },});type Log = { error: Log; warn: Log; info: Log; label: (...lables: string[]) => Log; l1: Log; l2: Log; l3: Log; l4: Log; l5: Log; l6: Log; l7: Log; l8: Log; l9: Log; /** 具体音讯 */ [k: string]: void | Log | any; log: (...arg: unknown[]) => Log; end: void;};Log.error.l9.错了呀;Log.error.l9.warn.错了呀;Log.error.l4.那天夕阳下的奔跑是我逝去的青春;Log.warn.l4.log("有毒?").end;Log.warn.l4 .label("登录") .label("游客") .log("失败").end;Log.warn.l4.label("登录", "游客").log("失败").error.明码不对;new Logger() .addLabel("warn", "l4", "登录", "游客", "error") .addContent("失败") .addContent("明码不对") .end(); ...

August 20, 2020 · 2 min · jiezi