Decorative image frame

微信开发unionid详解

unionid概况

微信开发过程中,经常会遇到,一个企业有多个小程序和公众号,在不同的小程序和公众号中,会有不同的openid。如果想要确定是同一个人,就需要用到unionid机制。

官方关于unionid的说明是这样的

公众号文档的描述

开发者可通过OpenID来获取用户基本信息。特别需要注意的是,如果开发者拥有多个移动应用、网站应用和公众帐号,可通过获取用户基本信息中的unionid来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号,用户的unionid是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,unionid是相同的。

小程序文档的描述

如果开发者拥有多个移动应用、网站应用、和公众帐号(包括小程序),可通过 UnionID 来区分用户的唯一性,因为只要是同一个微信开放平台帐号下的移动应用、网站应用和公众帐号(包括小程序),用户的 UnionID 是唯一的。换句话说,同一用户,对同一个微信开放平台下的不同应用,UnionID是相同的。

阅读全文...

聊聊kafka

为了便于理解kafka,先了解一下消息队列以及通讯模式。首先先了解两个名词

  • 数据生产者 产生数据的程序或服务
  • 数据消费者 处理数据的程序或服务

消息队列

简单的说就是个数据集散地,数据生产方把数据放到消息队列,然后消费方从队列中获得数据进行处理。
我们把消息队列比作超市,超市的供货商就相当于数据生产者,超市顾客就是数据消费者了。

使用消息队列可以让我们解决三大问题

解耦

假设没有超市,我们买菜直接从供货商手里买的话,我们如果要买不同的菜就需要联系好多的供货商。每个供货商又要给很多人供货,这是很麻烦的。超市的出现就解决了这个麻烦,所有的供货商只需要把才运送到超市这一个地方,顾客也只需要去超市这一个地方。就可以买到很多菜。
数据也是一样的,不同用户的数据都进入消息队列,然后服务,只需要从队里中获取数据进行处理就可以了。

异步

没有超市的情况下,我们跟供货商买东西,要两个人都有时间才可以,供货商没时间送货,或者消费者没时间在家接货都无法达成交易。但是有了超市,供货商不用等消费者在家,消费者也不用等供货商有时间送货。大家都是随时去超市购买即可。
数据也一样,数据生产方随时可以产生数据,而不用担心处理数据的服务是否空闲,服务也不用立即对请求进行应答。如果服务异常退出了,等再次启动后可以消息队列中获取数据进行处理。

削峰

没有超市的情况下,如果我们买了10种菜,供货商同时到了,很有可能你拿不了。方路边?万一丢了怎么办呢。有了超市就可以一次买一点多次购买多方便。
数据也一样,最容易出现这种情况的就是秒杀,大量的数据同一时间汇入,这时候很容易让服务崩掉。有了消息队列,咱们就可以轻松化解了,所有的数据先进入消息队列。后台服务从队列中获取数据处理。

通讯模式

点对点模式

前面介绍消息队列举的例子中,都是顾客主动去超市购买商品,这种方式,我们称之为点对点方式。这种模式消费者需要主动获取数据,好处是比较灵活。缺点也很明显,数据消费者或许消息不够及时。有可能你去买菜的时候,菜已经卖没了。

发布订阅模式

为了让消费者买到好的菜,超市推出了送货上面服务,供货商将菜送来的时候,超市会把菜打包好送到您手里。这样就不会买不到菜了。
这种主动送达的方式叫做发布订阅模式,数据发送到消息队列时。消息队列会主动把数据推送给数据消费者。

kafka

消息队列软件有很多种,kafka就是其中的一种。它是Linkedin公司开发,现在已经贡献给了apache基金会。kafka的创始人还在kafka的基础上,开发了好多周边软件,用于数据流转处理。如kafka connect等

kafka启动后默认使用9092端口,想这个端口发送信息,kafka就可以收到了。为了便于操作,kafka自带有Producer和Consumer的命令行工具用于简单测试

使用kafka必须先了解一下kafka的几个关键术语。

Producer

Producer即生产者,消息的产生者,它将消息发送到kafka中。安装包内有命令行工具,在java、python、php等语言也都有响应的sdk。使用Producer对象可以将消息发送到kafka服务。发送服务时会指定Topic。

Message

消息即数据,生产者发送一次数据,会产生一条消息。

Topic

消息主题,可以理解为消息分类。比如订单业务用order,订单服务就可以只接收order topic下的消息进行处理,这是非常方便的。避免了接收无用的消息。

Partition

Topic的分区,可以理解为文件夹,当数据特别多的时候如果把数据再次进行归类存储,可以有效的提高读写效率。比如有一万个文件,放在一个文件夹中查找就比较慢,如果按照哈希分散到a-z的26个文件夹中,那每个文件夹中存储的文件数量就是1/26。当我们发现要查找的文件第一个字母是a,就直接去a文件夹下。这样就提高了查找速度。

Broker

kafka实例,可以简单理解为kafka的消息容器。每个kafka集群内的broker都有一个不重复的编号。每台服务器上可以有一到多个kafka实例,为了便于理解,我们假设一台服务器上有一个kafka实例。这样你也可以理解为一个broker等于一台服务器。

Replication

