介绍

harbor支持docker compose和helm两种方式进行安装,一般情况下如果是kubernetes运行环境推荐用helm进行安装,如果是纯docker环境建议用docker compose进行安装,本次安装使用helm进行安装,安装版本为v2.2.1

创建命名空间

harbor包含服务较多,建议单独创建命名空间进行安装,便于后续的管理

apiVersion: v1
kind: Namespace
metadata:
  name: harbor
  labels:
    name: harbor

另存为harbor-namespace.yaml文件,并执行kubectl apply -f harbor-namespace.yaml命令进行创建

创建共享目录

目录必须创建在共享存储的介质上面,比如NFS等

mkdir -p /u02/appdata/harbor/registry
mkdir -p /u02/appdata/harbor/chartmuseum
mkdir -p /u02/appdata/harbor/jobservice
mkdir -p /u02/appdata/harbor/database
mkdir -p /u02/appdata/harbor/redis
mkdir -p /u02/appdata/harbor/trivy
chmod 777 /u02/appdata/harbor/registry
chmod 777 /u02/appdata/harbor/chartmuseum
chmod 777 /u02/appdata/harbor/jobservice
chmod 777 /u02/appdata/harbor/database
chmod 777 /u02/appdata/harbor/redis
chmod 777 /u02/appdata/harbor/trivy

Read the rest of this entry

, ,

背景

某项目应用需迁移到k8s环境,其中有个应用配置了Ingress,但通过域名访问,始终返回503服务不可用,应用服务都是正常的

➜ curl -v http://mdm-sts-test.xxx.com
<center><h1>503 Service Temporarily Unavailable</h1></center>
<hr><center>nginx/1.19.2</center>

从错误日志可以看出503是nginx返回的,并不是后端服务返回(后端tomcat),也就是说请求可能根本没有到达后端服务

排查

将Ingress连接到其他应用的service,还是继续报错,将Ingress的域名换成其他域名,结果正常,所以从测试结果上看应该是域名出问题。因为该域名已经在dns中配置,所以怀疑是不是又解析回到dns造成死循环(虽然k8s不会犯这么低级的错误),把域名配置到了hosts文件也是一样的错误,而且有类似配置的应用也都是正常的,这个猜测被否定。

Read the rest of this entry

背景

某项目需要升级kubernetes集群,考虑到原k8s版本较低,并且在部署结构上不是很合理,因此决定重新搭建一套新的k8s集群,做应用迁移。迁移过程也是非常曲折,这个后面会专门写一篇文章记录,应用迁移后有部分应用在注册中心状态为DOWN

如果服务状态为DOWN调用该服务就报404错误,因为应用配置了健康检查,怀疑是健康检查没有通过,进入后台调用接口查看检查结果

$ curl http://localhost:8080/management/health
{"description":"Remote status from Eureka server","status":"DOWN"}

服务使用jhipster框架生成,在配置文件里面有以下配置

eureka:
    client:
        enabled: true
        healthcheck:
            enabled: true
        fetch-registry: true
        register-with-eureka: true
        instance-info-replication-interval-seconds: 10
        registry-fetch-interval-seconds: 10

eureka.client.healthcheck.enabled设置为false后,注册中心恢复正常,因此可以肯定是健康检查的问题。但是在后台没有任何错误,甚至将日志级别调整到最低也未发现错误信息,这个给排查带来很大的困难。

Read the rest of this entry

,

背景

在docker中,为了尽可能缩减镜像大小,常常不会包含一些常用的工具,类似ping,curl,tcpdump等,虽然精简了镜像,但如果我们需要在容器内部测试网络联通性时,没有这些工具就非常的头疼。其实容器内部和主机之间的网络环境是互相隔离的,处于独立的命名空间下,那如果能在主机上切换命名空间,就可以在主机上以容器的网络环境进行操作,就可以利用主机上的工具,能够实现这种需求的工具就是我们今天要介绍的nsenter

使用

nsenter [options] [program [arguments]]
options:
-t, --target pid:指定被进入命名空间的目标进程的pid
-m, --mount[=file]:进入mount命令空间。如果指定了file,则进入file的命令空间
-u, --uts[=file]:进入uts命令空间。如果指定了file,则进入file的命令空间
-i, --ipc[=file]:进入ipc命令空间。如果指定了file,则进入file的命令空间
-n, --net[=file]:进入net命令空间。如果指定了file,则进入file的命令空间
-p, --pid[=file]:进入pid命令空间。如果指定了file,则进入file的命令空间
-U, --user[=file]:进入user命令空间。如果指定了file,则进入file的命令空间
-G, --setgid gid:设置运行程序的gid
-S, --setuid uid:设置运行程序的uid
-r, --root[=directory]:设置根目录
-w, --wd[=directory]:设置工作目录
如果没有给出program,则默认执行$SHELL。

