java
文章平均质量分 74
殷长庆
海中月是天上月,眼前人是心上人
展开
-
JAVA+Netty根据二级域名实现多租户内网穿透功能【设计实践】
3、访客通过二级域名访问Nginx(c1.test.com),Nginx转发请求到服务端访客代理接口(16002端口),服务端监听到之后解析二级域名,获取客户端专用连接通道,创建访客ID,然后通过(server-client通道)向客户端发送指令,客户端接收指令后连接到真实服务端口(8080,可根据启动参数修改),连接真实服务成功后,客户端会重新向服务端建立一条连接(访客-server通道),服务端把访客和该通道进行绑定。这三步最终形成了(访客-Nginx-代理-客户端-真实服务)完整的通道。原创 2023-01-29 22:00:00 · 1715 阅读 · 2 评论 -
turnserver (coturn + redis) 配置ICE server 临时用户密码【实践】
前端连接turn服务时一般都需要设置账号密码,由于都是在js中配置的,长期凭据相对临时用户安全性会差很多,本文通过程序生成临时的账号密码,把临时凭据设置到Redis中,turn服务验证的时候直接对比Redis中的账号密码,当Redis中key过期时,turnserver返回Unauthorized校验不通过。本文用到docker、Redis,需要提前准备好。原创 2022-12-24 18:22:53 · 1500 阅读 · 0 评论 -
Java+Netty+WebRTC、语音、视频、屏幕共享【聊天室设计实践】
本文使用webtrc实现了一个简单的语音视频聊天室、支持多人音视频聊天、屏幕共享。音视频功能需要在有Https协议的域名下才能获取到设备信息,正式环境可以申请一个免费的证书复杂网络环境下需要自己搭建turnserver,网络上搜索大多是使用coturn来搭建turn服务turn默认监听端口3478,可以使用webrtc.github.io测试服务是否可用本文在局域网内测试,不必要部署turn,使用的谷歌的stun:stun.l.google.com:19302原创 2022-12-09 00:33:58 · 10585 阅读 · 6 评论 -
JAVA基于Netty实现内网穿透功能【设计实践】
本文实现了一个简单的内网穿透服务,可以满足代理基于TCP协议的项目,如Tomcat、Redis、MySQL、windows远程桌面等。拆分了三个项目:1、cc-common项目:存放了消息格式和消息编解码器2、cc-server项目:内网穿透服务端项目3、cc-client项目:内网穿透客户端项目内网穿透的实现过程主要分三步1、启动服务端,这时服务端监听了两个端口(16001,16002,可根据启动参数修改),一个用来接收客户端请求(16001端口),一个用来接收访客代理(16002端口)2、启动客户端,客原创 2022-12-05 23:26:21 · 5274 阅读 · 7 评论 -
Java Annotation AbstractProcessor,通过AST修改class文件,修改方法定时任务注解,编译期解耦第三方组件
自定义一个定时器注解,我把spring的Scheduled注解作为自定义注解的结构体,方便我们编译时替换。@Retention(RetentionPolicy.SOURCE)// 编译期注解}原创 2022-09-24 18:19:38 · 1315 阅读 · 0 评论 -
Springboot、maven 打包瘦身,去除依赖的jar【springboot外置jar、配置文件】
分布式项目、微服务项目一般都会引用许多公共依赖,每次maven打出来的jar包上百M,不利于运维工作、可以在打包时隔离项目本身的jar和依赖的公用jar包,这样项目本身包可以做到很精简。本文主要把项目依赖的包和项目的配置文件在打包时导出到本身springboot 的jar包 外。本文项目中导入依赖用到了两种方式,一是直接通过maven库,二是通过导入本地第三方jar。原创 2022-09-16 18:20:33 · 4352 阅读 · 0 评论 -
Spring项目集成Sentinel,自定义BlockException异常返回值
springmvc项目中集成sentinel,通过sentinel提供的控制台配置限流、熔断等规则,项目实现UrlBlockHandler,实现在catch到blockexception时进行自定义返回值处理sentinel的官网文档非常详细的介绍了如何下载部署控制台、以及如何接入各类型的项目框架,本文以mvc项目为例,集成sentinel。启动控制台。原创 2022-09-02 23:24:28 · 1527 阅读 · 0 评论 -
Springboot、Tomcat启动加载外部指定文件夹下的jar文件
把项目中的公共jar包提取出来,放到自定义lib库文件夹中,方便统一分布式项目中依赖的jar版本,springboot是jar方式启动,Tomcat是直接start启动,加载外部jar的方式不同,下面分别介绍两种配置。原创 2022-09-01 23:05:06 · 2711 阅读 · 0 评论 -
Java ServiceLoader、Spring SpringFactoriesLoader、SPI方式解耦第三方组件
项目框架中引入了各种第三方组件,比如nacos、seata、mq、Redis、MySQL等等,这些三方组件一般都具有可替代性,如果把这些组件拿来直接使用会对原框架有一定侵入性,后期可能造成框架升级、运维等多方面的问题。使用SPI可以有效解耦三方组件,降低组件变更对原框架的影响,SPI需要原项目框架把可能用到的三方组件的功能抽象出接口,然后不同的组件按照SPI规范提供对应实现,完成对原项目框架的升级拓展。......原创 2022-08-31 20:31:45 · 467 阅读 · 0 评论 -
Springboot、Tomcat+skywalking 链路追踪、日志收集配置
skywalking适合分布式项目,零侵入源码,集成链路追踪,实现过程主要是在项目启动时使用java代理,把项目集成到skywalking中。原创 2022-08-24 22:37:19 · 2342 阅读 · 0 评论 -
Springcloud gateway + nacos灰度路由、非cloud项目通过Httpclient+nacos自定义lb灰度服务请求【设计实践】
nacos中服务的元数据存储灰度信息,HTTP调用微服务接口时header头中添加灰度参数,两个灰度信息进行匹配,匹配成功说明这次请求可以走当前服务实例,通过透传header头信息实现整个链路的灰度路由。将各个微服务项目注册到nacos中,在nacos服务列表中可以对服务实例配置元数据信息,比如我们规定灰度服务的元数据信息需要配置一个JSON字符串格式的内容。gray是自定义灰度元数据的名称,值为json字符串,里面的信息可以自定义,目的是和请求头中的灰度参数匹配。...原创 2022-08-10 06:30:00 · 1764 阅读 · 0 评论 -
Springcloud gateway网关+认证服务+token方式,入口层认证统一微服务鉴权【设计实践】
分布式项目的单点登录分为认证服务(单点登录服务端)和业务服务(单点登录客户端)两个角色,当访问业务服务时,认证服务客户端SDK校验一下是否有登录token,如果没有登录token,需要携带当前请求链接重定向到认证服务,认证通过后由认证服务重定向业务服务链接,实现单点登录。gateway实现单点登录客户端功能,一般如果前后端项目是分离的,如果请求中没有携带登录token,直接返回需要认证,前后端没有分离的项目,可以做页面重定向操作。本文主要讨论gateway的实现,认证服务需要自行实现。......原创 2022-08-04 13:05:27 · 6624 阅读 · 0 评论 -
Spring+OpenCV+Linux(libopencv_java460.so、opencv-460.jar)人脸识别、人脸对比实现
opencv源码地址:https://github.com/opencv/opencv下载4.6.0版本:Releases · opencv/opencv · GitHub从git上找到对应版本号下载zip文件 上传到Linux中并解压接下来就是需要编译源码,这时候需要cmake命令,如果Linux自带的cmake版本低不好使或者是本机并没有装cmake那需要提前准备一下cmake执行编译源码过程中会用到java环境和ant,没有的话也需要提前准备接下来编译源码 出现下面的ant:原创 2022-06-09 16:55:28 · 2643 阅读 · 5 评论 -
ExecutorService 并发性能测试
// 公共线程池 private ExecutorService executorService = Executors.newFixedThreadPool(3);; // 测试不使用线程池,响应时间 public void test1() throws InterruptedException { // 每个请求耗时20s,300个请求20s左右全部返回 for (int ...原创 2018-11-14 15:44:38 · 3077 阅读 · 3 评论 -
java sftp demo
import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.UnsupportedEncodingException;import java.util.ArrayList;import java.util.List;import java.util.Prop原创 2020-10-09 14:02:41 · 736 阅读 · 0 评论 -
java ftp 工具类
java ftp工具类,参考不知道哪位大神写得工具类(现在找不到链接了),后来自己修改了部分代码,单例模式,封装了查询文件夹是否存在、创建文件夹、上传文件、下载文件、删除文件等方法,经试验可用。需要自己创建一个config的property文件。里面需要有文档中写出的几个属性。转载 2020-09-22 21:31:11 · 1098 阅读 · 0 评论 -
java 字符串与文件相互转换
/*** Prints some data to a file using a BufferedWriter*/private void writeToFile(File file, String txt) {BufferedWriter bufferedWriter = null;try {// Construct the BufferedWrit原创 2020-09-29 23:30:44 · 843 阅读 · 0 评论 -
ubantu nginx tomcat 负载均衡极简配置
环境:1、有台ubantu系统的机器2、安装nginx网址:http://blog.csdn.net/anshichuxuezhe/article/details/533080313、安装jdk步骤:1)从官网下一个jdk到你ubantu机器上2)配置 etc/profile 文件,在文件最底部加入以下四行export JAVA_HOME=/usr/softwa原创 2020-09-29 23:13:03 · 339 阅读 · 0 评论 -
apache ftpserver 配置FTP服务器
1、修改res/conf/ftpd-typical.xml中最下面的端口号,2121改为212、修改res/conf/users.prooperties文件最下面的用户设置ftpserver.user.admin.userpassword=21232F297A57A5A743894A0E4A801FC3ftpserver.user.admin.homedirectory=D:\原创 2020-09-29 23:20:55 · 1388 阅读 · 2 评论 -
JAVA文件转PFD文件,pdf文件转swf文件
import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.BufferedReader;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import jav原创 2020-10-09 16:25:19 · 233 阅读 · 0 评论 -
JAVA AES对称加密和解密 兼容windows/linux
package com.utils;import java.io.IOException;import java.io.UnsupportedEncodingException;import java.security.InvalidKeyException;import java.security.NoSuchAlgorithmException;import java.原创 2020-09-29 23:26:42 · 346 阅读 · 0 评论 -
java sqlite util 工具类,测试类
准备工作:下载sqlite-jdbc的jar包可以从maven 仓库下载:https://mvnrepository.com/artifact/org.xerial/sqlite-jdbc/3.19.3java操作sqlite数据库简单的工具类:import java.lang.reflect.Method;import java.sql.Connection;import java.sql.D原创 2020-09-29 23:31:18 · 1880 阅读 · 0 评论 -
java list 转 tree,加排序
参考文章,十分感谢http://blog.csdn.net/massivestars/article/details/53911620实体类import java.util.List;public class Resource implements Comparable<Resource> { /** * 主键ID */ private String id;原创 2020-08-08 22:29:51 · 591 阅读 · 0 评论 -
java web 通过request获取客户端IP
/** * 获取用户真实IP地址,不使用request.getRemoteAddr();的原因是有可能用户使用了代理软件方式避免真实IP地址, * * 可是,如果通过了多级反向代理的话,X-Forwarded-For的值并不止一个,而是一串IP值,究竟哪个才是真正的用户端的真实IP呢? * 答案是取X-Forwarded-For中第一个非unknown的有效IP字符原创 2020-09-29 23:24:09 · 812 阅读 · 0 评论