Zhu.Yang

朱阳的个人博客(公众号:think123)

0%

在使用K8S rolling update的时候,我同时使用JMeter不间断call API,就有少部分请求抛出了这个错误

1
2
3
4
5
6
7
{
"timestamp":"2019-12-02T07:33:47.120+0000",
"status":500,
"error":"Internal Server Error",
"message":"No message available",
"path":"/api/anon/article/TW1Tq/feed"
}
阅读全文 »

在kubernetes中部署前端项目(使用nginx作为服务器)的时候,遇到了一个报错,报错信息如下

1
2
2019/11/19 02:16:31 [emerg] 1#1: open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /etc/nginx/nginx.conf:14
nginx: [emerg] open() "/etc/nginx/mime.types" failed (2: No such file or directory) in /etc/nginx/nginx.conf:14

提示的意思是没有找到mine.types文件,也就是说容器内/etc/nginx下不存在这个文件。但是这个文件不是nginx提供的吗?

阅读全文 »

Kubernetes Ingress是为了代理不同后端Service而设置的负载均衡服务,我们自己的每个服务可以根据自己的需求定制自己的ingress rule.

实际的使用中我们要选择一个具体的ingress controller,部署在k8s集群中,然后Ingress Controller会根据我们定义的Ingress对象,提供对应的代理能力。

比如我在们开发一个cms系统,是前后端分离的,也是分开部署的,我希望它们有这样的规则

1
2
3
4
http://www.mycms.com/api   ---> 后端

http://www.mycms.com/ ---> 前端

阅读全文 »

何以高可用?

我们以前用Mysql的时候,经常是一台服务器走天下,如果只是用于学习,是没有问题的,但是在生产环境中,这样的风险是很大的,如果服务器因为网络原因或者崩溃了,就会导致数据库一段时间了不可用,这样的体验很不好。

那么应该怎么办呢?既然一台机器不行,我就多上几台机器总可以了吧,比如我上个两台,让他们互为主备,相互同步数据。想到这里我就只想说一个字,稳。

其实redis,mongodb,kafka等分布式应用基本上都是这样的思想

MongoDB也差不多是这样的思想。它通过复制集来解决这个问题,MongoDB复制集由一组Mongod进程组成,包含一个Primary节点和多个Secondary节点,Mongodb Driver(客户端)的所有数据都写入Primary,Secondary从Primary同步写入的数据,以保持复制集内所有成员存储相同的数据集,提供数据的高可用。

要想成为primary节点,你必须保证大多数节点都同意才行,大多数的节点就是副本中一半以上的成员。

阅读全文 »

开发web项目的时候,我们一般会有多个环境(dev,beta,rc,production),然后每次使用maven打包的时候都要指定profile

1
mven clean package -P beta

这样就可以将application-{profile}.properties打入jar包中。这也就意味着对于不同的环境我们要打不同的包,虽然他们只有一些配置信息不同而已。

那么有没有办法在不同的环境中使用相同的应用程序代码呢? 当然有,springboot提供了这样的机会,它允许我们通过很多种方式来决定配置文件是哪一个,当然啦本篇文章并不是介绍有哪些加载外部配置文件的方式。

阅读全文 »

范式化设计还是反范式

考虑下这样的场景,我们的订单数据是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
商品:
{
"_id": productId,
"name": name,
"price": price,
}

订单:
{
"_id": orderId,
"user": userId,
"items": [
productId1,
productId2,
productId3
]
}
阅读全文 »

在Java的Object类中有2个我们不怎么常用(框架中用的更多)的方法:wait()与notify()或notfiyAll(),这两个方法主要用于多线程间的协同处理,即控制线程之间的等待、通知、切换及唤醒。

首先了解下线程有哪几种状态,Java的Thread.State中定义了线程的6种状态,分别如下:

  1. NEW 未启动的,不会出现在dump文件中(可以通过jstack命令查看线程堆栈)
  2. RUNNABLE 正在JVM中执行的
  3. BLOCKED 被阻塞,等待获取监视器锁进入synchronized代码块或者在调用Object.wait之后重新进入synchronized代码块
  4. WAITING 无限期等待另一个线程执行特定动作后唤醒它,也就是调用Object.wait后会等待拥有同一个监视器锁的线程调用notify/notifyAll来进行唤醒
  5. TIMED_WAITING 有时限的等待另一个线程执行特定动作
  6. TERMINATED 已经完成了执行
阅读全文 »

1. 登录mongodb

以下命令可以用于登录mongodb数据库,但是需要保证用户你声明的数据库中存在对应的用户和密码

1
2
3
4
mongo --host <hostName> --port <port> -u <username> -p <password> --authenticationDatabase <dbname>

mongo --host 192.168.140.11 -u test -p 123456 --authenticationDatabase test_db

阅读全文 »

在Rest中,数据的呈现方式叫做资源(Resource)。拥有强大而一致的REST资源命名策略,是最好的设计决策。

一个资源可以是单个的也可以是一个集合。比如customers是一个集合,而customer是单个资源。我们可以定义customers这个集合的资源的URI是/customers,而单个customer资源的URI是/customers/{customerId}

资源也可以包含子集合的资源。比如,使用/customers/{customerId}/accounts 来表示某个customer下的account集合资源。同样的,对于account集合资源下的单个account我们可以定义成这样:/customers/{customerId}/accounts/{accountId}

REST API使用统一资源标识符(URI)来寻址资源。REST API设计者应该创建URI,将REST API的资源模型传达给潜在的客户端开发人员。当资源命名良好时,API直观且易于使用。如果做得不好,那么相同的API会感觉难以使用和理解。

阅读全文 »

commons-logging

commons-logging是apache提供的一个通用的日志接口,是为了避免和具体的日志方案直接耦合的一种实现。通过commons-logging用户可以自己选择log4j或者jdk自带的logging作为具体实现。

使用commons-logging的代码如下

1
2
3
4
5
6
7
8
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;


public class MyApplication {
private Log log = LogFactory.getLog(this.getClass());
}

阅读全文 »