Read the rest of this entry

Rancher安装

执行以下命令安装最新版本rancher

docker run --privileged -d --restart=unless-stopped -p 8080:80 -p 4443:443 rancher/rancher

导入kubernetes集群

rancher docker运行后访问http://host:4443设置密码即可进入rancher,点击导入集群选择导入现有的kubernetes集群

Read the rest of this entry

,

Redis安装

Redis的安装网上文档很多,官方也有非常详细的安装文档,这里就不再赘述,如果是个人开发,建议使用Docker进行安装,只需以下一行命令即可完成完整
docker run -itd --name redis -p 6379:6379 redis

执行以下命令查看是否运行成功

➜ docker exec -it redis redis-cli 
127.0.0.1:6379> ping
PONG

Read the rest of this entry

FeignClient调用原理

要启用FeignClient首先必须在启动类上加上注解@EnableFeignClients,EnableFeignClients代码如下

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
@Import(FeignClientsRegistrar.class)
public @interface EnableFeignClients {
  ....

注意到注解@Import(FeignClientsRegistrar.class),FeignClientsRegistrar实现了ImportBeanDefinitionRegistrar,在启动时会执行registerBeanDefinitions动态注册

class FeignClientsRegistrar implements ImportBeanDefinitionRegistrar {
  @Override
	public void registerBeanDefinitions(AnnotationMetadata metadata,
			BeanDefinitionRegistry registry) {
		registerDefaultConfiguration(metadata, registry);
		registerFeignClients(metadata, registry);
	}
  ...
}
,

Apache Atlas介绍

Apache Atlas是托管于Apache旗下的一款元数据管理和治理的产品,Apache Atlas提供api和一系列插件可以方便将数据库元数据信息导入到atlas中进行分析,atlas也提供web界面对元数据进行管理,通过atlas,企业可以对数据库元数据建立资产目录,并对这些资产进行分类和治理,为数据分析,数据治理提供高质量的元数据信息。

什么是元数据

企业内部可能运行多种类型数据库,从大类上可以分,大数据平台,sql数据库,nosql数据库,图数据库等,从具体的数据库类型可能是mysql,oracle,mongodb等,不管是什么类型的数据库,终归都是一个目的,存储数据,对怎么管理数据每个数据库有每个数据库的方式,以oracle为例

  • schema是一组数据库对象的集合
  • table是存储数据的实体
  • column列表示数据库的每个属性
  • view视图表示虚拟表,表示一组查询的逻辑集合
  • materialview物化视图则是对视图的实体化
  • 同义词表示数据库对象的别名
  • …等等

Read the rest of this entry

背景

某项目接口采用plsql开发,接口返回用户密码,但要求密码不能是明文返回,因为程序内部需要用到明文密码,所以只能在plsql中对密码进行对称加密,在程序内部进行解密,程序采用java开发。

实现

dbms_crypto是oracle自带的加密包,包含多种加密解密方法,非dba用户需要授权才能进行使用
grant execute on dbms_crypto to xxx;

下面是一个通过DES算法加密的function

function encrypt_password(p_password in varchar2) return varchar2 is
   v_key           varchar2(32) := 'TucM2fYDaxnd1UeRL7HVvyshXvXaMKO9';
   v_encrypted_raw RAW(256);
 begin
   v_encrypted_raw := dbms_crypto.Encrypt(src => UTL_RAW.CAST_TO_RAW(p_password),
                                          typ => DBMS_CRYPTO.DES_CBC_PKCS5,
                                          iv=>UTL_RAW.CAST_TO_RAW('12345678'),
                                          key => UTL_RAW.CAST_TO_RAW(v_key));
   return utl_raw.cast_to_varchar2(utl_encode.base64_encode(v_encrypted_raw));
  end;

背景

某项目流程使用activiti开发,现需要开发一个流程预测的功能,流程预测,也称流程预跑,是指用户在发起流程或者执行审批动作时希望看到流程后续流转的节点,方便用户跟踪流程。Activiti本身不提供流程预测的功能,实际上流程在运行时每一个变量的变化,比如审批结果,表单数据等,都会影响流程的走向,而这些变化是无法进行预见的,所以流程预测的前提条件就是,我们需要假设一些变量的值,比较典型的就是审批结果,我们需要假设审批结果都是通过的,基于这个前提,我们才能完成一个可以提供参考价值的预测数据。

实现

如果要看懂本文,你必须对activiti开发有基本的了解,对一些基本的概念熟悉,建议先阅读之前发表的Activiti教程

流程模型

这边准备了一个简单的报销流程模型示例

Read the rest of this entry

,