JavaWeb 项目与系统时间相差 8 个小时的问题

写在前面今天记录分享一个排查部署到 Linux 上的 web 项目执行的时间和本地系统时间相差 8 小时的问题环境:redhat 6.5考虑有规律的时间差可能和时区不同有关1 查看 Linux 系统时间和时区[root@localhost ~]# date2019年 03月 31日 星期日 16:00:32 CST[root@localhost ~]# date -RSun, 31 Mar 2019 16:00:44 +0800[root@localhost ~]# date +"%Z %z"CST +0800从这里可以确定,系统的时间和时区正常(北京时间,也就是东八区),时区详情请看这里2 查看 jvm 时间和时区2.1 先在 Linux 上某个目录执行 javac ,看 javac 命令是否可用,出现如下显示就可以(中间部分已省略)[root@localhost test]# javac用法: javac <options> <source files>其中, 可能的选项包括: -g 生成所有调试信息 -g:none 不生成任何调试信息 -g:{lines,vars,source} 只生成某些调试信息 …… -X 输出非标准选项的提要 -J<标记> 直接将 <标记> 传递给运行时系统 -Werror 出现警告时终止编译 @<文件名> 从文件读取选项和文件名2.2 编写测试程序import java.util.TimeZone;import java.util.Date;public class time { public static void main(String[] args) { System.out.println(“当前时间:"+new Date()); System.out.println(“当前默认时区:"+TimeZone.getDefault()); }}2.3 编译执行[root@localhost test]# javac time.java [root@localhost test]# ll总用量 8-rw-r–r– 1 root root 780 3月 31 16:02 time.class-rw-r–r– 1 root root 239 3月 31 16:00 time.java[root@localhost test]# java time当前时间:Sun Mar 31 08:02:34 CTM 2019当前默认时区:sun.util.calendar.ZoneInfo[id=“GTM”,offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]这里有导其他的包,如果以上命令不好使,则使用如下命令 (中间的点 . 是当前目录的意思)[root@localhost test]# javac -d . time.java[root@localhost test]# ll总用量 8-rw-r–r– 1 root root 780 3月 31 16:03 time.class-rw-r–r– 1 root root 239 3月 31 11:00 time.java[root@localhost test]# java -cp . time当前时间:Sun Mar 31 08:02:40 CST 2019当前默认时区:sun.util.calendar.ZoneInfo[id=“GTM”,offset=28800000,dstSavings=0,useDaylight=false,transitions=29,lastRule=null]这里显然 jvm 的时间比系统的时间早了 8 个小时,且是格林威治的时区,所以这里修改 jvm 的时区即可,这里说下,网上查询说 jvm 的时区默认读取的是硬件时区,目录为 /etc/sysconfig/clock (详情),查看如下[root@localhost test]# cat /etc/sysconfig/clock ZONE=“Asia/Shanghai"与网上对比,这里没有下面这两行UTC=falseARC=false这里看有人说是没有设置 UTC=false 导致的问题,查看资料说 UTC 指定 BIOS 中保存的时间是否是 GMT/UTC 时间,true 表示 BIOS 里面保存的时间是 UTC 时间,false 表示 BIOS 里面保存的时间是本地时间。加上后有的机器还是不好使,如果是在 tomcat 下运行的项目,那就重启 tomcat 即可。如果还不好使,还有修改 tomcat 配置文件的方法,欢迎参考之前的文章:Tomcat修改日期的时区现在问题基本已解决,以上有些内容是客户现场出现的,所以现在记录时也是凭笔记和记忆回忆的,如有偏差也请不吝赐教。文章参考:https://blog.csdn.net/liqingh… ...

March 31, 2019 · 1 min · jiezi

apache2.4安装之后不能加载curl拓展

在win7下安装好apache24和php7.*之后,一切运行如常,直到那次报错curl_init()方法不存在……在命令行打印php -m,curl拓展能够加载,but!phpinfo()里面没有!!查看Apache24启动日志,发现一行问题:PHP Startup: Unable to load dynamic library ‘D:/server/php7/ext/php_curl.dll网上查了n多博主日志,无非就是三个文件放到windows下啊,又是放到Apache24的bin下面啊,或者是在配置里面进行加载。我全部尝试了,结果还是不行。恩,锻炼自己耐性,挺好的~无果之后,静思两天,决定卸载apache,重新安装,在浏览器敲下回车键,框架打印phpinfo()的瞬间,仿佛从天而降一阵神光,不知道大家对薇恩苍穹之光那款皮肤有没有了解,反正就是那种感觉。恩,没错,加载成功了……nice!附上Apache24的下载链接:传送门再次编辑,无非就是吐槽,我第一次下载是用的这一个源,这个坑货。。。

March 29, 2019 · 1 min · jiezi

在Ubuntu18.04服务器安装Apache2.4/MariaDB10.3/PHP7.2

在这篇文章中,我们将分享在最新Ubuntu18.04系统镜像中安装LAMP常规的软件环境。其中软件包括Apache2.4/MariaDB10.3/PHP7.2,这里我们看到不安装MYSQL而是用MariaDB数据库代替,因为根据部分网友反馈和实际的应用发现MariaDB相比MYSQL部分性能还是优秀的。只不过我们对于MYSQL有先知优势而已。在Ubuntu18.04默认包中其实是已经集成PHP7.2的,这样我们直接可以从源中编译不需要单独安装,有网友可能要说目前最新PHP版本是7.3,为什么我们不去安装?一般我们会安装次版本,因为最新版本一来兼容问题,二来担心有BUG。第一、更新源至最新软件版本apt-get update -yapt-get upgrade -y无论我们拿到上面版本的镜像,肯定需要进行更新软件。因为有些商家是老版本的源,可能存在漏洞补丁没有更新。第二、安装Apache 2.4apt-get install apache2 -y安装完毕之后,我们可以通过apache2 -v命令检测当前版本。出于安全的考虑,以及我们后续安装网站,需要禁止默认根目录执行。mv /var/www/html/index.html /var/www/html/index.html.bak移除默认根目录欢迎页面。且出于安全的考虑,我们需要禁止 /var/www/html 目录给访问者。cp /etc/apache2/apache2.conf /etc/apache2/apache2.conf.baksed -i “s/Options Indexes FollowSymLinks/Options FollowSymLinks/” /etc/apache2/apache2.conf最后我们需要重启生效。systemctl start apache2.servicesystemctl enable apache2.service这样我们的Apache安装完毕。第三、安装MariaDB 10.3数据库apt-get install software-properties-common首先我们需要安装软件。apt-key adv –recv-keys –keyserver hkp://keyserver.ubuntu.com:80 0xF1656F24C74CD1D8add-apt-repository ‘deb [arch=amd64] http://mirror.zol.co.zw/mariadb/repo/10.3/ubuntu bionic main’导入库。apt update -yapt install -y mariadb-server mariadb-client更新和安装。完毕之后我们可以mysql -v检测版本。systemctl start mariadb.servicesystemctl enable mariadb.service在设置数据库之后我们还需要设置数据库安全。这个其实与MYSQL安装后设置相似。/usr/bin/mysql_secure_installation根据需要设置n或者ENTER回车设置。重置数据库密码等。第四、创建数据库用户mysql -u root -p用我们设置的密码登录,然后创建用户。根据我们的需要创建vultrla数据库,vultrlauer用户,以及vultrla.com密码。CREATE DATABASE vultrla;CREATE USER ‘vultrlauer’@’localhost’ IDENTIFIED BY ‘vultrla.com’;GRANT ALL PRIVILEGES ON vultrla.* TO ‘vultrlauer’@’localhost’ IDENTIFIED BY ‘vultrla.com’ WITH GRANT OPTION;FLUSH PRIVILEGES;EXIT;用户和密码根据我们实际需要设置。如果有需要我们可以通过查看文件数据库配置。cp /etc/mysql/my.cnf /etc/mysql/my.cnf.bakvi /etc/mysql/my.cnf启动生效。systemctl restart mariadb.service第五、安装PHP7.2apt-get install -y php libapache2-mod-php7.2 php7.2-cli php7.2-common php7.2-mbstring php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.2-zip这里我们直接丢上命令安装系统自带的有PHP7.2的源安装,以及对于数据库的扩展内容。这样,在安装完毕之后,我们可在Ubuntu 18.04中安装完毕LAMP,且软件都是比较新的。本文原创来自:https://www.vultrla.com/315.html ...

March 26, 2019 · 1 min · jiezi

Apache Maven 的介绍和安装

Maven 简介什么是 MavenApache Maven,是一个软件项目管理及自动构建工具,由Apache软件基金会所提供,一个开源项目,由 Java 开发,并且只是用来管理 Java 项目的。Maven 的好处节省空间: Maven 项目的体积相比传统项目小很多,因为 Maven 将 Jar 包和项目分开了, 通过依赖管理来管理Jar包。一键构建项目: Maven 可以完成的工作:编译、测试、运行、打包、部署。 Maven 自带 Tomcat 插件,能直接用 mvn tomcat:run 命令部署运行项目,同时将项目代码编译。提高大型项目的开发效率Maven 的安装配置下载地址Apache 官网:https://maven.apache.org/down…Apache 官方镜像地址:https://mirrors.tuna.tsinghua…安装配置解压配置环境变量: 在 Path 里添加 Maven 目录里的 bin 文件夹的完整路径。Maven 仓库三种仓库本地仓库 (自己维护)本地仓库的配置只需要修改settings.xml文件就可以远程仓库(私服) (公司维护)中央仓库 (Maven 团队维护)三种仓库的关系Maven 的目录结构Maven 的命令常用命令需要进到项目目录中执行clean 清理编译好的文件compile 只编译主目录的文件test 只编译并运行 test 的目录的文件package 打包并放到 target 文件夹中install 把项目发布到本地仓库命令的生命周期(命令的执行顺序)clean 生命周期cleandefault 生命周期 compile test package installsite 生命周期 site 生成站点的说明文档命令和生命周期的阶段的关系不同的生命周期的命令可以同时执行。例如:mvn clean package

March 18, 2019 · 1 min · jiezi

常用的Nginx/Apache引擎服务器配置HTTPS SSL证书示范

