新时代码农
未读项目重构整理
废话此篇是 12530 架构重构第二篇, 以 阿里巴巴开发手册 为基础, 结合自己工作经验, 作为 musicsearch-project重构方案的基础部分.以此为约束, 希望构建一个 稳定, 易于维护, 可扩展 的重构方案.
一个项目最怕多种编码风格, 实体名一会 entity, 一会 model, 让维护的人身心疲惫, 因此在一个项目中保持唯一一种编码习惯, 有利于代码维护 (比如通过命名,就知道作用以及所在的包名).
见名知意, 此乃命名的最高境界 (体会一下 取名 10 分钟, 编码 1 分钟 的境界 😂).
代码规范看起来比较枯燥, 看完一遍可能只有一点点印象, 因此我采用比较逗比的方式, 尽量让大家一遍就记住.代码规范比较偏向个人主义, 每个人的编码习惯都不一样, 所以希望多提出自己的建议, 一起改进 (没有最好的规范, 只有最合适的. 🙃)
Let’s go开篇话说盘古开天辟地之时… 亚当和夏娃诞生混沌之间, 他们从小青梅竹马, 一个会唱 200 首歌, 一个会跳 200 支舞, 后人称他们一个为 二百歌, 一个为二百舞 ….. (用心去体会 � ...
记录 Redis Sentinel 的搭建过程
现有架构的问题
master 挂掉之后, 需要手动切换, 运维复杂
Redis Sentinel 高可用
下面以 1 个主节点、2 个从节点、3 个 Sentinel 节点组成的 Redis Sentinel 为例子
故障转移处理逻辑:
主节点出现故障, 此时两个从节点与主节点时区连接, 主从复制失败;
每个 Sentinel 节点通过定期监控发现主节点出现故障;
多个 Sentinel 节点对主节点的故障达成一致, 选举出 sentinel-3 节点作为领导者负责故障转移;
原来的从节点 slave-1 称为新的主节点后, 更新应用方的主节点信息, 重新启动应用方;
客户端命令另一个从节点 slave-2 去复制性的主节点;
待原来的主节点恢复后, 让它去复制新的主节点;
故障转移后的结构图
Redis Sentinel 功能
监控: Sentinel 节点会定期检测 Redis 数据节点和其余 Sentinel 节点是否可达;
通知: Sentinel 节点会将故障转移的结果通知给应用方;
主节点故障转移: 实 ...
最近在使用 Spingboot 做项目的时候,在引入 shiro 后,启动项目一直报错
1Error creating bean with name 'debtServiceImpl': Bean with name 'debtServiceImpl' has been injected into other beans [repayBillServiceImpl,investServiceImpl,receiveBillServiceImpl] in its raw version as part of a circular reference, but has eventually been wrapped. This means that said other beans do not use the final version of the bean. This is often the result of over-eager type matching - consider using 'getBeanNamesOfType ...
SSH(Secure Shell)是什么?是一项创建在应用层和传输层基础上的安全协议, 为计算机上的 Shell(壳层)提供安全的传输和使用环境.也是专为远程登录会话和其他网络服务提供安全性的协议.它能够有效防止远程管理过程中的信息泄露问题.通过 SSH 可以对所有传输的数据进行加密, 也能够防止 DNS 欺骗和 IP 欺骗.
具体生成 SSH Key 方式请参考: Github ssh key 生成, 免密登录服务器方法.这里以 id_ecdsa(私钥) 和 id_ecdsa.pub(公钥) 为例.
本篇文章主要介绍 SSH 相关的使用技巧. 通过对 ~/.ssh/config 文件的配置你可以大大简化 SSH 相关的操作, 如:
12345Host example # 关键词 HostName example.com # 主机地址 User root # 用户名 # IdentityFile ~/.ssh/id_ecdsa # 认证文件 # Port ...
内存优化对比数据量
外呼名单 10 万白名单 100 万黑名单 500 万
JVM 参数
12345678-verbose:gc-XX:+HeapDumpOnOutOfMemoryError-server-Xms1g-Xmx1g-XX:PermSize=512m-XX:SurvivorRatio=2-XX:+UseParallelGC
优化之前对比耗时
1234567891011122018-05-31 15:29:49 [INFO]] [pool-1-thread-1] [parseRegulation] 白名单匹配个数 = 252018-05-31 15:29:50 [INFO]] [pool-1-thread-1] [parseRegulation] 黑名单匹配个数 = 189StopWatch '': running time (millis) = 906-----------------------------------------ms % Task name----------------------------------- ...
文/LNAmp(简书作者)原文链接: http://www.jianshu.com/p/80c7777d48ad
解决方案演化这个问题的技术点在于能够触发重试, 以及重试情况下逻辑有效执行.
解决方案一: try-catch-redo 简单重试模式包装正常上传逻辑基础上, 通过判断返回结果或监听异常决策是否重试, 同时为了解决立即重试的无效执行 (假设异常是有外部执行不稳定导致的),休眠一定延迟时间重新执行功能逻辑.
1234567891011121314151617public void commonRetry(Map<String, Object> dataMap) throws InterruptedException { Map<String, Object> paramMap = Maps.newHashMap(); paramMap.put("tableName", "creativeTable"); paramMap.put("ds", "2016 ...
fat jartomcat自定义打包部署 暴露配置文件和静态资源文件前言SpringBoot 默认有 2 种打包方式,一种是直接打成 jar 包,直接使用 java -jar 跑起来,另一种是打成 war 包,移除掉 web starter 里的容器依赖,然后丢到外部容器跑起来。
第一种方式的缺点是整个项目作为一个 jar,部署到生产环境中一旦有配置文件需要修改,则过程比较麻烦linux 下可以使用 vim jar 包,找到配置文件修改后再保存window 下需要使用 解压缩软件打开 jar 再找到配置文件,修改后替换更新
第二种方式的缺点是需要依赖外部容器,这无非多引入了一部分,很多时候我们很不情愿这么做
spring boot 项目启动时 指定配置有 2 种方式:一种是启动时修改配置参数,像 java -jar xxxx.jar –server.port=8081 这样;另外一种是 指定外部配置文件加载,像 java -jar xxxx.jar -Dspring.config.location=applixxx.yml 这样
目标我们希望打包成 tomcat ...
无依赖其他任何 jar123456789101112131415161718<build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-jar-plugin</artifactId> <version>2.4</version> <configuration> <archive> <manifest> <addClasspath>true</addClasspath> <classpathPrefix>lib/</class ...
在 IDEA 中操作 Git
GitLab 中有一个 git-branch-test 的项目
处于 master 分支
本地项目目录:
所在分支:
一般的工作流程:
master 作为主分支, 一般都是用来发布最终版本的分支
当实现一个新需求时, 需要创建一个分支, 在新创建的分支上进行开发
这是已经实现的功能, 并且已经发布到 gitlab 服务器上的分支 (master):
12345678910111213141516171819202122public class HelloWorld { public static void main(String[] args) { String s = JOptionPane.showInputDialog("请输入一个整数"); int a = Integer.parseInt(s); System.out.println(a); if (isOdd(a)) System.out.println("奇 ...
一个能在 IDEA 中方便管理图片的插件
审核已通过, 可直接在 plugin 中搜索 Markdown Image Kit 下载
Markdown Image Kit 是一款在 IDEA 中方便高效得管理 Markdown 文档图片的插件.
在 IntelliJ IDEA 中写作(主要是技术文档), 配图成了一个大问题, 我们需要借助其他 APP 来完成这一操作.
为了解决现状, 因此开发了此插件, 能方便得给技术文档配图, 一键上传图片并直接替换为 markdown image 标签, 当然还提供其他一些附属功能.
Features
一键上传当前文档(所有文档)所有引用图片后自动替换, 体验最简单高效的一波流操作;
支持多个图床, 还支持自定义图床, 没有你上传不了的图片;
一键替换所有标签, 批量处理就是这么简单;
粘贴图片, 复制就是 markdown image mark, 就是这么直接;
图片直接压缩, 减少流量, 提高加载速度, 处处为你着想;
可对一个 markdown image mark 单独处理, 灵活的不要不要的;
图床迁移计划, 免费流量用完了? 迁移到 ...
@api被 @api 标记后, 会解析成 api 文档
1@api {method} path [title]
Name
Description
method
Request method name: DELETE, GET, POST, PUT, … More info Wikipedia HTTP-Request_methods
path
Request Path.
titleoptional
A short title. (used for navigation and article header)
Example:
123/** * @api {get} /user/:id 获取用户详情 */
@apiDefine用来定义全局描述, 比如服务器内部错误描述, 权限描述等
1@apiDefine name [title] [description]
Name
Description
name
Unique name for the block / value. Same name wi ...
通过扩展 dubbo Filter, 拦截 RPC 请求的方式, 将在请求 API 时通过 SnowFlake 算法生成的全局唯一 traceId 存入到 RpcContext 中, 传递给下一个服务.
dubbo 服务调用日志
通过扩展 dubbo Filter, 拦截 RPC 请求的方式, 将在请求 API 时通过 SnowFlake 算法生成的全局唯一 traceId 存入到 RpcContext 中, 传递给下一个服务.
业务日志
通过 Load Time wearing技术自动埋点, 在进入方法时, 通过 MDC 获取 traceId
接入追踪系统
dubbo 追踪接入
123456<!-- xxx-service pom.xml 引入 日志追踪插件 --><dependency> <groupId>com.xxx</groupId> <artifactId>xxx-trace-client</artifactId> <version>0.2</version& ...
声网主要产品声网主要提供以下几类产品:
1. 实时互动基础能力:
语音通话: 一对一,多人实时语音通话。
视频通话: 一对一,多人实时视频通话。
直播: 提供低延时、强同步、大并发、高质量的互动直播能力。
实时消息: 超低延迟的全球信令与消息云服务。
即时通讯 IM: 单聊、群聊、聊天室、系统通知等 IM 功能。
媒体流加速: 具备 QoS 保障的全球端到端加速服务。
2. 实时互动扩展能力:
水晶球: 实时监控、告警通知、通话调查、数据洞察。
互动白板: H5 课件、动态 PPT、轨迹与音视频同步。
实时录制: 云端录制、本地服务端录制、页面录制。
凤鸣 AI 引擎: 新一代音频技术智能引擎,包括空间音频、AI 降噪、虚拟声卡等功能。
Status Page: 集中展示声网主要产品及服务的综合服务质量及可用性信息。
3. 低代码应用平台:
灵动课堂: 15 分钟上线自由品牌互动教学平台。
灵隼物联网云平台: 「耳聪目明」智能硬件音视频体验升级。
主要解决的问题声网产品主要解决以下问题:
低延迟、高可靠: 提供低延迟、高可靠的实时互动能力,满足各类实时互动应用的需求。
可 ...
声网集成相关
关键词:
App ID
开发者在我们官网注册后,可以创建多个项目,每一个项目对应的唯一标识就是 App ID。 如果有人非法获取了你的 App ID,他将可以在 Agora 提供的 SDK 中使用你的App ID,如果他知道你的频道名字,甚至有可能干扰你正常的通话。
所以建议仅在测试阶段或对安全性要求不高的场景里使用 App ID。
使用不同 App ID 的应用程序是不能互通的。如果已在通话中,用户必须调用 leaveChannel() 退出当前通话,才能进入下一个频道
Dynamic Key
当项目准备正式上线运营,建议开发者采用 Dynamic Key,这是一个更为安全的用户身份验证方案。针对不同的服务,Dynamic Key 有不同的名称:
Channel Key 用于加入频道;
Signaling Key 用于登录信令系统;
App Certificate
将您的 App Certificate 保存在服务器端,且对任何客户端均不可见。通常 App Certificate 在启用一小时后生效。
当项目的 App Certificate 被启用后,您必须使 ...