科技新闻

Velocity可配置消息模版封装

别等时光非礼了梦想. 提交于 2020-04-05 19:10:49
背景:项目中时常有一些需要发消息给通知的场景(不是指消息队列..)。 消息的形式 有许多比如邮件,比如钉钉。 消息的内容 由业务决定,而且其中可能还包含动态参数。 消息的接收人 可能是固定的人,也可能是动态不确定的人。 消息的发送时机 一般都是在一段业务逻辑处理完成之后。 现在在做的项目,发送消息使用了Velocity 模板引擎。 在资源目录下有一个模版文件夹,专门放置.vm的消息模版。 每当有新的需要发送消息的场景就新建一个模版然后开发业务代码把动态参数和模版整合。 一般业务逻辑很少变化,可是出于体验或者什么的考量产品会经常调整消息的内容,这个时候就要改模版内容,然后上线。 优化:为了避免由于改动模版内容引发频繁上线,将消息模版做成可配置的。 需要抽离出来的就是三个部分:消息内容,消息接收人,消息发送时机。 1.思路: 2.方案: 3.实现: 3.1.涉及到的包: <dependency> <groupId>org.apache.velocity</groupId> <artifactId>velocity</artifactId> <version>1.7</version> <exclusions> <exclusion> <groupId>commons-collections</groupId> <artifactId>commons-collections<

dubbo解析扣了2张图

£可爱£侵袭症+ 提交于 2020-04-05 19:02:37
netty是全双工的工作模式 dubbo异步转同步。 执行流程: consumer 发送消息给provider,provider接受到消息,provider返回给consumer消息,consumer接受到消息。 实现原理: consumer 发送消息给provider,这时候consumer保存全局唯一id,用future实现等待结果。 consumer接受到消息后加锁,锁里边future.get取得结果。 因为netty是全双工,我怎么知道那么多线程互相发消息谁发给谁的, 这个时候用consumer 发送消息给provider的时候保存的全局唯一id,如果拿到后比对无误,删除这个id,返回结果给consumer。 来源: oschina 链接: https://my.oschina.net/u/3730149/blog/3220742

beanNameAware,applicationContextAware,DisposeableBean在项目中的使用

旧巷老猫 提交于 2020-04-05 16:55:08
https://blog.csdn.net/weixin_30947631/article/details/86584359 前言 今天在项目中使用了研发部对spring框架的扩展的应用,比如,实现消息队列功能的springEven,springListener,以及对上下文的扩展,实现了spring的applicationContextAware,而本节就是根据项目的扩展,综合的分析bean的生命周期,在这里,介绍项目里是先定义了一个service的抽象层,实现了抽象接口baseService层,这个base层实现了自定义的封装了springFramwork的组件。这里有一篇非常详细的文章供读者参考。 Spring 中bean 的生命周期短暂吗? 在spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,也就是预设为每一个Bean的别名只能维持一个实例,而不是每次都产生一个新的对象使用Singleton模式产生单一实例,对单线程的程序说并不会有什么问题,但对于多线程的程序,就必须注意安全(Thread-safe)的议题,防止多个线程同时存取共享资源所引发的数据不同步问题。 然而在spring中 可以设定每次从BeanFactory或ApplicationContext指定别名并取得Bean时都产生一个新的实例:例如:

如何解决海外邮件发不出去

梦想与她 提交于 2020-04-05 16:52:04
中国力推“一带一路”战略,为首成立“亚投行”,越来越多的中国企业酝酿走出去。在企业间的商务往来中,电子邮件将扮演着重要角色,但是因为要跨洋 过海,各国互联网环境和法律法规有所区别,面临着种种变数,对方不一定能收到邮件。据报道,中国是全世界排名第二的垃圾邮件大国,因此许多国家一些服务商 将来自中国的邮件视为"垃圾",甚至封杀中国部分IP地址段。此外,各国之间网关存在兼容性问题,由于发往国外的邮件需经过多次跳转,造成的连接失败率较 高,各国防火墙对涉及敏感内容的网站、IP、关键词、网址进行了过滤,容易拒绝发件人。 为了保障海外通邮无阻,一些优秀的邮件系统厂商都实施了“邮件中继”;的技术,在海外架设邮件服务器,采用多节点链路机制,通过加密通道把国内邮件 发送到海外代理服务器上,再通过海外代理服务器投递到海外客户的邮箱。但是正如一门技艺,人人都会玩,能玩得登峰造极炉火纯青的却少见,“邮件中继”也一 样,各种品牌邮件系统中,数U-Mail最富特色最具优势,具体表现在: 1.带毒作业: U-Mail邮件中继就像一个免疫系统强的人,轻伤不下火线,即时客户端中毒滥发垃圾邮件,仍能坚持工作提供正常邮件服务。 2.超高的投递成功率: 依托全球服务器集群的智能投递,根据用户当前的网络环境自动判断、选择合适的服务器地址进行投递,智能化邮件路由系统。 3.账户/单发件人不限制发送量 :U