topic的副本,他存放在kafka实例(broker)上。注意一下几点

  • 在kafka中默认副本的最大数量是10个
  • 副本的数量不能大于Broker的数量
  • follower和leader绝对是在不同的机器,同一机器对同一个分区也只可能存放一个副本(包括自己)。
    这样当主分区(Leader Partition)出现故障挂掉的时候,其中一份副本会转正为主分区,让业务可以正常使用

Consumer

消费者,即消息的消费方,是消息的出口。安装包内有命令行工具,在java、python、php等语言也都有响应的sdk。使用Consumer对象可以接收或获取kafka中的数据。

Consumer Group

我们可以将多个消费者组成一个消费者组,一个topic可以被多个消费组消费。但是消费组中多人同时消费一个topic时,每个分区只能有一个人消费。消费组中的消费者数量不要超过这个topic的Partition数量

场景举例

咱们有5台服务器,每台服务器一个kafka实例(broker)。
这时候我们设置副本数量要小于5(1是主分区,剩余4个borker可用作副本),我们设置为4
假设咱们设置分区(Partition)数是10

生产了个order的topic,我们有系统A和系统B都会用到订单数据。

系统A用 group-A消费者的数量不能超过5,如果超过了,会有一个消费这始终借不到数据。group-A中每个消费者都从各自的分区(Partition)中获取数据,他们每个人的数据是不重复的。
系统B如果使用group-A,那么它消费的一些数据,系统A会无法消费。因此如果想要两个系统都获得完整的数据。就需要系统B更换分组,比如使用group-B。这样两个系统互不干扰,都可以拿到消息队列中的全部数据。

python捕获异常堆栈信息

python的异常对称相比java或php简单了很多,对象中的信息很少,只有简单的错误输出。这在开发过程中是无法满足使用需求的。我们还需要更多的错误信息,比如错误发生在哪一行,具体的错误信息是什么。这就需要获取错误堆栈信息。下面简单记录一下常用的集中异常处理。

阅读全文...

springboot 配置

application.properties配置中文乱码问题

删除现有的文件,设置idea。setting->editor->file encodings 将Global Encoding Project Encoding Default encoding for properties files都设置成utf-8.并且勾选Transparent native-to-ascii conversion

多配置时spring.profiles.active=dev不生效

如果只有application.propertiesapplication-dev.properties这两个文件,是不行的,需要在增加一个文件比如application-prod.properties
只有配置文件多余2个才会生效

阅读全文...

springboot+nginx websocket配置

websocket用于聊天类场景再好不过了。平时链接websocket需要指定ip和端口,但如果需要用nginx做转发,将请求发送到websocket服务,这时候就需要升级协议了。

1
2
3
4
5
6
7
location /member-api/websocket {
proxy_pass http://localhost:7005;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}

就是这么简单,指定

1
2
3
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";

让协议升级就可以了

10.克隆远程仓库

小白的故事

本故事纯属虚构,如有雷同,^0^那可太巧了

吃过早饭,早早来到办公室。今天办公室和往常好像不一样。小白的工位旁边坐了个人。好面生啊。

“你好”,小白主动上前打招呼。
“你好,我是新来的。老大说让我跟你一组,以后我就跟你混了。”,新同事回答
“我叫小白,你叫什么啊?”,小白问道
“我叫小菜” 新同事回答

小白和小菜聊得很投缘。
上班时间到了,第一件事就是带领小菜熟悉项目。
“这是我u盘,把项目拷贝给我一份吧,我熟悉一下项目”,小菜说道,把u盘递给了小白

“不需要拷贝,现在都用git了,直接用git clone一份就可以了”,小白说着把u盘还给小菜

“这样啊,好高端”,小菜呵呵一笑

小白做到小菜的电脑前,打开git bash工具敲下命令

1
git clone https://github.com/shooke/learngit.git

一会电脑上出现了 learngit的文件夹。

“这样项目就下来了”小白说道,心里美滋滋的。

小菜一脸崇拜的看着小白。

“这是我的学习笔记,你也好好学习一下git吧。”小白发给小菜一个文档。

就这样两人开始了组团升级的道路

小结

  • git clone <版本库的网址> 可以克隆项目到本地,生成一个与项目同名的文件夹,版本库网址可以是https也可以是ssh类型的,这取决于服务器支持那种协议
  • git clone <版本库的网址> <本地目录名> 如果想保存的时候换一个名字,可以在版本库地址后面增加一个目录名如git clone https://github.com/shooke/learngit.git git_learn
  • git可以支持多种协议,比如下面的协议
    • $ git clone http[s]://example.com/path/to/repo.git/
    • $ git clone ssh://example.com/path/to/repo.git/
    • $ git clone git://example.com/path/to/repo.git/
    • $ git clone /opt/git/project.git
    • $ git clone file:///opt/git/project.git
    • $ git clone ftp[s]://example.com/path/to/repo.git/
    • $ git clone rsync://example.com/path/to/repo.git/

让nginx支持flv文件播放

起因

最近做小程序直播,为了简单测试需要用到live-player播放一个flv文件。服务器上用的nginx。把flv文件放到目录下访问,居然无法播放。查看了一下配置才发现,nginx不支持flv,需要响应的插件。

初次安装

如果是编译安装的非常简单,只需要在configure时添加--with-http_flv_module就可以了。

1
2
$ ./configure  --with-http_flv_module 
$ make && make install

专业就安装完成了。

对已安装的nginx,添加模块

如果已经安装过nginx,比如使用apt或yum安装过了。该怎么办呢?

阅读全文...