昨天我们看到百度发布"百度烽火算法升级",提到网站如果被劫持或者拦截可能会降低网站的权重和排名等问题。这使得我们网站需要使用HTTPS SSL证书来减少被拦截劫持的风险。其实在早些时候我们已经看到很多浏览器都强制要求网站使用SSL证书,如果不使用的会被提示不安全网站URL。这次机遇百度文章发布之后,可以看到大家应该还在犹豫的话会新增SSL证书实现HTTPS访问。目前,大部分网站都会采用的是NGINX、APACHE等WEB架构,所以我们只需要学习这两个架构技术就可以。这里我们需要注意的,SSL证书的安装分两种, 一种是我们服务器自带的一键安装免费SSL证书。比如let’s encrypt证书是免费的。对于个人网站或者小型网站是可以使用的,而且大部分浏览器也是支持的。但是作为商业网站,我们总不能去使用免费证书吧。所以如果是购买第三方的付费证书,我们需要做的就是配置到服务器中。在这篇文章中,笔者将会分享在常规的NGINX、APCHE中如何配置SSL证书。其实配置SSL证书不难的,只要我们认真看下过程就可以。如果我们个人网站可以使用免费证书,一般LAMP或者LNMP脚本都是自带免费证书的。具体可以参考:1、LNMP环境一键安装免费Let’s Encrypt SSL证书2、宝塔面板不同PHP版本、伪静态设置且一键免费安装Let’s Encrypt但是,如果我们是购买的付费证书则不可以这么自动化安装SSL,我们需要手工安装。第一、NGINX WEB引擎安装SSL证书在当前网站下服务器配置文件的.conf文件中添加。server {listen 443;server_name www.domain.com; #填写绑定证书的域名ssl on;ssl_certificate 1_www.domain.com_bundle.crt;ssl_certificate_key 2_www.domain.com.key;ssl_session_timeout 5m;ssl_protocols TLSv1 TLSv1.1 TLSv1.2; #按照这个协议配置ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;#按照这个套件配置ssl_prefer_server_ciphers on;location / {root html; #站点目录index index.html index.htm;}}安装完毕之后,我们需要命令检查是否生效。nginx -t检测没有报错重启NGINX。service nginx reload重启NGINX后生效。第二、Apache WEB引擎安装SSL我们需要先在Apache根目录下 conf/httpd.conf 文件,找到 #LoadModule ssl_module modules/mod_ssl.so 和 #Include conf/extra/httpd-ssl.conf,去掉前面的#号注释;编辑Apache根目录下 conf/extra/httpd-ssl.conf 文件。修改如下内容:<VirtualHost www.domain.com:443>DocumentRoot “/var/www/html"ServerName www.domain.comSSLEngine onSSLCertificateFile /usr/local/apache/conf/2_www.domain.com_cert.crtSSLCertificateKeyFile /usr/local/apache/conf/3_www.domain.com.keySSLCertificateChainFile /usr/local/apache/conf/1_root_bundle.crt</VirtualHost>配置完成后,重新启动 Apache 就可以使用HTTPS网址访问。相对来说好像NGINX比较简单一些。第三、实例参考安装SSL过程1、购买证书后合并证书我们在购买证书后会看到.crt和.ca-bundle文件,需要将这2个文件合并到一个文件.crt中。2、上传证书我们需要将上面的CRT文件和KEY文件上传到网站服务器目录中,这个具体放到哪里没事。因为我们可以在引用的时候调用对应自己的路径。3、引用CONF文件路径listen 443 ssl http2; ssl_certificate /usr/local/nginx/conf/ssl/网站域名.crt; ssl_certificate_key /usr/local/nginx/conf/ssl/网站域名.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; ssl_prefer_server_ciphers on; ssl_session_timeout 10m; ssl_session_cache builtin:1000 shared:SSL:10m; ssl_buffer_size 1400; add_header Strict-Transport-Security max-age=15768000; ssl_stapling on; ssl_stapling_verify on;这里我们将配置文件贴到conf文件中,然后检测Nginx,后没有问题就重启生效。4、收尾工作如果我们需要强制HTTP跳转至HTTPS,则需要在conf配置文件中设置301强制跳转。这样,我们才可以完成整个的SSL证书安装,是不是也不是很难?本文可以参考的文献:1、申请腾讯云免费DV SSL证书及Apache/Nginx/IIS/Tomcat证书安装2、手动配置安装SSL证书实现HTTPS加密网址 ...

March 15, 2019 · 1 min · jiezi

SpringBoot使用SOFA-Lookout监控

本文介绍SpringBoot使用蚂蚁金服SOFA-Lookout配合Prometheus进行监控。1.SOFA-Lookout介绍上一篇已经介绍使用Prometheus进行暴露SpringBoot的一些指标进行监控,传送门,这一篇介绍如何使用SOFA-Lookout配合Prometheus。SOFA-Lookout是蚂蚁金服开源的一款解决系统的度量和监控问题的轻量级中间件服务。它提供的服务包括:Metrics 的埋点、收集、加工、存储与查询等。正如介绍的,SOFA-Lookout提供了一些常用的监控指标,比如JVM线程,JVM类加载,JVM内存,JVM垃圾回收,机器文件系统信息和机器信息。在1.5.0版本之后默认也提供了一些Linux操作系统的信息。具体可以查看:https://www.sofastack.tech/sofa-lookout/docs/client-ext-metrics2.SpringBoot使用SOFA-Lookout2.1 配置依赖新建项目,在项目中加入SOFA依赖,完整pom如下所示。<?xml version=“1.0” encoding=“UTF-8”?><project xmlns=“http://maven.apache.org/POM/4.0.0" xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=“http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE</version> <relativePath/> <!– lookup parent from repository –> </parent> <groupId>com.dalaoyang</groupId> <artifactId>springboot2_sofa_lookout</artifactId> <version>0.0.1-SNAPSHOT</version> <name>springboot2_sofa_lookout</name> <description>springboot2_sofa_lookout</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>com.alipay.sofa.lookout</groupId> <artifactId>lookout-sofa-boot-starter</artifactId> <version>1.5.2</version> </dependency> <dependency> <groupId>com.alipay.sofa.lookout</groupId> <artifactId>lookout-reg-prometheus</artifactId> <version>1.5.2</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build></project>2.2 配置SOFA-Lookout端口这里需要配置一个SOFA-Lookout的端口,生产环境使用的话一定要查看这个端口是不是被占用了。配置如下,这里配置的端口是8081。spring.application.name=springboot2_sofa_lookoutcom.alipay.sofa.lookout.prometheus-exporter-server-port=8081其实到这里,SpringBoot项目已经配置完成了,当然还可以自定义一些指标,这里不做介绍。3.Prometheus配置Prometheus需要配置一下刚刚SOFA-Lookout的端口,如下: - job_name: ‘springboot2_sofa_lookout’ scrape_interval: 5s static_configs: - targets: [’localhost:8081’]4.Grafana这里也可以将Prometheus展示给Grafana,我也查询了很多,但是貌似目前Grafana还没有默认推荐的Dashboard,大家可以根据情况自行构建,当然,如果有好的也希望可以推荐一下。5.测试启动SpringBoot应用,控制台如下所示。看到红框部分就是启动成功了。接下来查看Prometheus界面,如下。这里Grafana在看一下Grafana界面,如图。6.源码源码地址:https://gitee.com/dalaoyang/springboot_learn/tree/master/springboot2_sofa_lookout本文作者:dalaoyang阅读原文本文为云栖社区原创内容,未经允许不得转载。

March 12, 2019 · 1 min · jiezi

React-router BrowerRouter 刷新404 Apache服务器解决办法

1.找到etc/apache2/sites-availables/000-defautl.conf配置文件2.添加以下配置 <VirtualHost :80> … <Directory “/var/www/html/"> Options Indexes FollowSymLinks AllowOverride all Require all granted </Directory></VirtualHost>3.重新apache服务器4 在项目文件根目录下,添加.htaccess文件,加入如下规则RewriteEngine On RewriteBase / RewriteCond %{REQUEST_FILENAME} !-f RewriteCond %{REQUEST_FILENAME} !-d RewriteCond %{REQUEST_FILENAME} !-l RewriteRule ^.$ / [L,QSA]5.参考链接

March 9, 2019 · 1 min · jiezi

flume 1.8.0 开发基础

本文由云+社区发表作者:皮皮熊概述Apache Flume是一个用于高效地从大量异构数据源收集、聚合、传输到一个集中式数据存储的分布式、高可靠、高可用的系统。Apache Flume是Apache基金会的顶级项目。现在有两个代码版本线可以获取:0.9.x和1.x。本文档对应的是1.x版本。数据流模型Event是流经flume agent的最小数据单元。一个Event(由Event接口实现)从source流向channel,再到sink。Event包含了一个payload(byte array)和可选的header(string attributes)。一个flume agent就是一个jvm下的进程:控制着Events从一个外部的源头到一个外部的目的地。Source消费着具有特殊格式的Events(这些Event传递到Source通过像Web server这样外在的数据源)。例如AvroSource可以被用于接收Avro的Events,从本客户端或者其他运行中的flume客户端。当一个Source接收到一个Event,它会把它插入到一个或者多个Channel里。Channel会被动地存储这些Event直到它们被一个Sink消费到。Flume中一种Channel是FileChannel,其使用文件系统来作为后端存储。Sink需要负责任地将一个Event从Channel中移除,并将其放入像hdfs一样的外部存储系统(例如HDFSEventSink),或者转发到传输中下一个节点的source中。Source和Sink在agent中异步地交互Channel中的Event。可靠性Event是存储在Flume agent的Channel里。Sink的责任就是传输Event到下一个agent或者最终的存储系统(像hdfs)。Sink只有当Event写入下一个agent的Channel 或者 存储到最终的系统时才会从channel里面删掉Event。这就是Flume如何在单跳消息传输中提供端到端的可靠性。Flume提供了一个事务性的方法来修复可靠传输中的Event。Source和Sink包含了Event的存储和重试(通过由channel提供的事务)。构建Flume获取源码通过git编译/测试 FlumeFlume使用maven来build。你可以通过标准的maven命令行来编译Flume。仅编译:mvn clean compile编译且运行单元测试:mvn clean test运行独立的测试:mvn clean test -Dtest=<Test1>,<Test2>,… -DfailIfNoTests=false打包:mvn clean install打包(忽略单元测试):mvn clean install -DskipTests注意:Flume build需要在path中有Google Protocol Buffers编译器。更新Protocol Buffer版本File channel依赖Protocol Buffer。当你想更新Protocol Buffer版本时,你需要如下更新使用到Protocol Buffer的data access类:本机安装你想要的PB版本更新pom.xml中PB的版本生成flume中新的PB data access类:cd flume-ng-channels/flume-file-channel; mvn -P compile-proto clean package -DskipTests在所有生成文件中加上Apache license(如果缺了的话)rebuild及测试Flume:cd ../..; mvn clean install开发自定义部分clientClient在Event产生时运转,并将他们传递到Flume的agent。Client通常运行在应用消费数据的进程空间中。Flume目前支持Avro, log4j, syslog, 以及 Http POST (with a JSON body)方式从外部数据源传输数据。同时ExecSource支持将本地进程的输出作为Flume的输入。可能已有的方案是不够的。本案例中你可以使用自定义的方法来向flume发送数据。这里有两种方法来实现。第一:写一个自定义的客户端来和flume已有的source交互,像AvroSource 或者 SyslogTcpSource。此时Client需要将数据转换成这些Source能理解的message。另外一个方案:写一个自定义的Flume Source,通过IPC或者RPC,直接地和已有的client应用通信(需要将client的数据转换成Flume的Event)。注意这些存储在flume agent channel中的事件,必须以Flume Event形式存在。Client SDK尽管Flume包含了一系列内置的,用于接收数据的方法(即Source),人们常常想直接地通过flume和自定义的程序进行通信。Flume SDK 就是这样一个lib,它可以通过RPC直接地连接到Flume,并且发送到Flume的数据流。RPC客户端接口一个RPC客户端接口的实现,包含了支持Flume的RPC方法。用户的程序可以简单地调用Flume SDK客户端的append(Event)或者appendBatch(List<Event>)接口来发送数据,而不用考虑消息交互的细节。用户可以通过使用诸如SimpleEvent类,或者使用EventBuilder的 静态helper方法withBody(),便捷地实现直接提供事件接口所需的事件ARG。Transaction(事务)接口Transaction接口是Flume可靠性的基础。所有主要组件(即source,sink和channel)必须使用Flume Transaction。Transaction在channel的实现中实现。每个source和sink连接到channel时必须要得到一个channnel的对象。Source使用channnelprocessor来管理transaction。sink明确地通过他们配置的channel来管理transaction。存储一个事件(把他们放入channnel中)或者抽取一个事件(从channnel中取出)在一个激活的transaction中完成。例如:Channel ch = new MemoryChannel();Transaction txn = ch.getTransaction();txn.begin();try { // This try clause includes whatever Channel operations you want to do Event eventToStage = EventBuilder.withBody(“Hello Flume!”, Charset.forName(“UTF-8”)); ch.put(eventToStage); // Event takenEvent = ch.take(); // … txn.commit();} catch (Throwable t) { txn.rollback(); // Log exception, handle individual exceptions as needed // re-throw all Errors if (t instanceof Error) { throw (Error)t; }} finally { txn.close();}在这里,我们从channel获取transaction。在begin()返回后,Transaction现在处于活动/打开状态,然后将Event放入Channel中。如果put成功,则提交并关闭Transaction。SinkSink的目的就是从Channel中提取事件并将其转发到传输中的下一个Flume Agent或将它们存储在外部存储库中。根据Flume属性文件中的配置,接收器只与一个通道关联。每个已配置的Sink都有一个SinkRunner实例,当Flume框架调用SinkRunner.start()时,会创建一个新线程来驱动Sink(使用SinkRunner.PollingRunner作为线程的Runnable),该线程管理Sink的生命周期。Sink需要实现start()和stop()方法作为LifecycleAware接口的一部分。Sink.start()方法应初始化Sink并将其置于可将事件转发到其下一个目标的状态。Sink.process()应该执行从Channel提取Event并转发它的核心处理过程。Sink.stop()方法应该进行必要的清理(例如释放资源)。Sink实现还需要实现Configurable接口来处理自己的配置设置。例如:public class MySink extends AbstractSink implements Configurable { private String myProp; @Override public void configure(Context context) { String myProp = context.getString(“myProp”, “defaultValue”); // Process the myProp value (e.g. validation) // Store myProp for later retrieval by process() method this.myProp = myProp; } @Override public void start() { // Initialize the connection to the external repository (e.g. HDFS) that // this Sink will forward Events to .. } @Override public void stop () { // Disconnect from the external respository and do any // additional cleanup (e.g. releasing resources or nulling-out // field values) .. } @Override public Status process() throws EventDeliveryException { Status status = null; // Start transaction Channel ch = getChannel(); Transaction txn = ch.getTransaction(); txn.begin(); try { // This try clause includes whatever Channel operations you want to do Event event = ch.take(); // Send the Event to the external repository. // storeSomeData(e); txn.commit(); status = Status.READY; } catch (Throwable t) { txn.rollback(); // Log exception, handle individual exceptions as needed status = Status.BACKOFF; // re-throw all Errors if (t instanceof Error) { throw (Error)t; } } return status; }}SourceSource的目的是从外部客户端接收数据并将其存储到已配置的Channels中。Source可以获取其自己的ChannelProcessor的实例来处理在Channel本地事务中提交的串行事件。在exception的情况下,需要Channels传播异常,则所有Channels将回滚其事务,但先前在其他Channel上处理的事件将保持提交。与SinkRunner.PollingRunner Runnable类似,有一个PollingRunner Runnable,它在Flume框架调用PollableSourceRunner.start()时创建的线程上执行。每个配置的PollableSource都与自己运行PollingRunner的线程相关联。该线程管理PollableSource的生命周期,例如启动和停止。PollableSource必须实现LifecycleAware接口中声明的start()和stop()方法。PollableSource的运行器调用Source的process()方法。 process()方法应检查新数据并将其作为Flume事件存储到Channel中。注意,实际上有两种类型的Source:已经提到过PollableSource,另一个是EventDrivenSource。与PollableSource不同,EventDrivenSource必须有自己的回调机制,捕获新数据并将其存储到Channel中。EventDrivenSources并不像PollableSources那样由它们自己的线程驱动。下面是一个自定义PollableSource的示例:public class MySource extends AbstractSource implements Configurable, PollableSource { private String myProp; @Override public void configure(Context context) { String myProp = context.getString(“myProp”, “defaultValue”); // Process the myProp value (e.g. validation, convert to another type, …) // Store myProp for later retrieval by process() method this.myProp = myProp; } @Override public void start() { // Initialize the connection to the external client } @Override public void stop () { // Disconnect from external client and do any additional cleanup // (e.g. releasing resources or nulling-out field values) .. } @Override public Status process() throws EventDeliveryException { Status status = null; try { // This try clause includes whatever Channel/Event operations you want to do // Receive new data Event e = getSomeData(); // Store the Event into this Source’s associated Channel(s) getChannelProcessor().processEvent(e); status = Status.READY; } catch (Throwable t) { // Log exception, handle individual exceptions as needed status = Status.BACKOFF; // re-throw all Errors if (t instanceof Error) { throw (Error)t; } } finally { txn.close(); } return status; }}参考自(Flume 1.8.0 Developer Guide)flume 1.8.0 文档完整翻译可见 https://blog.csdn.net/u013128262此文已由腾讯云+社区在各渠道发布获取更多新鲜技术干货,可以关注我们腾讯云技术社区-云加社区官方号及知乎机构号 ...

March 1, 2019 · 3 min · jiezi

Apache的基本使用

一. Apache简介Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的Web服务器端软件之一。二. Apache安装注:以下操作均在Centos7.x系统下完成。在Centos系统上,安装Apache服务非常简单,仅需执行下面这条命令。yum install httpd测试Apache服务是否安装成功,执行以下命令查看。ps -ef | grep httpd出现下图所示结果表示安装成功。此时可以打开浏览器,输入主机IP进行访问,如果出现以下情况,说明防火墙配置有问题。这时,有两种解决办法,推荐第一种。由于Apache服务器默认走的80端口,在此放行80端口。firewall-cmd –add-port=80/tcp关闭防火墙service firewalld stop此时,再输入主机ip进行访问,发现可以访问成功。至此,Apache安装成功。三. Apache虚拟主机配置如果想要配置虚拟主机,需要编辑/etc/httpd/conf/httpd.conf(Apache默认安装目录在/etc/httpd/),添加以下内容。# 任意主机可以通过80端口访问<VirtualHost :80> # 域名为www.panjingg.test ServerName www.panjingg.test # 网站内容存放根目录 DocumentRoot /data/www <Directory “/data/www”> # 允许符号链接 Options Indexes FollowSymLinks # 不允许覆盖 AllowOverride None # 要求授予所有 Require all granted <Directory></VirtualHost>修改完配置文件之后,需要对服务重启使配置生效,执行以下命令。service httpd restart由于系统没有/data/www目录,所以接下来需要创建/data/www目录,并在目录下创建一个index.html文件进行测试。<!– index.html –><h1>这是一个测试页面</h1>建议大家不要用root用户操作,最好创建一个网站管理员,并赋予其对/data/www目录的所有权限。完成以上步骤后,打开浏览器,输入www.panjingg.test进行访问,发现将会报错。原因是没有使用DNS进行解析,这里为了演示方便,修改了hosts文件,以windows系统为例,以管理员权限打开C:\Windows\System32\drivers\etc\hosts文件,在末尾添加如下内容:# 主机IP 域名193.192.168.0.121 www.panjingg.test 添加完成后保存,打开浏览器,输入www.panjingg.test,页面正常显示。注:如果此时网页仍然不能访问,尝试执行命令setenforce 0。补充: setenforce enforce 1强制模式 setenforce enforce 0宽松模式 但即使设置为宽松模式,服务器重启后又会变为强制模式,解决办法为:修改/etc/selinux/config文件,使SELINUX=disable。四. Apache伪静态配置伪静态是相对真实静态来讲的,通常我们为了增强搜索引擎的友好面,都将文章内容生成静态页面,但是有的朋友为了实时的显示一些信息。或者还想运用动态脚本解决一些问题。不能用静态的方式来展示网站内容。但是这就损失了对搜索引擎的友好面。怎么样在两者之间找个中间方法呢,这就产生了伪静态技术。就是展示出来的是以html一类的静态页面形式,但其实是用ASP一类的动态脚本来处理的。Apache伪静态实现步骤:编辑/etc/httpd/conf/httpd.conf文件,添加如下内容,加载伪静态模块使伪静态功能生效。LoadModule rewrite_module modules/mod_rewrite.so接着重启服务使配置生效。service httpd start编辑/etc/httpd/conf/httpd.conf文件,添加如下内容。实现结果是将所有.jsp定向到index.html。<VirtualHost :80> ServerName www.panjingg.test DocumentRoot /data/www <Directory “/data/www”> Options Indexes FollowSymLinks AllowOverride None Require all granted <IfModule mod_rewrite.c> RewriteEngine On RewriteRule ^(.).jsp$ index.html </IfModule> </Directory></VirtualHost>打开浏览器,进行测试。至此,伪静态配置成功。 ...

February 11, 2019 · 1 min · jiezi

后端相关技能(六):压力测试

预期学习目标压力测试的概念常见的压力测试工具实例相关文章后端相关技能(一):数据库后端相关技能(二):Vue框架后端相关技能(三):正则表达式后端相关技能(四):计算机网络后端相关技能(五):Node.js后端相关技能(六):压力测试

February 2, 2019 · 1 min · jiezi

终于等到你!阿里正式向 Apache Flink 贡献 Blink 源码

阿里妹导读:如同我们去年12月在 Flink Forward China 峰会所约,阿里巴巴内部 Flink 版本 Blink 将于 2019 年 1 月底正式开源。今天,我们终于等到了这一刻。阿里资深技术专家大沙,将为大家详细介绍本次开源的Blink主要功能和优化点,希望与业界同仁共同携手,推动Flink社区进一步发展。Blink简介Apache Flink是德国柏林工业大学的几个博士生和研究生从学校开始做起来的项目,早期叫做Stratosphere。2014年,StratoSphere项目中的核心成员从学校出来开发了Flink,同时将Flink计算的主流方向定位为流计算,并在同年将Flink捐赠Apache,后来快速孵化成为Apache的顶级项目。现在Flink是业界公认的最好的大数据流计算引擎。阿里巴巴在2015年开始尝试使用Flink。但是阿里的业务体量非常庞大,挑战也很多。彼时的Flink不管是规模还是稳定性尚未经历实践,成熟度有待商榷。为了把这么大的业务体量支持好,我们不得不在Flink之上做了一系列的改进,所以阿里巴巴维护了一个内部版本的Flink,它的名字叫做Blink。基于Blink的计算平台于2016年正式上线。截至目前,阿里绝大多数的技术部门都在使用Blink。Blink一直在阿里内部错综复杂的业务场景中锻炼成长着。对于内部用户反馈的各种性能、资源使用率、易用性等诸多方面的问题,Blink都做了针对性的改进。虽然现在Blink在阿里内部用的最多的场景主要还是在流计算,但是在批计算场景也有不少业务上线使用了。例如,在搜索和推荐的算法业务平台中,它使用Blink同时进行流计算和批处理。Blink被用来实现了流批一体化的样本生成和特征抽取这些流程,能够处理的特征数达到了数千亿,而且每秒钟处理数亿条消息。在这个场景的批处理中,我们单个作业处理的数据量已经超过400T,并且为了节省资源,我们的批处理作业是和流计算作业以及搜索的在线引擎运行在同样的机器上。所以大家可以看到流批一体化已经在阿里巴巴取得了极大的成功,我们希望这种成功和阿里巴巴内部的经验都能够带回给社区。Blink开源的背景其实从我们选择Flink的第一天开始我们就一直和社区紧密合作。过去的这几年我们也一直在把阿里对Flink 的改进推回社区。从2016年开始我们已经将流计算SQL的大部分功能,针对runtime的稳定性和性能优化做的若干重要设计都推回了社区。但是Blink本身发展迭代的速度非常快,而社区有自己的步伐,很多时候可能无法把我们的变更及时推回去。对于社区来说,一些大的功能和重构,需要达成共识后,才能被接受,这样才能更好地保证开源项目的质量,但是同时就会导致推入的速度变得相对较慢。经过这几年的开发迭代,我们这边和社区之间的差距已经变得比较大了。Blink 有一些很好的新功能,比如性能优越的批处理功能,在社区的版本是没有的。在过去这段时间里,我们不断听到有人在询问Blink的各种新功能。期望Blink尽快开源的呼声越来越大。我们一直在思考如何开源的问题,一种方案就是和以前一样,继续把各种功能和优化分解,逐个和社区讨论,慢慢地推回Flink。但这显然不是大家所期待的。另一个方案,就是先完整的尽可能的多的把代码开源,让社区的开发者能够尽快试用起来。第二个方案很快收到社区广大用户的支持。因此,从2018年年中开始我们就开始做开源的相关准备。经过半年的努力,我们终于把大部分Blink的功能梳理好,开源了出来。Blink开源的方式我们把代码贡献出来,是为了让大家能先尝试一些他们感兴趣的功能。Blink永远不会单独成为一个独立的开源项目来运作,他一定是Flink的一部分。开源后我们期望能找到办法以最快的方式将Blink merge到Flink中去。Blink开源只有一个目的,就是希望 Flink 做得更好。Apache Flink 是一个社区项目,Blink以什么样的形式进入 Flink 是最合适的,怎么贡献是社区最希望的方式,我们都要和社区一起讨论。在过去的一段时间内,我们在Flink社区征求了广泛的意见,大家一致认为将本次开源的Blink代码作为Flink的一个branch直接推回到Apache Flink项目中是最合适的方式。并且我们和社区也一起讨论规划出一套能够快速merge Blink到Flink master中的方案(具体细节可以查看Flink社区正在讨论的FLIP32)。我们期望这个merge能够在很短的时间内完成。这样我们之后的Machine Learning等其他新功能就可以直接推回到Flink master。相信用不了多久,Flink 和 Blink 就完全合二为一了。在那之后,阿里巴巴将直接使用Flink用于生产,并同时协助社区一起来维护Flink。本次开源的Blink的主要功能和优化点本次开源的Blink代码在Flink 1.5.1版本之上,加入了大量的新功能,以及在性能和稳定性上的各种优化。主要贡献包括,阿里巴巴在流计算上积累的一些新功能和性能的优化,一套完整的(能够跑通全部TPC-H/TPC-DS,能够读取Hive meta和data)高性能Batch SQL,以及一些以提升易用性为主的功能(包括支持更高效的interactive programming, 与zeppelin更紧密的结合, 以及体验和性能更佳的Flink web)。未来我们还将继续给Flink贡献在AI,IoT以及其他新领域的功能和优化。更多的关于这一版本Blink release的细节,请参考Blink代码根目录下的README.md文档。下面,我来分模块介绍下Blink主要的新的功能和优化点。Runtime为了更好的支持batch processing,以及解决阿里巴巴大规模生产场景中遇到的各种挑战,Blink对Runtime架构、效率、稳定性方面都做了大量改进。在架构方面,首先Blink引入了Pluggable ShuffleArchitecture,开发者可以根据不同的计算模型或者新硬件的需要实现不同的shuffle策略进行适配。此外Blink还引入新的调度架构,容许开发者根据计算模型自身的特点定制不同调度器。为了优化性能,Blink可以让算子更加灵活的chain在一起,避免了不必要的数据传输开销。在Pipeline Shuffle模式中,使用了ZeroCopy减少了网络层内存消耗。在BroadCast Shuffle模式中,Blink优化掉了大量的不必要的序列化和反序列化开销。此外,Blink提供了全新的JM FailOver机制,JM发生错误之后,新的JM会重新接管整个JOB而不是重启JOB,从而大大减少了JM FailOver对JOB的影响。最后,Blink也开发了对Kubernetes的支持。不同于Standalone模式在Kubernetes上的拉起方式,在基于Flink FLIP6的架构上基础之上,Blink根据job的资源需求动态的申请/释放Pod来运行TaskExecutor,实现了资源弹性,提升了资源的利用率。SQL/TableAPISQL/TableAPI架构上的重构和性能的优化是Blink本次开源版本的一个重大贡献。首先,我们对SQL engine的架构做了较大的调整。提出了全新的Query Processor(QP), 它包括了一个优化层(Query Optimizer)和一个算子层(Query Executor)。这样一来,流计算和批计算的在这两层大部分的设计工作就能做到尽可能的复用。另外,SQL和TableAPI的程序最终执行的时候将不会翻译到DataStream和DataSet这两个API上,而是直接构建到可运行的DAG上来,这样就使得物理执行算子的设计不完全依赖底层的API,有了更大的灵活度,同时执行代码也能够被灵活的codegen出来。唯一的一个影响就是这个版本的SQL和TableAPI不能和DataSet这个API进行互相转换,但仍然保留了和DataStream API互相转换的能力(将DataStream注册成表,或将Table转成DataStream后继续操作)。未来,我们计划把dataset的功能慢慢都在DataStream和TableAPI上面实现。到那时DataStream和SQL以及tableAPI一样,是一个可以同时描述bounded以及unbounded processing的API。除了架构上的重构,Blink还在具体实现上做了较多比较大的重构。首先,Blink引入了二进制的数据结构BinaryRow,极大的减少了数据存储上的开销以及数据在序列化和反序列化上计算的开销。其次,在算子的实现层面,Blink在更广范围内引入了CodeGen技术。由于预先知道算子需要处理的数据的类型,在QP层内部就可以直接生成更有针对性更高效的执行代码。Blink的算子会动态的申请和使用资源,能够更好的利用资源,提升效率,更加重要的是这些算子对资源有着比较好的控制,不会发生OutOfMemory 的问题。此外,针对流计算场景,Blink加入了miniBatch的执行模式,在aggregate、join等需要和state频繁交互且往往又能先做部分reduce的场景中,使用miniBatch能够极大的减少IO,从而成数量级的提升性能。除了上面提到的这些重要的重构和功能点,Blink还实现了完整的SQL DDL,带emit策略的流计算DML,若干重要的SQL功能,以及大量的性能优化策略。有了上面提到的诸多架构和实现上的重构。Blink的SQL/tableAPI在功能和性能方面都取得了脱胎换骨的变化。在批计算方面,首先Blink batch SQL能够完整的跑通TPC-H和TPC-DS,且性能上有着极大的提升。如上图所示,是这次开源的Blink版本和spark 2.3.1的TPC-DS的benchmark性能对比。柱状图的高度代表了运行的总时间,高度越低说明性能越好。可以看出,Blink在TPC-DS上和Spark相比有着非常明显的性能优势。而且这种性能优势随着数据量的增加而变得越来越大。在实际的场景这种优势已经超过 Spark的三倍。在流计算性能上我们也取得了类似的提升。我们线上的很多典型作业,它的性能是原来的3到5倍。在有数据倾斜的场景,以及若干比较有挑战的TPC-H query,流计算性能甚至得到了数十倍的提升。除了标准的Relational SQL API。TableAPI在功能上是SQL的超集,因此在SQL上所有新加的功能,我们在tableAPI也添加了相对应的API。除此之外,我们还在TableAPI上引入了一些新的功能。其中一个比较重要是cache功能。在批计算场景下,用户可以根据需要来cache计算的中间结果,从而避免不必要的重复计算。它极大的增强了interactive programming体验。我们后续会在tableAPI上添加更多有用的功能。其实很多新功能已经在社区展开讨论并被社区接受,例如我们在tableAPI增加了对一整行操作的算子map/flatMap/aggregate/flatAggregate(Flink FLIP29)等等。Hive的兼容性我们这次开源的版本实现了在元数据(meta data)和数据层将Flink和Hive对接和打通。国内外很多公司都还在用 Hive 在做自己的批处理。对于这些用户,现在使用这次Blink开源的版本,就可以直接用Flink SQL去查询Hive的数据,真正能够做到在Hive引擎和Flink引擎之间的自由切换。为了打通元数据,我们重构了Flink catalog的实现,并且增加了两种catalog,一个是基于内存存储的FlinkInMemoryCatalog,另外一个是能够桥接Hive metaStore的HiveCatalog。有了这个HiveCatalog,Flink作业就能读取Hive的metaData。为了打通数据,我们实现了HiveTableSource,使得Flink job可以直接读取Hive中普通表和分区表的数据。因此,通过这个版本,用户可以使用Flink SQL读取已有的Hive meta和data,做数据处理。未来我们将在Flink上继续加大对Hive兼容性的支持,包括支持Hive特有的query,data type,和Hive UDF等等。Zeppelin for Flink为了提供更好的可视化和交互式体验,我们做了大量的工作让Zeppelin能够更好的支持Flink。这些改动有些是在Flink上的,有些是在Zeppelin上的。在这些改动全部推回Flink和Zeppelin社区之前,大家可以使用这个Zeppelin image(具体细节请参考Blink代码里的docs/quickstart/zeppelin_quickstart.md)来测试和使用这些功能。这个用于测试的Zeppelin版本,首先很好的融合和集成了Flink的多种运行模式以及运维界面。使用文本SQL和tableAPI可以自如的查询Flink的static table和dynamic table。此外,针对Flink的流计算的特点,这一版Zeppelin也很好的支持了savepoint,用户可以在界面上暂停作业,然后再从savepoint恢复继续运行作业。在数据展示方面,除了传统的数据分析界面,我们也添加了流计算的翻牌器和时间序列展示等等功能。为了方便用户试用,我们在这一版zeppelin中提供3个built-in的Flink tutorial的例子: 一个是做StreamingETL的例子, 另外两个分别是做Flink Batch,Flink Stream的基础样例。Flink Web我们对Flink Web的易用性与性能等多个方面做了大量的改进,从资源使用、作业调优、日志查询等维度新增了大量功能,使得用户可以更方便的对Flink作业进行运维。在资源使用方面,新增了Cluster、TaskManager与Job三个级别的资源信息,使得资源的申请与使用情况一目了然。作业的拓扑关系及数据流向可以追溯至 Operator 级别,Vertex 增加了InQueue,OutQueue等多项指标,可以方便的追踪数据的反压、过滤及倾斜情况。TaskManager 和 JobManager 的日志功能得到大幅度加强,从Job、Vertex、SubTask 等多个维度都可以关联至对应日志,提供多日志文件访问入口,以及分页展示查询和日志高亮功能。另外,我们使用了较新的Angular 7.0 对Flink web进行了全面重构,页面运行性能有了一倍以上的提升。在大数据量情况下也不会发生页面卡死或者卡顿情况。同时对页面的交互逻辑进行了整体优化,绝大部分关联信息在单个页面就可以完成查询和比对工作,减少了大量不必要的跳转。未来的规划Blink迈出了全面开源的第一步,接下来我们会和社区合作,尽可能以最快的方式将Blink的功能和性能上的优化merge回Flink。本次的开源版本一方面贡献了Blink多年在流计算的积累,另一方面又重磅推出了在批处理上的成果。接下来,我们会持续给Flink社区贡献其他方面的功能。我们期望每过几个月就能看到技术上有一个比较大的亮点贡献到社区。下一个亮点应该是对机器学习的支持。要把机器学习支持好,有一系列的工作要做,包括引擎的功能,性能,和易用性。这里面大部分的工作我们已经开发完成,并且很多功能都已经在阿里巴巴内部服务上线了。除了技术上创新以及新功能之外,Flink的易用性和外围生态也非常重要。我们已经启动了若干这方面的项目,包括Python以及Go等多语言支持,Flink集群管理,Notebook,以及机器学习平台等等。这些项目有些会成为Flink自身的一部分贡献回社区,有些不是。但它们都基于Flink,是Flink生态的一个很好的补充。独立于Flink之外的那些项目,我们都也在认真的考虑开源出来。总之,Blink在开源的第一天起,就已经完全all-in的融入了Flink社区,我们希望所有的开发者看到我们的诚意和决心。未来,无论是功能还是生态,我们都会在Flink社区加大投入,我们也将投入力量做 Flink 社区的运营,让 Flink 真正在中国、乃至全世界大规模地使用起来。我们衷心的希望更多的人加入,一起把Apache Flink开源社区做得更好!本文作者:大沙阅读原文本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。 ...

January 28, 2019 · 1 min · jiezi

如何全面的提升百度搜索排名?

之前有整理过 《身为前端开发工程师,你需要了解的搜索引擎优化SEO》出门左拐但是,作用很有限!感觉很像是你很饥饿,但是锅里只有几粒米!一顿操作猛如虎,在看战绩0-5;那就拜托技术上的思维固化整体性的思考这个问题!一、知名站点百度是怎么确定一个网站是不是知名站点呢?1.经过官方认证的企业站点!2.站点的收录数量3.站点的外部链接(百度的web超链分析法)4.站点的访问量二、合作企业这一类俗称人民币玩家!这里还包括(贴吧、百家号、知道、图片、文库等等)三、站点内页面更新时间!这一点其实可操作的东西还是蛮多的!1.保证站点经常更新2.新闻类 具有时效性的文章排名会很靠前四、网站内容1、文字内容比重最好大于html格式的比重!2、网页文件大小最后在 5kb~10kb之间3、网站的设计以简单为主。文字内容的比重应大于HTML格式的比重4、争取添加10个以上的活跃网站的外部链接5、增加网站客户粘性!比如浏览用户停留在站点某个页面的时间(越长越好)6、其他看这篇文章五、新方向(指的是百度有意推广的方向)随着多家自媒体平台的蓬勃发展,百度这位大哥大似乎感到了空前绝后的危机!还出现了这样的文章《百度搜索已死》 当然不乏客观性,但是,本人认为标题博关注的可能性更大!百度已经很难收到这篇文章,前段时间很火!有兴趣的小伙伴可以自行寻找而应对危机的方式就是疯狂的推送百家号!1.增加站点与自家百家号的关联强度!2.百度对长时间原创的网站提供了排名加强!六、域名和空间域名:1.域名的权重:域名分为三类顶级域名:类别顶级域名、地理顶级域名、新顶级域名2.域名的长短:域名的长短对优化并无影响,只是短域名更容易记忆3.中文域名在搜索引擎排名上有优势,不过IE6浏览器不支持中文域名,所以综合角度,选择英文域名还是首选4.域名的拼写方式:为了符合中国用户输入习惯,拼音域名还是网站的首选5.域名的存在时间:一般来说,域名时间越长,对优化越有帮助6.域名是否被K:一般来说不建议选用被K的域名,对seo不利空间:1.空间位置2.空间速度3.空间稳定性4.支持在线人数5.是否支持404错误页6.虚拟机还是服务器这短时间看了好多!也质询或一些专业人士!整理的还不过完整!希望有大佬补充评论!

January 25, 2019 · 1 min · jiezi

PHPStudy下如何为 Apache 安装 SSL证书

HTTPS证书申请一、安装SSL证书的环境Apache安装目录:E:phpStudyPHPTutorialApache以上为windows下测试SSL证书安装的目录,具体目录请根据自己的实际环境!二、获取SSL证书成功在沃通申请SSL证书后,会得到一个压缩包文件,解压后得到四个文件:for Apache、for IIS、for Ngnix、 for Other Server,Apache 上需要用到 for Apache解压出来的证书文件以及自主生成的私钥.key文件。key 文件,需要找到生成 CSR 一起生成出的两个文件,如下图。三、安装SSL证书1.进入apache安装目录E:phpStudyPHPTutorialApache(请根据实际安装目录)下的conf文件夹,找到httpd.conf文件,找到LoadModule ssl_module modules/mod_ssl.so,去掉前面的#注释符,若默认已去掉,则忽略此步骤。2.进入apache安装目录E:phpStudyPHPTutorialApache(请根据实际安装目录)下的conf文件夹,找到vhosts.conf文件,找到SSL证书绑定域名对应的HTTP配置,并在下方增加: Listen 443<VirtualHost *:443>ServerName 证书绑定域名DocumentRoot “域名对应网站根目录”SSLEngine onSSLCertificateFile“E:phpStudyPHPTutorialApacheconfssldomain.crt”SSLCertificateKeyFile“E:phpStudyPHPTutorialApacheconfssldomain.key”SSLCertificateChainFile“E:phpStudyPHPTutorialApacheconfsslroot_bundle.crt”(E:phpStudyPHPTutorialApacheconfssl为测试时证书存放目录,配置时请按照实际环境的路径)ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_ciphers ECDH:AESGCM:HIGH:!RC4:!DH:!MD5:!aNULL:!eNULL;ssl_prefer_server_ciphers on;<Directory “域名对应网站根目录”> Options -Indexes -FollowSymLinks +ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted </Directory></VirtualHost>如有其它参数比如log文件的配置,请参考HTTP的配置,予以添加。保存好刚编辑的.conf文件。3.检测配置是否正常在服务器上打开dos命令行(cmd),通过cd命令进入apache的bin目录,如E:phpStudyPHPTutorialApachebin,输入httpd -t命令,查看配置是否正常,具体如下图:若提示OK则表示配置正确,可以通过Phpstudy面板重启!若提示错误,请根据相关错误修改配置文件,直到显示OK,然后通过Phpstudy面板重启。4.测试HTTPS访问打开浏览器,输入https://yourdomain.com(证书绑定的实际域名),如浏览器地址栏显示加密小锁,则表示证书配置成功。若显示无法连接,请确保防火墙或安全组等策略有放行443端口(SSL配置端口)。四、证书备份请保存好下载的证书压缩包以及自主生成的.key文件!沃通技术支持原创文章,转载请注明来源

January 22, 2019 · 1 min · jiezi

Apache Module加载问题解决方案

Apache配置SSL证书部署指南 错误一:Apache报错httpd: Syntax error on line 99 of / wwwrver apache/conf/httpd.conf: Syntax error on line 11 of / wwwrver /apache/conf.d/ssl.conf: Cannot load / wwwrver /apache/modules/mod_ssl.so into server: / wwwrver /apache/modules/mod_ssl这是因为apache没有安装模块mod_ssl.so可以运行命令:yum install mod_ssl然后再执行mod_ssl.so错误二:Apache配置ssl证书,正常配置代码后,重启报了一个错误,看报错语句表明,是加载mod错误问题。httpd: Syntax error on line 59 of /wwwrver/apache/conftpd.conf: module authn_file_module is built-in and can’t be loaded解决方法1:最开始的检查方式是到httpd.conf下,找mol的语句是否正常开启,若被注释掉,需要手动去掉#号,再重新启动apache。若没有被#注释,开启状态还是报这个错误问题,就需要下一步去查找apache已加载的mod。通常执行的命令是bin目录下:apachectl -l 可查看apache本身编译的自带模块(如下图),这些自带模块是apache已经加载的,需要手动注释掉httpd.conf里的检测出来的模块。把已加载的模块注释完后,重启apache,这样apache一般就会起来。除非还有其他的模块之外的问题。在apache的bin目录下,执行httpd –t命令也能查看到没有正常配置的错误问题。解决方法2:编译Apache时(./configure)没有加上—enable-mods-shared=all造成的,重新编译Apache加上–—enable-mods-shared=all参数即可。Module内其他优化配置部分:如果需要提供基于文本文件的认证,加载此模块,否则注释掉LoadModule authn_file_module modules/mod_authn_file.so如果需要在未正确配置认证模块的情况下简单拒绝一切认证信息,加载此模块,否则注释掉LoadModule authn_default_module modules/mod_authn_default.so此模块为mod_cache提供基于磁盘的缓存管理,推荐加载LoadModule disk_cache_module modules/mod_disk_cache.so如果需要在未正确配置授权支持模块的情况下简单拒绝一切授权请求,加载此模块,否则注释掉LoadModule authz_default_module modules/mod_authz_default.so此模块为mod_cache提供基于内存的缓存管理,推荐加载LoadModule mem_cache_module modules/mod_mem_cache.so如果需要服务器在将输出内容发送到客户端以前进行压缩以节约带宽,加载此模块(推荐),否则注释掉LoadModule deflate_module modules/mod_deflate.so此模块为mod_cache提供基于内存的缓存管理,推荐加载LoadModule mem_cache_module modules/mod_mem_cache.so沃通技术支持原创文章,转载请注明来源

January 22, 2019 · 1 min · jiezi

关于Web资源文件权限的简单设置

整改一些业务系统时,加了WEB资源文件权限,比如上传doc,可能随机命名,但总可能被猜到,猜到就能访问到。首先,禁止Url文件名直接访问以Apache为例,在禁止访问文件目录(file_path)下新建 .htaccess# 单个文件<Files ~ “.jpg$"># 多个文件(写着就不让访问了)<Files ~ “.(jpg|png|pdf|rar|zip|doc|docx|xls|xlsx|ppt|pptx)$"> Order allow,deny Deny from all</Files>如果是IIS .net,可以在“MIME类型”设置可访问的资源文件后缀名这样一来,下面两种方式都无法打开:1、http://localhost/images/qwert.jpg2、<img src=“images/qwert.jpg” />第二步,输出文件假设数据表是这样设计的file_idfile_urlfile_user_idqwert_oooqwert.jpguser112345_ooo12345.jpguser2fileread.php 读取文件<?php$file_id = $_GET[“file_id”]; // 得到网址中的图片id// 根据$pic_id,查找到图片的真实路径,比如 images/qwert.jpg;这里可以进一步做权限验证,比如是否属于用户user1$file_url = “images/qwert.jpg”; if (file_exists($file_url)) { ob_start(); header(‘Content-Description: File Transfer’); header(‘Content-Type: application/octet-stream’); header(‘Content-Disposition: attachment; filename=’.basename($file_url)); header(‘Content-Transfer-Encoding: binary’); header(‘Expires: 0’); header(‘Cache-Control: must-revalidate, post-check=0, pre-check=0’); header(‘Pragma: public’); header(‘Content-Length: ’ . filesize($file_url)); ob_clean(); flush(); readfile($file_url); exit;}备注:1.Content-Disposition:参数作用inline用默认浏览器打开非图片文件(Edge等浏览器有效,而Chrome一律选择下载)attachment下载2.上述代码,ob_start()和ob_clean()需要一起使用,或者都不要,否则无法输出任何文件,即使查看Header信息是正确的官方文档:输出缓冲必须已被 ob_start() 以 PHP_OUTPUT_HANDLER_CLEANABLE 标记启动。否则 ob_clean() 不会有效果。fileread.html 输出文件<!doctype html><head> <meta charset=“UTF-8”> <title></title></head><body> <img src=“fileread.php?file_id=qwert_ooo”/></body></html>访问方式1、http://localhost/fileread.html2、http://localhost/fileread.php?file_id=qwert

January 22, 2019 · 1 min · jiezi

springboot+多线程简单实现

搭建springboot环境创建ThreadConfig/** * 线程 * * @author zhoumin * @create 2018-09-18 13:58 /@Configuration@EnableAsyncpublic class ThreadConfig implements AsyncConfigurer{ @Override public Executor getAsyncExecutor() { ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(8); executor.setMaxPoolSize(1000); executor.setQueueCapacity(500); executor.setKeepAliveSeconds(30000); executor.initialize(); return executor; } @Override public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() { return null; }}创建service和接口void test(int i);service实现类@Override@Asyncpublic void test(int i) { System.out.println(“线程” + Thread.currentThread().getName() + " 执行异步任务:" + i);}测试:@RunWith(SpringRunner.class)@SpringBootTestpublic class BaseTest {}/* * @author zhoumin * @create 2018-09-18 14:12 */public class ThreadTest extends BaseTest{ @Autowired private DeviceStatisticsTaskService deviceStatisticsTaskService; @org.junit.Test public void threadTest() { for (int i = 0; i < 5000; i++) { deviceStatisticsTaskService.test(i); } }} ...

January 17, 2019 · 1 min · jiezi

网站常见安全问题记录(持续更新)

说明初衷:本文档用于记录所遇到的网站安全问题,并分类汇总,方便后期遇到类似问题,能够快速找到解决方案,提高效率,让程序员有更多的时间去把妹,LOL…记录规范:标题必须清晰明了,方便用户快速查找,拒绝标题党;问题放到正确的分类中;记录问题的时候先阐述问题,再列出解决方法,尽量做到有图有真相;如果有对应的资料,可以附上链接;记录问题提交人,方便追踪ApacheCookie缺少HttpOnly、Secure标识漏洞提示描述httponly是微软对cookie做的扩展,这个主要是解决用户的cookie可能被盗用的问题。大家都知道,当我们去邮箱或者论坛登陆后,服务器会写一些cookie到我们的浏览器,当下次再访问其他页面时,由于浏览器回自动传递cookie,这样就实现了一次登陆就可以看到所有需要登陆后才能看到的内容。也就是说,实质上,所有的登陆状态这些都是建立在cookie上的!假设我们登陆后的cookie被人获得,那就会有暴露个人信息的危险!当然,想想,其他人怎么可以获得客户的cookie?那必然是有不怀好意的人的程序在浏览器里运行!如果是现在满天飞的流氓软件,那没有办法,httponly也不是用来解决这种情况的,它是用来解决浏览器里javascript访问cookie的问题。试想,一个flash程序在你的浏览器里运行,就可以获得你的cookie的!修复方案一、修改php配置文件php.ini注意:YNCMS勿改此项,其程序内部提供支持,按照第二种方案修改即可session.cookie_secure = 1session.cookie_httponly = 1二、修改网站cookie配置文件,以YNCMS为例,修改/Application/Home/Conf/config.php,添加配置参数’COOKIE_SECURE’ => true, // cookie 启用安全传输’COOKIE_HTTPONLY’ => true, // httponly设置参考资料: http://www.jb51.net/article/1...cgi-bin目录问题暴力解决办法:注释掉对应信息apache icons目录问题我们如果使用了apache服务器,当我访问http://xxx.xxx.xxx/icons/时会自动显示这个目录下的所以文件列表,这行造成网站目录信息的泄露对我们的网站安全造成威胁,在 关闭apache自动目录列表功能的三种方法 这篇文章中的三种方法都不能禁止自动目录列表,你如果使用网站安全监测,会提醒你发现目录启用了自动目录列表功能,所以我们必须禁止它,经过测试,按如下步骤可以禁止:打开目录apache/conf/extra/下的文件httpd-autoindex.conf(位置可能有差异)找到Alias /icons/ “/xampp/apache/icons/” <Directory “/xampp/apache/icons”> Options Indexes MultiViews AllowOverride None Require all granted</Directory>去掉Indexes改成<Directory “/xampp/apache/icons”> Options MultiViews AllowOverride None Require all granted</Directory>重启apache服务器!暴力解决办法就是注释掉或者直接删除icons目录启用了OPTIONS方法在网站根目录目录下创建.htaccess文件,内容如下,如果您已有其他规则,请添加到第一条规则RewriteEngine OnRewriteCond %{REQUEST_METHOD} ^(OPTIONS)RewriteRule .* - [F]使用Apache的重写规则来禁用Options方法和Trace方法在Apache配置文件httpd-conf中【vhosts-conf】添加以下代码:单独禁用Trace方法:RewriteEngine OnRewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK)RewriteRule .* - [F]单独禁用Options方法:RewriteEngine OnRewriteCond %{REQUEST_METHOD} ^(OPTIONS)RewriteRule .* - [F]同时禁用Trace方法和Options方法RewriteEngine OnRewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)RewriteRule .* - [F]<VirtualHost :80> DocumentRoot “D:\wwwroot” ServerName www.abc.com ServerAlias abc.com <Directory “D:\wwwroot”> Options FollowSymLinks ExecCGI AllowOverride All Order allow,deny Allow from all Require all granted RewriteEngine on RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS) RewriteRule . - [F] </Directory></VirtualHost>启用了TRACE Method同启用了OPTIONS方法处理方法相同RewriteCond %{REQUEST_METHOD} ^(TRACE|TRACK|OPTIONS)或者在httpd.conf中添加配置:TraceEnable offX-Frame-Options头未设置在httpd.conf里面增加Header always append X-Frame-Options SAMEORIGIN关闭目录浏览权限描述<Directory “/var/www/html”> Options Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>options中Indexes表示当网页不存在的时候允许索引显示目录中的文件解决将要设置的目录对应配置参数下的Indexes删除或者改为-Indexes(低版本可能会报错)<Directory “/var/www/html”> Options FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>或者<Directory “/var/www/html”> Options -Indexes FollowSymLinks AllowOverride None Order allow,deny Allow from all </Directory>缺少"x-content-type-options"头在httpd.conf里面增加Header always set X-Content-Type-Options nosniff其他允许Flash文件与任何域HTML页面通信描述解决方法将参数AllowScriptAccess设置为never&#65279导致页面空行描述:页面的编码如果是UTF-8 + BOM,会在body开头处加入一个可见的控制符,导致页面头部会出现一个空白。这种编码方式一般会在windows操作系统中出现,比如记事本编辑器,在保存一个以UTF-8编码的文件时,会在文件开始的地方插入三个不可见的字符(0xEF 0xBB 0xBF,即BOM)。它是一串隐藏的字符,用于让记事本等编辑器识别这个文件是否以UTF-8编码。对于一般的文件,这样并不会产生什么麻烦。但对于html来说,BOM是个大麻烦。因为浏览器在解析html页面时,并不会忽略BOM,所以在解析html文件时,会把BOM作为该文件开头正文的一部分,这串字符也将会被直接执行(在页面中并不显示)出来。由此造成即使页面的 top或者padding 设置为0,也无法让整个网页紧贴浏览器顶部,因为在html一开头有这3个隐藏字符!解决办法:保存文件为utf-8建议不要用记事本打开开发文件 ...

January 10, 2019 · 1 min · jiezi

PHP 的 $_SERVER详解

导语$_SERVER 是PHP预定义的超全局变量。所谓“超全局变量”,即在脚本全部作用域中都可以使用,$_SERVER保存关于报头、路径和脚本位置的信息。工作中经常忘记,在此整理记录下,加深印象。测试是在Windows下进行的,环境为Apache/2.4.23 (Win32)+PHP/5.6.27-nts,访问域名为http://www.example.com/index….,文件目录在E:/WWW/example/。主要内容详解$_SERVER[“SCRIPT_NAME”] => “/index.php”,当前脚本路径$_SERVER[“REQUEST_URI”] => “/index.php?id=1”,访问的页面URI,包含查询字符串$_SERVER[“QUERY_STRING”] => “id=1”,查询字符串,不存在为" “$_SERVER[“REQUEST_METHOD”] => “GET”,请求方法,如"POST”、“PUT"等$_SERVER[“SERVER_PROTOCOL”] => “HTTP/1.1”,通信协议的名称和版本$_SERVER[“GATEWAY_INTERFACE”] => “CGI/1.1”,服务器使用的CGI 规范的版本$_SERVER[“REMOTE_PORT”] => “60599”,用户连接服务器使用的端口$_SERVER[“SCRIPT_FILENAME”] => “E:/WWW/example/index.php”,当前脚本的绝对路径$_SERVER[“DOCUMENT_ROOT”] => “E:/WWW/example/",当前脚本文档根目录的绝对路径$_SERVER[“REMOTE_ADDR”] => “127.0.0.1”,用户的IP地址$_SERVER[“SERVER_PORT”] => “80”,服务器使用的端口$_SERVER[“SERVER_ADDR”] => “127.0.0.1”,服务器的IP地址$_SERVER[“SERVER_NAME”] => “www.example.com”,服务器的主机名,注:如果脚本运行于虚拟主机中,该名称是由那个虚拟主机所设置的值决定。在 Apache 2 里,必须设置 UseCanonicalName = On 和 ServerName。 否则该值会由客户端提供,就有可能被伪造。 上下文有安全性要求的环境里,不应该依赖此值。$_SERVER[“SERVER_SOFTWARE”] => “Apache/2.4.23 (Win32) OpenSSL/1.0.2j mod_fcgid/2.3.9”,响应头中Server的内容$_SERVER[“SERVER_SIGNATURE”] => “",包含了服务器版本和虚拟主机名的字符串$_SERVER[“HTTP_HOST”] => “www.example.com”,请求头中Host项的内容$_SERVER[“HTTP_CONNECTION”] => “keep-alive”,请求头中Connection项的内容$_SERVER[“HTTP_PRAGMA”] => “no-cache”,请求头中Pragma项的内容$_SERVER[“HTTP_CACHE_CONTROL”] => “no-cache”,请求头中Cache-Control项的内容$_SERVER[“HTTP_UPGRADE_INSECURE_REQUESTS”] => “1”,请求头中Upgrade-Insecure-Requests项的内容$_SERVER[“HTTP_USER_AGENT”] => “Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36”,请求头中User-Agent项的内容$_SERVER[“HTTP_ACCEPT”] => “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,/;q=0.8”,请求头中Accept项的内容$_SERVER[“HTTP_ACCEPT_ENCODING”] => “gzip, deflate”,请求头中Accept-Encoding项的内容$_SERVER[“HTTP_ACCEPT_LANGUAGE”] => “zh-CN,zh;q=0.8”,请求头中Accept-Language项的内容$_SERVER[“PHP_SELF”] => “/index.php”,当前执行脚本的文件名$_SERVER[“REQUEST_TIME_FLOAT”] => 1510112348.8084,请求开始的时间戳,微秒级别精准度$_SERVER[“REQUEST_TIME”] => 1510112348,请求开始的时间戳实例以上是测试中的 $_SERVER 的主要内容,根据不同的环境配置,会有些变化。在实际工作中,$_SERVER有很多作用,这里只举两个简单实例,获取当前请求URL以及简单防盗链<?php// $_SERVER[‘HTTPS’]当前是否为HTTPS协议if (!empty($_SERVER[‘HTTPS’]) && strtolower($_SERVER[‘HTTPS’]) !== ‘off’) { $url = ‘https://’;} else { $url = ‘http://’;}if ($_SERVER[‘SERVER_PORT’] == 80) { $url .= $_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’];} else { $url .= $_SERVER[‘HTTP_HOST’].$_SERVER[‘REQUEST_URI’].$_SERVER[‘SERVER_PORT’];}<?php// $_SERVER[‘HTTP_REFERER’],前一页面的urlif (!empty($_SERVER[‘HTTP_REFERER’])) { if (!strpos($_SERVER[‘HTTP_REFERER’], ‘www.example.com’)) { header(‘Location: http://www.example.com’); }}参考资料:PHP手册、HTTP消息头 ...

January 9, 2019 · 1 min · jiezi

安装PhpStorm和Wampserver64详细步骤

一、安装PhpStorm-2017.2.4值得注意的是idea要基于JDK1.8,若本地没有1.8的环境会在此步骤多出勾选框,Download and install JRE x86 JetBrains(会自动下载安装)安装成功后,直接关闭窗口,如下图:点开桌面的图标激活时选择License server 填入http://idea.imsxm.com 点击Active即可。二、安装wampserver_x64_3.0.6双击打开Wampserver64,右下角图标会有由红变橙再变绿就成功了。如果跳出错误:首先需要去下载:缺MSVCR110.dll下载这个:Visual C++ Redistributable for Visual Studio 2012 Update 4 缺MSVCR120.dll下载这个:Visual C++ Redistributable Packages for Visual Studio 2013安装即可解决问题。如果右下角Wampserver64图标点击没有反应,打开任务管理器强制关掉,并重新打开即可。调整中文:如果不是绿色是橙色(红色我没遇到过百度吧…)需要做以下步骤:右键点击图标,测试80端口是不是被占用了然后右键右下角的Wampserver64图标刷新,如果最后还是没有变绿,就再次测试端口80,想办法把所有端口80的服务关闭,如果太多了需要关闭,可以选择更改端口80。然后右小角的Wampserver64的图标就变绿色了左键点击右下角图标到此安装PhpStorm和Wampserver64安装完成。

January 8, 2019 · 1 min · jiezi

Apache 工作的三种模式:Prefork、Worker、Event

Apache 的三种工作模式(Prefork、Worker、Event)Web服务器Apache目前一共有三种稳定的MPM(Multi-Processing Module,多进程处理模块)模式。它们分别是prefork,worker、event,它们同时也代表这Apache的演变和发展。本文原文转自米扑博客:Apache 工作的三种模式:Prefork、Worker、Event如何查看我们的Apache的工作模式呢?可以使用httpd -V 命令查看,如我安装的Apache 2.4版本。# httpd -VServer version: Apache/2.4.34 (Unix)Server built: Aug 2 2018 19:44:29Server’s Module Magic Number: 20120211:79Server loaded: APR 1.6.3, APR-UTIL 1.6.1Compiled using: APR 1.6.3, APR-UTIL 1.6.1Architecture: 64-bitServer MPM: event threaded: yes (fixed thread count) forked: yes (variable process count)或者,更直接的命令 httpd -l 或 apachectl -V | grep -i mpm# httpd -lCompiled in modules: core.c mod_so.c http_core.c event.c# apachectl -V | grep -i mpmServer MPM: event这里使用的是event模式,在apache的早期版本2.0默认prefork,2.2版本是worker,2.4版本是event,详见米扑博客:Apache 服务器负载低访问慢的原因分析和优化方案在configure配置编译参数的时候,可以使用–with-mpm=prefork|worker|event 来指定编译为那一种MPM,当然也可以用编译为三种都支持:–enable-mpms-shared=all,这样在编译的时候会在modules目录下自动编译出三个MPM文件的so,然后通过修改httpd.conf配置文件更改MPM1、Prefork MPM Prefork MPM实现了一个非线程的、预派生的web服务器。它在Apache启动之初,就先预派生一些子进程,然后等待连接;可以减少频繁创建和销毁进程的开销,每个子进程只有一个线程,在一个时间点内,只能处理一个请求。这是一个成熟稳定,可以兼容新老模块,也不需要担心线程安全问题,但是一个进程相对占用资源,消耗大量内存,不擅长处理高并发的场景。图片描述如何配置在Apache的配置文件httpd.conf的配置方式:<IfModule mpm_prefork_module> StartServers 5 MinSpareServers 5 MaxSpareServers 10 MaxRequestWorkers 250 MaxConnectionsPerChild 1000 </IfModule> StartServers 服务器启动时建立的子进程数量,prefork默认是5,MinSpareServers 空闲子进程的最小数量,默认5;如果当前空闲子进程数少于MinSpareServers ,那么Apache将以最大每秒一个的速度产生新的子进程。此参数不要设的太大。MaxSpareServers 空闲子进程的最大数量,默认10;如果当前有超过MaxSpareServers数量的空闲子进程,那么父进程会杀死多余的子进程。次参数也不需要设置太大,如果你将其设置比MinSpareServers 小,Apache会自动将其修改为MinSpareServers +1的数量。MaxRequestWorkers 限定服务器同一时间内客户端最大接入的请求数量,默认是256;任何超过了MaxRequestWorkers限制的请求都要进入等待队列,一旦一个个连接被释放,队列中的请求才将得到服务,如果要增大这个数值,必须先增大ServerLimit。在Apache2.3.1版本之前这参数MaxRequestWorkers被称为MaxClients。MaxConnectionsPerChild 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。这里建议设置为非零,注意原因: 1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存。 2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。2、Worker MPM 和prefork模式相比,worker使用了多进程和多线程的混合模式,worker模式也同样会先预派生一些子进程,然后每个子进程创建一些线程,同时包括一个监听线程,每个请求过来会被分配到一个线程来服务。线程比起进程会更轻量,因为线程是通过共享父进程的内存空间,因此,内存的占用会减少一些,在高并发的场景下会比prefork有更多可用的线程,表现会更优秀一些;另外,如果一个线程出现了问题也会导致同一进程下的线程出现问题,如果是多个线程出现问题,也只是影响Apache的一部分,而不是全部。由于用到多进程多线程,需要考虑到线程的安全了,在使用keep-alive长连接的时候,某个线程会一直被占用,即使中间没有请求,需要等待到超时才会被释放(该问题在prefork模式下也存在)。图片描述如何配置在Apache的配置文件httpd.conf的配置方式:<IfModule mpm_worker_module> StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000 </IfModule> 配置参数解释:StartServers 服务器启动时建立的子进程数量,在workers模式下默认是3.ServerLimit 系统配置的最大进程数量,默认不显示,自己添加上MinSpareThreads 空闲子进程的最小数量,默认75MaxSpareThreads 空闲子进程的最大数量,默认250ThreadsPerChild 每个子进程产生的线程数量,默认是64MaxRequestWorkers / MaxClients 限定服务器同一时间内客户端最大接入的请求数量.MaxConnectionsPerChild 每个子进程在其生命周期内允许最大的请求数量,如果请求总数已经达到这个数值,子进程将会结束,如果设置为0,子进程将永远不会结束。在Apache2.3.9之前称之为MaxRequestsPerChild。这里建议设置为非零,注意原因:1)能够防止(偶然的)内存泄漏无限进行,从而耗尽内存; 2)给进程一个有限寿命,从而有助于当服务器负载减轻的时候减少活动进程的数量(重生的机会)。Worker模式下所能同时处理的请求总数是由子进程总数乘以ThreadsPerChild值决定的,应该大于等于MaxRequestWorkers。如果负载很大,现有的子进程数不能满足时,控制进程会派生新的子进程。默认ServerLimit 最大的子进程总数是16,加大时也需要显式声明ServerLimit(最大值是20000)。需要注意的是,如果显式声明了ServerLimit,那么它乘以 MaxRequestWorkers必须是hreadsPerChild的整数倍,否则 Apache将会自动调节到一个相应值。3、Event MPM 这是Apache最新的工作模式,它和worker模式很像,不同的是在于它解决了keep-alive长连接的时候占用线程资源被浪费的问题,在event工作模式中,会有一些专门的线程用来管理这些keep-alive类型的线程,当有真实请求过来的时候,将请求传递给服务器的线程,执行完毕后,又允许它释放。这增强了在高并发场景下的请求处理。图片描述如何配置在Apache的配置文件httpd.conf的配置方式:<IfModule mpm_event_module> StartServers 3 ServerLimit 16 MinSpareThreads 75 MaxSpareThreads 250 ThreadsPerChild 25 MaxRequestWorkers 400 MaxConnectionsPerChild 1000 </IfModule> event 模式与 worker 模式完全一样,参考 worker 模式参数即可,这里不再重复。Apache httpd 能更好的为有特殊要求的站点定制。例如,要求更高伸缩性的站点可以选择使用线程的 MPM,即 worker 或 event; 需要可靠性或者与旧软件兼容的站点可以使用 prefork。常见问题查看apache的error日志,可以发现许多系统运行中的问题。server reached MaxRequestWorkers setting[mpm_prefork:error] [pid 1134] AH00161: server reached MaxRequestWorkers setting, consider raising the MaxRequestWorkers setting进程或者线程数目达到了MaxRequestWorkers,可以考虑增加这个值,当然先考虑增加硬件,如内存大小、CPU、SSD硬盘等。scoreboard is full[mpm_event:error] [pid 7555:tid 140058436118400] AH00485: scoreboard is full, not at MaxRequestWorkers这个问题好像是apache2自带的bug,我们无力解决。好在这个问题一般只会影响单个线程,所以暂时可以忍。StackOverflow: Scoreboard is full,not at MaxRequestWorkers 1、I had this same problem. I tried different Apache versions and MPMs. I seem to get this alot with MPM Worker. Also error does not reoccur using Apache 2.2.2,Are you using cPanel? IF so try /upcp –force and increase StartServers to a higher amount like 50 as that’s all I did to get this error away.2、Try EnableMMAP Off in 00_default_settings.confapache 主要版本有:Version 2.4 (Current)Version 2.2 (Historical)Version 2.0 (Historical)Version 1.3 (Historical)参考:https://httpd.apache.org/docs/ 关于 Apache 配置优化,请参见米扑博客:Apache 服务器负载低访问慢的原因分析和优化方案 ...

January 6, 2019 · 2 min · jiezi

Apache Flink,流计算?不仅仅是流计算!

阿里妹导读:2018年12月下旬,由阿里巴巴集团主办的Flink Forward China在北京国家会议中心举行。Flink Forward是由Apache软件基金会授权的全球范围内的Flink技术大会,2015年开始在德国柏林举办,今年第一次进入中国。今天,计算平台事业部的资深技术专家莫问,将带领我们重温这场大数据技术的饕餮盛宴,感受Apache Flink 作为下一代大数据计算引擎的繁荣生态。Flink Forward China 大会邀请到了来自阿里巴巴、腾讯、华为、滴滴、美团点评、字节跳动、爱奇艺、去哪儿、Uber、DellEMC、DA(Flink 创始公司)等国内外知名企业以及Apache软件基金会的嘉宾为大家分享了Apache Flink的成长历程、应用场景和发展趋势。Flink Forward China 2018 嘉宾PPT及演讲视频:https://github.com/flink-china/flink-forward-china-2018参与有道,如何更“好”地贡献 Apache 项目上午大会由Apache软件基金会的秘书长Craig Russell开场,Craig首先分享了Apache开源之道,以及开源社区的精神和体制,然后以Apache Flink项目的成长经历为背景,向大家介绍了如何创建以及管理一个Apache开源项目,如何为Apache开源项目做贡献,并跟随开源项目一起成长和收获。通过Craig的分享,我们也更详细地了解到了Apache Flink的发展经历。Flink早期起源于德国柏林工业大学的一个研究项目Stratosphere,并于2014年4月捐献给Apache软件基金会,同时重新定位品牌为Flink,经过8个月孵化期,在2014年12月成功从Apache软件基金会毕业,成为Apache顶级项目,从此开始在大数据领域航行。经过最近4年的持续快速发展,Apache Flink社区已经培养出了42名Committer和19名PMC Member,不断加入的新鲜血液为Apache Flink社区持续贡献代码,并推动社区健康快速的发展。云上计算普惠科技在Craig分享后,阿里巴巴集团副总裁、搜索事业部与计算平台事业部负责人周靖人进行了主题演讲。靖人首先向大家介绍了阿里巴巴大数据云上计算的现状和趋势,让大家看到了阿里巴巴大数据业务场景的超大规模,以及未来更大的挑战。为了更好地支持阿里巴巴未来大数据的发展,阿里大数据发展策略一方面要进一步提升计算力和智能化,增强企业级服务能力。同时也要加强技术的生态化建设,大力支持并推动开源技术社区的发展,兼容行业生态标准,发展生态伙伴联盟,推动生态建设。目前阿里巴巴已经参与贡献230+开源项目,具备8000+合作伙伴和2000+ ISV,云上生态也已经突破1000,000开发人员。在大数据领域,阿里巴巴最近几年对Apache Flink社区进行了持续大力的投入,贡献超过15w行代码,主导建立了Flink China中文社区,加速Flink在国内的生态建设,并于今年开始在北京、杭州、上海、深圳等地多次组织Flink Meetup,促进国内Flink技术人员更方便的分享交流。靖人在分享的最后宣布了阿里巴巴内部Flink版本(Blink)将于2019年1月正式开源,本次开源内部版本的目标主要是希望让广大Flink用户能提前享受到阿里巴巴对Flink的改进和贡献。阿里巴巴同时会尽快将Blink中对Flink的各项改进和优化贡献给Flink社区,坚持对Apache Flink一个社区的拥抱和支持。Apache Flink,如何重新定义计算?在靖人宣布阿里巴巴开源内部Flink版本(Blink)后,阿里巴巴集团研究员蒋晓伟分享了Apache Flink在阿里巴巴内部的成长路线以及技术演进之路。阿里巴巴从2015年开始调研Flink,并于2016年第一次在搜索场景中上线Flink,在经过搜索大数据场景的检验后,2017年Flink开始在阿里巴巴集团范围内支持各项实时计算业务, 到目前为止阿里巴巴基于Flink打造的实时计算平台,已经支持了包括淘宝、天猫、支付宝、高德、飞猪、优酷、菜鸟、饿了么等所有阿里巴巴集团下的所有子公司的数据业务,并通过阿里云向中小企业提供一站式实时计算服务。在2018年的双11中,阿里实时计算平台已经实现了峰值每秒17亿次,当天万亿级的消息处理能力。Apache Flink目前在阿里巴巴内部最典型的业务场景是实时BI,阿里巴巴内部有着海量的在线交易以及用户数据,实时看到各个维度的数据统计可以及时地感知并指导阿里巴巴的运营。下图是一个典型的阿里实时BI流程,阿里的在线服务系统和数据库会实时产生大量日志数据并进入消息队列,FlinkJob会从消息队列中实时读取处理这些数据,然后将各种统计分析结果实时更新到KV/Table存储系统中,例如:HBase,终端用户可以通过Dashboard实时看到各种维度的数据统计分析结果。在双11当天,各种维度的实时数据报表是指导双11决策的依据,其中最为关键的就是全球直播的实时GMV成交额。Flink已经连续两年支持阿里巴巴双11实时GMV大屏,一个看似简单的数字,其背后实际上需要大量Flink计算任务平稳、精准地运行支撑。Flink在阿里巴巴另一个典型的应用场景是在线机器学习,传统的离线机器学习方法需要T+1的分析用户历史行为,训练出模型,当第二天模型上线后就已经是过去式,用户当前的需求和预期可能已经完全改变。为了给用户更好的购物消费体验,阿里巴巴的机器学习系统早已经进化到在线学习时代,例如:当一个用户在搜索完一个Query,浏览结果页时,或者点击查看部分商品时,阿里巴巴的在线学习系统已经可以利用这个间隙了解到这个用户当时的意图和偏好,并在下次用户Query时给出更好的排序,并向用户推荐更合适的商品,这种方式不仅可以进一步提升业务效率,同时也能为用户带来更好的产品体验,尤其是在双11这种大促场景,用户的行为时效性都是很短的,只有通过实时在线学习方式,才能做出更加精确的个性化预测和推荐。在线学习系统的优势在于可以实时收集并处理用户的行为数据,从而进行实时流式的特征计算和在线训练,并将模型的增量更新实时同步回在线系统,形成数据闭环,通过不断迭代自动优化系统效率和用户体验。在阿里的业务规模下,整个在线学习流程将会面对海量的用户数据规模、和极其复杂的计算挑战,但在Flink的驱动下,整个流程可以在秒级完成。通过以上两种经典场景可以看出阿里巴巴实时业务场景在各方面的挑战都很大,直接将Flink社区版本在阿里上线使用是不现实的,因此阿里巴巴实时计算团队这两年也对Flink进行了全面的优化、改进和功能扩展,其中有些功能和改进已经推回到了Flink社区。在Flink Runtime领域,阿里巴巴贡献了:全新的分布式系统架构:一方面对Flink的Job调度和资源管理进行了解耦,使得Flink可以原生运行在YARN,K8S之上;另一方面将Flink的Job调度从集中式转为了分布式,使得Flink集群规模可以更大的扩展。完善的容错机制:Flink默认在任何task和master失败后,都会整个Job 重启,阿里巴巴提出的region-based failover策略以及job manager failover/ha机制,让Flink可以运行地更加可靠稳定;大量的性能优化:Flink早期只提供全量Checkpoint机制,这在阿里巴巴大规模State场景下无法正常运行,阿里巴巴提出了增量Checkpoint机制,让Flink即使在TB级State场景下也可以高效运行;Flink Job经常在内部算子或者UDF中访问外部存储系统,例如:mysql,hbase,redis等,一旦出现个别query被卡住,整个task就被卡住,并通过反压影响到整个job,阿里巴巴提出了async IO机制,大幅降低了同步IO访问带来的影响。 此外,阿里巴巴贡献了credit-based的全新网络流控机制,使得Flink网络数据传输性能得到了显著提升。在Flink SQL领域,阿里巴巴贡献了全新的Streaming SQL语义和功能。例如:Agg Retraction,UDX支持,DDL支持和大量的Connector适配。在阿里巴巴,我们发现很多经典的业务场景都是同时具备实时流处理和离线批处理两种需求,而且流处理和批处理中的业务逻辑几乎是一样的,但用户需要开发两套代码,两套集群资源部署,导致额外的成本。例如阿里巴巴的商品搜索索引构建流程,白天需要将商品的更新信息流式同步到搜索引擎中,让用户可以在搜索引擎中看到实时的商品信息,晚上需要将全量的阿里巴巴商品进行批处理构建全量索引,这就是传统的Lambda架构。阿里巴巴的解法是希望提供一套批流融合计算引擎,让用户只需开发一套业务代码,就可以在实时和离线两种场景下复用,这也是在2015年阿里巴巴选择Flink作为未来大数据引擎的初衷。 Flink基于流处理机制实现批流融合相对Spark基于批处理机制实现批流融合的思想更自然,更合理,也更有优势,因此阿里巴巴在基于Flink支持大量核心实时计算场景的同时,也在不断改进Flink的架构,使其朝着真正批流融合的统一计算引擎方向前进。在Flink Runtime领域,阿里巴巴提出了全新的Operator Framework/API设计,使其能够同时适应批流两种算子特性;同时在Job调度和网络Shuffle两种核心机制上,都实现了灵活的插件化机制,使其能够适应批流不同场景的需求。在Flink SQL领域,阿里巴巴提出了全新的Query Execution和Optimizer架构,利用高效的二级制数据结构,更加合理的内存利用方式,更细粒度的Codegen机制以及更加丰富的优化器策略,使得Streaming 和Batch SQL都有了非常大的性能提升。经过大量架构改进和性能优化后,阿里巴巴内部Flink版本(Blink)在批处理上也实现了重大成果突破,在1T,10T和30T的TPC-DS的Benchmark中,Blink的性能数据均明显超出Spark,并且性能优势在数据量不断增加的趋势下越来越明显,这也从结果上验证了Flink基于流做批的架构优势。目前,阿里巴巴的内部Flink版本(Blink)已经开始支持内部批流融合的应用场景,例如阿里巴巴的搜索推荐算法平台,流式和批量的特征以及训练流程都已经统一基于Flink在运行。蒋晓伟在分享的最后给出了对Flink未来的一些展望,他认为Flink除了批流融合,还有很多新的方向值得去扩展,例如:Flink可以进一步加强在机器学习和图计算生态上的投入,从而在AI浪潮中实现新的突破。此外,Flink天然具备基于事件驱动的处理思想,天然的反压和流控机制,以及自带状态管理和弹性扩缩容的能力,这些优势都在促使基于Flink构建微服务框架成为一种新的思想和解决方案。总结蒋晓伟老师的分享,Apache Flink过去虽然在流计算领域已经获得很大的成功,但Flink并没有停滞,而是正在不断在突破自己的边界,Flink不仅仅是Streaming Engine,也不仅仅是Bigdata Engine,未来更希望努力成为Application Engine。流处理即未来接下来来自DA(Flink创始公司)的CTO - Stephan Ewen也对Flink的发展趋势给出类似的观点。Stephan认为“Streaming Takes on Everything”即流处理是一切计算的基础, Flink一方面需要朝着离线方向发展,实现批流融合大数据计算能力,另一方面也需要朝着更加实时在线方向发展,支持Event-Driven Application。前面已经重点阐述了Flink在批流融合计算方面的进展,接下来我们重点介绍下Flink在Event-Driven Application方向的思路。传统的应用服务架构一般是Online App +Database的架构,Online App负责接收用户Request,然后进行内部计算,最后将Result返回给用户,Application的内部状态数据存储在Database中;在Flink的event-drivenApplication架构中,可以认为Flink Source接收Request, Sink返回Result,JobGraph进行内部计算,状态数据都存储在State中。传统应用服务架构需要自己负责分布式和弹性管理,并由Database负责数据一致性管理;而Flink在这两方面是存在天然优势的,因为Flink天然是分布式系统,可以自己管理弹性伸缩,此外Flink内置了状态管理和exactly once一致性语义,因此基于Flink可以更方便、高效实现Transactional Application。城市级实时计算的力量在Apache Flink社区大神Stephan Ewen的分享后,来自阿里云的AI首席科学家闵万里向大家分享了实时计算在阿里云智慧城市中发挥的力量,通过分享多个真实应用案例,让大家对实时技术有了更多的体感和认识。在城市大脑的业务场景中,不仅要能实时处理来自各种传感器收集到的信息,对现实世界发生的事情进行响应,同时也要对未来将要发生的事情进行预测,例如:接下来那里可能要发生交通拥堵,从而提前做出干预,这才是更大的价值。整个城市大脑的架构都运行在阿里云基础设施之上,Apache Flink承担了核心实时计算引擎的角色,负责处理各种结构化和非结构化数据。在2018年9月的云栖大会上,阿里云发布了杭州城市大脑2.0,覆盖杭州420平方公里,可以监控到超过150万辆在途行驶机动车的实况信息,这个看似简单的事情在过去是很难做到的,现在我们通过1300多个路口的摄像头、传感器以及高德App的实时信息,通过Flink进行三流合一的处理,就可以实时感知到整个城市交通的脉搏信息,并通过进一步分析可以得出延误、安全等交通指数,预测感知城市的态势发展。在杭州,城市大脑通过实时分析4000多个交通摄像头采集的视频流,可以实时监控路上车辆的异常事件,例如:车辆超速、逆行和擦碰等,并将这些异常事件实时同步到交警指挥中心进行实时报警,目前杭州的交通事件报警已经有95%来自城市大脑自动通报的,这背后都是通过Flink进行各种复杂的计算逻辑实时算出来的。实时计算让交警处理交通故障的方式从过去的被动等待变成了主动处理,从而大幅提升城市交通的效率,为老百姓带来实实在在的好处。这50%,关乎生死2018年,城市大脑第一次走出国门,来到马来西亚吉隆坡,基于实时大数据对交通进行智能调度,它可以根据救护车的行驶信息,以及沿途路况信息,智能调整红绿灯,为救护车开辟绿色快速通道,这项技术为救护车节省了近50%的时间到达医院,这50%的时间可能意味着人的生和死,在这里技术显得不再骨感,实时计算的力量也许可以挽救生命。在工业生产IOT场景中,大量设备的传感器都收集了海量的指标数据,这些信息过去都被暂存2个月后丢弃了,唯一的用途就是在出现生产故障时拿来分析用,在有了大数据实时计算能力后,这些指标都可以被实时监控起来,作为及时调控生产流程的依据。协鑫光伏是全球最大的光伏切片企业,阿里云利用实时设备监控,帮助其提高了1%的良品率,每年可以增加上亿元的收入。滴滴实时计算平台架构与实践Keynote最后一位嘉宾是来自滴滴出行的研究员罗李,大家都知道滴滴出行是一个实时出行平台和交易引擎,它的数据和场景天然是实时的,各种网约车服务产生的数据都需要实时处理和分析。滴滴的实时业务场景主要包括实时风控、实时发券、实时异常检测,实时交易、服务和工单监控,以及实时乘客、司机和订单特征处理等。滴滴实时计算平台发展已经经历了三个阶段,第一阶段是各个业务方自建小集群,造成集群和资源碎片化问题;第二阶段由公司统一建立了大集群,提供统一的平台化服务,降低了集群资源和维护成本;第三阶段是通过Flink SQL方式提供平台化服务,通过SQL语言优势进一步降低业务开发成本,提升开发效率。滴滴现阶段基于Apache Flink引擎建设的实时计算平台以开源的Hadoop技术体系作为平台底座,并通过DataStream, SQL和CEP三种API向滴滴内部业务提供实时计算服务,同时在平台层也已经具备相对完善的WebIDE、数据血缘管理、监控报警和多组合隔离等机制。在滴滴实时业务的快速发展推动下,其实时计算集群已经达到千台规模,每天运行2000+流计算任务,可以处理PB级的数据。滴滴在搭建Flink实时计算平台的过程中,在内部也对Flink做了一些改进,例如在 Stream SQL领域扩展了DDL,丰富了 UDF,支持了TTL的双流Join和维表Join等;在CEP领域,增加了更多算子支持和规则动态修改能力等,其中部分优化已经推回了社区。最后,罗李介绍了滴滴实时计算平台的未来规划,主要方向在于进一步推广Stream SQL提升业务开发效率,推动CEP在更多业务场景落地,同时完成公司内部原有Spark Streaming向Flink的迁移,并发力IOT领域。在下午的几个分会场中,来自阿里巴巴、腾讯、华为、滴滴、美团点评、字节跳动、爱奇艺、去哪儿、Uber、EMC、DA(Flink 创始公司)的多位嘉宾和讲师都围绕Flink技术生态和应用场景进行了分享和交流。从分享的内容上可以看出,BAT三家中阿里巴巴和腾讯都已经完全拥抱了Flink;美团、滴滴和字节跳动(TMD)三家新兴互联网企业在实时计算场景也都已经以Flink作为主流技术方向开始建设,滴滴在Keynote上分享已经令人印象深刻,美团的实时计算集群也已经突破4000台规模,字节跳动(头条和抖音的母公司)的Flink生产集群规模更是超过了1w台的惊人规模 。由此可见Apache Flink的技术理念已经在业界得到了大量认可,基于Flink的实时计算解决方案开始在国内占据主流趋势。下一步Flink需要一方面继续完善流计算能力,争取在IOT等更多场景落地,与此同时进一步加强在批流融合能力上的全面突破,并完善在机器学习和AI生态上的建设,以及在event-driven的application和微服务场景上进行更长远的探索。本文作者: 莫问阅读原文本文来自云栖社区合作伙伴“阿里技术”,如需转载请联系原作者。 ...

January 3, 2019 · 1 min · jiezi

Dubbo作者亲述:那些辉煌、沉寂与重生的故事

摘要: Dubbo 这个名字,最后会变成一个 Apache 的商标,会成为一个在 GitHub 上有 2 万多人关注、一百多人参与贡献的超级项目。梁飞在 2011 年开源 Dubbo 这个项目的时候,完全没有想过,Dubbo 这个名字,最后会变成一个 Apache 的商标,会成为一个在 GitHub 上有 2 万多人关注、一百多人参与贡献的超级项目。在自己退出这个项目多年后,Dubbo 仍在野蛮生长,并焕发新机。从商业公司开源出去的产品会变成什么样?开源是否一定要按照某种既定的方式去生长?还是说开源的世界有足够的包容性、开放性,能够允许各种各样的创作在其中成长?且看本次二叉树——Dubbo 项目的故事。嘉宾简介梁飞(虚极),2009 年加入阿里巴巴,负责中间件的开发,Dubbo 开源分布式服务框架作者,HTTL 开源模板引擎作者,QCon 优秀出品人。 2012 年加入天猫,负责手机天猫 APP 的技术团队,见证了天猫双 11 无线化全过程。热衷参与开源社区建设,传播服务化,SOA,框架设计,移动应用等架构设计理念。Dubbo 项目诞生于 2008 年。梁飞最早进入阿里的时候,Dubbo 项目还没有 Dubbo 这个名字,那时的 Dubbo 还是一个阿里内部的系统。2010 年,Dubbo 项目进行了重构。“2009 年下半年主要在修 bug,到了 2010 年初的时候觉得这个架构实在是不堪重负,觉得改起来太痛苦了,于是就重写了。”从 1.0 进入 2.0,梁飞推动了大量的工作,同时继续在 JavaEye 写着他的博客。“写博客对你有什么影响?”“在社区里面看别人的博客,他们也在写一些开源软件,大家互相看博客,然后就认识了。推荐我来阿里的朋友就是当时圈子里认识的。”2011 年的阿里,憋了一股劲儿要成为一家技术人向往的企业。那个时候,开发者刚刚成为国内各大厂商争相夺取的宝贵资产。靠什么吸引最顶尖的开发者?黑客文化。工程师文化。开源文化。“那时候公司觉得要做一些开源的事情,一个是反哺开源界,同时也希望通过开源来提升公司的影响力。”当时在淘宝、在阿里 B2B,都有团队在推动开源。阿里 B2B 这边决定先拿 Dubbo 项目开源出去。“大概在 2011 年初做了很多剥离的工作,也把文档做了梳理。我们并没有做很强的推广,我们自己在技术群里发了一些文章,就有人开始在用了。”“那个时候的团队多少人?我看到你们有一张六个人团队的照片。”“人员的变化还是挺多的,六个人是顶峰时期,是我们知名度上来之后加入我们的。我们平时开发基本上就是一到两个为主。”“有外面的人来贡献代码吗?”“有很多人给我们贡献代码。还有很多公司请我们来跟他们讲。”“还有公司问说能不能我们付一点钱,这样的话他们觉得出了问题可以找我们。”“但是我们当时没有这种机制。”一年时间很快过去了,Dubbo 的用户越来越多,有知名汽车厂商、证券厂商、水泥厂商、电器厂商、电商厂商。“当时来这么多公司,在你的预期之内吗?”“超出我的预期。”就在这个时候,发生了一件大事:阿里巴巴集团要强化 One Company,开始进行架构调整。技术层面,整个公司大统一,就希望不要重复建设,但凡相同的项目都要合并。当时的淘宝有一个项目叫做 HSF,也是一个中间件服务框架,跟 Dubbo 做的事情高度重合。“一开始说可以让 HSF 合并到 Dubbo 里面来,给了我们三个月时间要把它们整合起来。”HSF 项目的作者林昊(毕玄),也是当时国内 Java 领域的知名技术领袖。在 OSGi 非常流行的时候,毕玄可能是国内能够把 OSGi 解释的最清楚的人之一。HSF 和 Dubbo,虽然做的事情高度重合,但是设计理念不怎么一样,虽然有些碰撞,但最终目的还是为了“强强联合”。“合并的时候,整个淘系都在用 HSF,而阿里金融、集团、B2B 都在用 Dubbo。”“时间没有达到预期,还是没合并起来。但其实我们把两边的协议都兼容好了。”“后来就决定反向合并,把 Dubbo 合并到 HSF 里面去。”“你当时觉得应该合并吗?”“我觉得协议能互通是有好处的,并不是坏事。我觉得他们做的挺好,把两边的设计理念全部整合在一起了。”不久之后,Dubbo 团队调整,去到了各个地方。从外面看来,Dubbo 项目从 2014 年之后就再也没有更新过。倒是当当网开发的扩展版本 Dubbox 后来持续发展,被圈内人评价为“墙内开花墙外香”。“你会不会觉得建立共识是一个特别困难的事情?”“我觉得任何东西必须要有一个主导,但这个东西其实没有对错。一个设计是没有对错的,有些人可能就是不会认同你这个共识,但你总是能找到认同你共识的人。”“我就是认为越简单越好,我的设计原则就是一定要实用。增加的复杂度越小,能带来更大的收益,我觉得就值得。”“那么,你要怎么吸引那些能够认同你的人到你的身边来?在他们还不知道你的时候。”“我会去其他团队认识人,或者在圈子里面认识人,我会跟他去聊我的理念,我会去分享。有人特别认同的话,他就会来。”就在所有人都以为 Dubbo 项目已经没有未来的时候,事情又出现了变化。2017 年 9 月,就在项目已经将近 3 年没动静的时候,Dubbo 连续发布了好几个新版本,并且开始在内部招募对 Dubbo 感兴趣的同事。新版本背后的主力开发团队是阿里巴巴中间件团队,其中一个重要的人名叫北纬,他从 2017 年 7 月开始接手 Dubbo。在一次对外公开的采访中,北纬说到:“我对 Dubbo 的了解主要来自梁飞在 JavaEye 的系列文章,再通过自己阅读源码,以及在内部 RPC 框架对 Dubbo 兼容的工作中学习所得。”梁飞曾经在 2015 年写过一个继续推动 Dubbo 的规划,找了很多人聊过:找过开源委员会,找过内部的朋友,找过外面的朋友,希望能共同把这个事情继续推起来。但是,梁飞已经没有那么多时间可以投入到 Dubbo 上。他当时在做天猫客户端。“不管是谁,靠一腔热血都很容易凉掉。”有的开源项目,通过志愿者们投入各自的业余时间活下去。但我们应该要求所有的开源项目都能做到这一点吗?事实上,用户也不会愿意将自己重要的东西跑在单纯靠志愿者们的业余时间堆砌起来的项目上——尤其是企业用户。Dubbo 是中间件项目,用户一定是企业。企业用户宁愿花钱,有人给他提供服务,而不是搞来一堆免费而没有保障的东西,自己为所有的问题负责。Dubbo 的转机,在于阿里云的流行。2017 年的阿里云,发现有一批客户上云之后,想要用 Dubbo。因为他们 Dubbo 已经用的很熟了,不想因为上云而被迫改变自己的使用习惯。于是,阿里云就把 Dubbo 服务作为自己的一个产品,卖给了这些客户。但是,客户们又提出了一个问题:“你看你们 Dubbo 都不怎么更新代码了是吧?你们自己都不维护了,我们用你的框架就觉得特别不放心。”这下好了,真正的客户提出要求了。提升客户对 Dubbo 的信心,成为了一件在公司层面有价值的事情。“怎样提升客户对 Dubbo 的信心?”“让它进一步升级。”“最好的办法是什么?”“捐给 Apache。”北纬带动着他的团队,将 Dubbo 项目捐给了 Apache。2018 年初,Dubbo 项目正式进入了 Apache 的孵化器。一边是 Apache Dubbo 重启后的第一个里程碑版本 2.7.0 进入社区投票阶段,并将作为社区的毕业版本;另一边,Dubbo 正在从一个微服务领域的高性能 Java RPC 框架,演进到微服务框架 Dubbo Ecosystem,打造出一个完整的微服务生态。而此时,距离去年 Dubbo 重启仅过一年有余。我们去找到北纬,希望他聊聊 Dubbo 的未来。北纬说,还是让梁飞跟我们多讲讲。“你觉得什么是开源的精神?”“开源的精神,就是大家的智慧能共同成长。”“你觉得中国的开源现在有哪些做得好的地方和不足的地方?”“我觉得中国的开源最缺对社区的重视,很多都只是把代码 push 出来,有些甚至连文档都不完善,好像人家爱用不用,出了问题也不是我的事。但这可能是一个初级阶段,慢慢会成熟起来。但我觉得好的地方就是,大家都相信开源的力量。”“您会不会觉得中国企业做开源,功利心特别重,光去看这个东西是不是有用?”“输出技术影响力是吧?我觉得一个开源社区要能够一直运作下去,而且能跟上时代的潮流,其实是要与时俱进的。我觉得做开源,就是期望这个东西一直有生命力,这个作品能够活多久应该作为它的核心目标。”“那您觉得 Dubbo 还能活多久?”“我觉得技术的革新其实挺快的,不革新的话,就有淘汰的危险。但是在这个节点上进行一次革新的话,我觉得它还有很长的生命力。”“那是什么样的革新?”“任何技术一定是没有终点的。没有任何架构能解决现实中所有的问题,而任何一个架构去解决前面的问题的时候,一定会带来副作用,然后就需要下一个架构去治理。这个探索的方向是没有止境的,但只有你到达了一个阶段,你才能够去想下一个阶段的很多事情。”“回到原点,十年前的选择一定是最正确的吗?就算当时是最正确的,现在也不一定正确对吧?因为时代在变化。如果我们今天从零开始,我们有没有更好的选择?有时候我们背了十年的包袱,反而不敢行动了。但我希望我们下一代演化的时候,我们能够提出一些颠覆式的理念,真正革新的解决我们现在面临的问题背后的那些问题,而不是头痛医头脚痛医脚。这是我们期望做的事情。”如常,早上 9 点多,梁飞打开邮箱,关于 Apache Dubbo 重启后的第一个里程碑版本 2.7.0 的讨论邮件还在 mailing list 里热烈进行着;另一边,Dubbo 正在从一个微服务领域的高性能 Java RPC 框架,演进到微服务框架 Dubbo Ecosystem,打造出完整微服务生态。而此时,距离去年 Dubbo 重启仅过一年有余。本文作者:二叉树阅读原文本文来自云栖社区合作伙伴“InfoQ”,如需转载请联系原作者。 ...

January 3, 2019 · 1 min · jiezi

To be better —msup荣获平安科技“2018年度优秀合作伙伴”称号

2018年12月4日,平安科技在深圳平安金融中心举办了“2018年平安科技优秀培训合作伙伴交流会”,msup收到了邀请参与此次评选,并从80余家合作伙伴中脱颖而出,在交付量、满意度、师资内容、服务水准等十余项指标中获得IT技术培训类“2018年度优秀合作伙伴”奖。平安科技成立于2008年,是平安集团旗下的全资子公司,负责开发并运营集团的关键平台和服务。特别是在云、人工智能和大数据方面,平安科技有着强劲的研究和开发能力,积累了丰富的“科技+互联网+金融”经验。在技术研究方面,拥有超过18项新技术及全球研究和开发AI内部的能力,人才储备方面也始终秉承将员工培养成为具有一流专业素养的专家、专才。在此次评选活动中,平安科技从总体满意度、师资力量 、服务水平三个维度进行评估筛选,这其中包括,总体满意度要高于4.5分(满分5分);师资方面,能够提供较多的行业顶尖讲师或标杆企业高管;服务水平上,能够准确理解需求、及时响应,并提供专业细致的后勤支持等。msup作为国内最大的研发管理培训平台,汇聚了全球知名企业一线技术带头人。每年提供数百场专业的技术管理、研发实践、战略设计等培训课程,在与平安科技合作8年中,msup提供了专业化的技术管理类解决方案 ,助力平安科技在技术研发及团队成长取得成就。此次颁奖典礼上,msup联合创始人兼CEO刘付强先生也表示:“msup作为第一个授奖优秀合作伙伴获得首肯,感谢平安科技人力资源部的信赖与好评,感谢我们团队成员专业交付、持续交付,未来将继续以客户“持续成交”“快速响应”为唯一目标。企业级培训,将进入优化阶段,会淘汰一批合作伙伴,以先进实践、技术驱动为导的解决方案级培训,我们要加强课程体系感、产品线组合搭配,为用户带来更具竞争力的培养长方案。”平安科技企业内训msup发源于2005年微软,成立于2007年,历经11载,专注于科技型企业快速成长,每年组织500余场面对面公开课、工作坊、开放日、技术峰会等,超过150000+技术骨干和技术管理者面对面付费学习,超过3000家技术型企业续约信赖。msup一直致力于成为面向技术型企业快速发展的经验智库,帮助中国技术型企业和团队快速找到高效技术成长路径。开展业务的这11年里,我们成功举办了7届全球软件案例研究峰会、42届MPD软件工作坊、超过3000期内训和公开课,邀请2000+名工作在一流研发企业的技术团队带头人成为客座教练,累计培训超过数十万名技术管理人士。技术峰会2019年,msup将继续携手国内外一线专家,根据听众需求和技术热点进行选题策划;演讲内容秉承十余年坚持的skill transfer理念,对听众最为关注的话题进行多维度解读,只为打造有深度的实践分享,让听众能够学有所获。公开课&内训课公开课面向产品经理、团队经理、架构师、开发经理、测试经理、工程师六大领域的课程,教练均来自知名IT公司团队带头人,针对企业遇到的特定项目、问题或情况,以及团队现有技能水平制定个性化培训路径。此外,每年围绕大客户提供定制培训400+期内训课,加速技术团队攻坚克难关键路径与胜任能力。方法 +随着企业组织架构的调整,msup创始人刘付强先生和百度工程效率部负责人李涛先生率先提出了“方法+”的理念,即通过探索、创新、求变,沉淀与分享实践案例,逐渐升华演化、提炼出一套先进方法与企业实践相结合的知识体系,其中包括方法知识、案例库、培训与咨询服务和配套工具链,重构互联网时代的技术管理模式。现已联合百度、中国平安、用友、蚂蚁金服、腾讯等众多全球知名互联网公司共建方法+课程生态,帮助其打造最佳的商业模式设计、组织架构设计、产品设计方案、研发组织管理、产品用户运营等具体的实施环节,解决企业的技术难题。顾问咨询服务msup汇集了业内最资深的顾问,来自于世界500强,顶级的互联网公司 ,以及硅谷、西雅图的一流技术型企业,围绕能力提升,提供的业务创新、敏捷转型、架构重构、工程效率这样的创新闭环咨询服务,以全方位、多维度的体系,通过技术分享、培训、管理咨询与微咨询,帮助企业将其战略落地到战术并不断的迭代前行。buzz平台的研发也是msup为了帮助中国技术型企业能够最终创建属于自己的企业社群学习平台,在不久的将来,希望企业在企业学习的道路上,抬头也能望见星空。msup致力于可以帮助更多企业、用户成长,我们也将继续砥砺前行,分享世界级软件研发团队最佳管理实践,To be better!

December 29, 2018 · 1 min · jiezi

apache storm demo示例

从国外网站上翻译的,主要业务是创建移动电话日志分析器。 场景 - 移动呼叫日志分析器 移动电话及其持续时间将作为Apache Storm的输入提供,Storm将处理并分组相同呼叫者和接收者之间的呼叫及其呼叫总数。 创建Spout Spout是用于数据生成的组件。基本上,spout将实现一个IRichSpout接口。“IRichSpout”界面有以下重要方法 - open - 为spout提供执行环境。执行者将运行此方法来初始化spout。 nextTuple - 通过收集器发出生成的数据。 close - spout将要关闭时调用此方法。 declareOutputFields - 声明元组的输出模式。 ack - 确认处理了特定的tuple fail - 指定一个特定的tuple不被处理并且不被重新处理。 open __open__方法的签名如下 - open(Map conf, TopologyContext context, SpoutOutputCollector collector) conf - 为此spout提供storm暴配置。 context - 提供关于topology中spout位置,其任务ID,输入和输出信息的完整信息。 collector - 使我们能够发出将由bolts处理的tuple。 nextTuple __nextTuple__方法的签名如下 - nextTuple() nextTuple()从与ack()和fail()方法相同的循环周期性地调用。当没有工作要做时,它必须释放对线程的控制,以便其他方法有机会被调用。所以nextTuple的第一行检查处理是否完成。如果是这样,它应该睡眠至少一毫秒,以在返回之前减少处理器上的负载。 ...

May 7, 2018 · 4 min · jiezi