【Redis】入门

て烟熏妆下的殇ゞ 提交于 2020-04-05 16:44:14
Redis概述 Redis常用数据结构 Redis删除过期数据策略 Redis内存淘汰机制 Redis持久化机制 缓存问题及解决方案 Redis概述 Redis是一个开源的、基于内存的数据结构存储器,可以用作数据库、缓存和消息中间件 Redis最常用的功能 缓存 分布式锁 本文介绍使用环境 Windows 10 Redis 3.0.504 如何安装Redis就不做介绍,若不想安装Redis环境,可以使用 try redis 尝试Redis功能 CMD 启动 Redis,打开Reids目录,执行下面命令,出现下面图片代表启动成功 redis-server redis.windows.conf Redis常用数据结构 字符串(String) 用途 存放字符串/数字 常规key-value缓存应用 常规计数:订单数,商品数 常用命令 用途 set key value 设置指定 key 的值 get key 获取指定key的值 decr key 将指定的key的值递减1,若设置的值不是数字,报错 incr key 将指定的key的值递增1,若设置的值不是数字,报错 mget key1 [key2] 获取指定的key,返回多个值 哈希(Hash) 用途 hash 特别适合用于存储对象(用户信息,商品信息) 可以修改/读取对象某个值 常用命令 用途 hset key field value

Spring Boot 2.3 终于要来了!

纵然是瞬间 提交于 2020-04-05 15:07:11
2020/04/03日消息: https://spring.io/blog/2020/04/03/spring-boot-2-3-0-m4-available-now Spring团队正式发布了 Spring Boot 2.3 的第 4 个里程碑版本,现在可以从 Spring 的里程碑仓库获取了: https://repo.spring.io/milestone/ 这个版本主要关闭了 99 个 99 issues 以及 pull requests,详细可以看这个版本说明: https://github.com/spring-projects/spring-boot/releases/tag/v2.3.0.M4 主要可以包含以下 3 点: 1、支持 Kubernetes 容器探针(liveness and readiness probe) 在 Kubernates 中,容器探针代表了应用程序状态的各个方面,这个特性在这个版本中得到支持,计划在下个版本中还会增加对 Kubernates 主题的支持。 2、改进了对构建 OCI 映像的支持 当用 Maven/ Gradle 构建 OCI 映像时,现在开始支持 DOCKER_* 开始的环境变量定位 Docker Daemon 进程。 Docker Daemon 是 Docker 中的守护进程,Docker 客户端需要通过与 Docker

Rabbitmq群集部署

 ̄綄美尐妖づ 提交于 2020-04-05 00:36:25
一、部署Rabbitmq集群 Rabbitmq集群大概分为两种方式: 1、普通模式:默认的集群模式,消息的尸体只存在一个节点上; 2、镜像模式:把需要的队列做成镜像,存在于多个节点。 ha-mode: all:列队到所有节点; exatly:随机镜像到其他节点上; nodes:镜像到指定节点上。 集群节点模式: 1、内存节点:工作在内存上; 2、磁盘节点:工作在磁盘上; 例外:内存节点和磁盘节点共同存在,提高访问速度的同时增加数据持久化。 相比内存节点虽然不写入磁盘,但是它执行比磁盘节点要好,集群中,只需要一个磁盘来保存状态就足够了,如果集群中只有内存节点,那么节点一旦宕机,所有的状态、消息都会丢失,无法实现数据的持久化。 rpm包 (提取码:rv8g) 1、环境如下 2、安装rabbitmq服务 在192.168.171.134/135/140节点上进行如下操作,部署rabbitmq服务: [root@localhost ~]# mkdir rabbitmq [root@localhost ~]# cd rabbitmq/ [root@localhost rabbitmq]# ls erlang-18.1-1.el6.x86_64.rpm rabbitmq-server-3.6.6-1.el6.noarch.rpm socat-1.7.3.2-2.el7.x86_64.rpm

zookeeper(单机、伪集群、集群)部署

柔情痞子 提交于 2020-04-05 00:35:07
ZooKeeper是一个分布式的、开源的分布式应用程序协调服务,可以在分布 式环境中实现应用配置管理、统一命名服务、状态同步服务等功能。 ZooKeeper是一种为分布式应用所设计的高可用、高性能的开源协调服务,它提供了一项基本服务:分布式锁 服务。由于ZooKeeper开源的特性,在其分布式锁实现的基础上,又被摸索出了其它的功用,譬如:配置维 护、组服务、分布式消息队列等等。 ZooKeeper维护了一个类似文件系统的数据结构,其内部每个子目录都被 称作znode(目录节点),与文件系统一样,我们可以自由的增删改查znode。ZooKeeper集群适合搭建在奇数 台机器上。只要集群中半数以上主机处于存活,那么服务就是可用的。 ZooKeeper在配置文件中并没有指定 master和slave,但是,ZooKeeper在工作时,只有一个节点为leader,其余节点为follower,leader是通过内部 的选举机制临时产生的。 ZooKeeper特点 1、顺序一致性:以zxid来保证事务的顺序性。 2、原子性:以zab保证原子操作,要么成功,要么失败。 3、单一视图:客户获取到的数据始终是一致的。 4、可靠:以版本实现"写入校验",保证了数据写入的正确性。 ZooKeeper有三种安装方式:单机模式 & 伪集群模式 & 集群模式 单机模式: ZooKeeper以单实例的形式运

JDBC对Mysql utf8mb4字符集的处理

血红的双手。 提交于 2020-04-04 23:28:35
在开发微信开放平台, 接入微信公众号的数据时, 关于用户的nickname和文本消息是,大量出现emoji的文本信息, 超时了utf-8字符集的存储范围 在存储数据时, 出现部分特殊字符存储字符串失败. 服务端解决方案 查阅MySQL官方文档时,给出如下支持utf8转utf8mb4的官方处理办法 https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-conversion.html 上述的步骤只是针对server端的配置. 对于客户端需要额外特殊的处理 因为我目前的项目, 使用的是JAVA编写, 使用JDBC连接操作数据库, 如下针对的JDBC操作的解决方案 JDBC的URL之前的配置方式 String url = "jdbc:mysql://HOST:PORT/DATABASE?useUnicode=true&characterEncoding=UTF-8"; 在连接配置中,声明UTF-8的字符编码,在目前的存储需求上来讲,在存储emoji字符串时会报错. 就算服务端的数据库设置了utf8mb4字符集类型 客户端修改成如下配置 String url = "jdbc:mysql://HOST:PORT/DATABASE?useUnicode=true&characterEncoding=utf8mb4"; 客户端连接时报错

WebAPI从Server端push消息到Client

Deadly 提交于 2020-04-04 17:54:17
WebAPI从Server端push消息到Client 写本篇的起因,是重构一个现有的WinForms程序,将Server端的部分逻辑从raw socket通讯的方式,改为调用WebAPI。重构则是因为原先代码有严重的性能问题,而组里并没有能够写好socket通讯的同学。 WebAPI的编写相对就简单多了,但原先从Server端push消息到Client的功能就需要找到替代的解决方案。所以有了本篇对于SignalR的介绍。 “ASP.NET Core SignalR 是一个开源代码库,它简化了向应用添加实时 Web 功能的过程。 实时 Web 功能使服务器端代码能够即时将内容推送到客户端。”看不懂不能怪我,MSDN上的原话。简单可以理解为SignalR是一个基于WebSocket的库,能够帮助我们避免直接使用socket,而写出一些性能夸张的代码…… SignalR的基本push流程是这样的,首先Server端有一个Hub类,Hub类中会定义一个方法,该方法会在某个时机被触发,而在该方法内部,会有一个Clients.All.SendAsync之类的操作。然后通过该SendAsync方法,来将消息内容传递给事先定义好的Client端的方法。 public class TestCaseHub : Hub { public async Task SayHello() { await