Category未分类

SpringCloud配置ConfigServer

Spring Cloud Config可以用来作分布式配置中心,本质上ConfigServer会从git / svn / 本地目录上下载到本地环境,EnvironmentController提供了一些了接口给ConfigClient启动时调用,EnvironmentController会返回本地缓存的配置文件给ConfigClient,从而实现分布式配置

 

首先我们需要创建一个server端工程,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>
    <groupId>com.hlab.gongura</groupId>
    <artifactId>gongura</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>gongura</name>
    <description>Config Server</description>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.3.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <properties>
        <!-- Generic properties -->
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-cloud.version>Dalston.RELEASE</spring-cloud.version>
        <springfox-version>2.6.1</springfox-version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>
      
    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>${spring-cloud.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
</project>

application.yml配置

server:
  port: 8888


spring:

#config server 配置 ,从git获取配置
  cloud:
    config:
      server:
        git:
          uri: https://gitee.com/**********
#          username: *******   如果是私有项目需要填写
#          password: *******    如果是私有项目需要填写

uri填写git地址,这里的配置是从git获取的,也可以使用本地文件填写配置

 

Application主类代码,主要是@EnableConfigServer

package com.hlab.gongura;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.cloud.netflix.feign.EnableFeignClients;

@EnableEurekaClient
@EnableFeignClients
@SpringBootApplication
@EnableConfigServer
public class GonguraApplication {
    public static void main(String[] args) throws Exception {
        SpringApplication.run(GonguraApplication.class, args);
    }
}

配置完成后试下访问看看得到的结果

{
	"name": "application-dev",
	"profiles": ["default"],
	"label": null,
	"version": null,
	"state": null,
	"propertySources": [{
		"name": "https://gitee.com/CheungQ/spring-cloud-config-repository/application-dev.yml",
		"source": {
			"demo.title": "new 新内容 (yml 11文件)"
		}
	}]
}

远程git中的配置文件application-prod.yml中的内容为

demo:
  title: "prod env title"

至此,server端配置完成,接下来我们要配置的是client端,client端其实就是一个普通的工程,在resources目录下创建一个新的配置文件bootstrap.yml,注意不是application.yml,内容如下

spring:
  application:
    name:  orchid-client
  cloud:
    config:
      uri: http://localhost:8888
      name: application
      profile: prod

 

接下来就可以直接用@value注解获取配置了,另外有个tips,本地配置中最好加下对应的配置,比如我在application.yml中加了

demo:
  title: "本地"

 

否则会报错

 

文档:https://springcloud.cc/spring-cloud-config-zhcn.html#true-encryption-and-decryption

Nginx配置说明

user nginx nginx ;

Nginx用户及组:用户 组。window下不指定

 

worker_processes 8;

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

 

error_log  logs/error.log;  

error_log  logs/error.log  notice;  

error_log  logs/error.log  info; 

错误日志:存放路径。

 

pid logs/nginx.pid;

pid(进程标识符):存放路径。

 

worker_rlimit_nofile 204800;

指定进程可以打开的最大描述符:数目。

这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。

现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。

这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

 

events

{

use epoll;

使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。

补充说明:

与apache相类,nginx针对不同的操作系统,有不同的事件模型

A)标准事件模型

Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll

B)高效事件模型

Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。

Epoll:使用于Linux内核2.6版本及以后的系统。

/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。

Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

 

worker_connections 10000;

没个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections

keepalive_timeout 65;

keepalive超时时间。

Continue reading

Win服务器配置

vcredist_x86

http://blog.cheungq.me/vcredist_x86.zip

php7

http://blog.cheungq.me/php.zip

【mysql】insert … on duplicate key update column=IF(条件,值1,值2 ) 简直神一样的操作

Insert…on duplicate key相信大家都知道了,是一个非常好用的功能,可以在批量导入数据的时候插入并且保证在key冲突的时候执行更新操作而不是报错。笔者最近写代码的时候却碰到一个需求,就是想要在这个基础上根据某列的值来决定update后面的值,举个例子,如果columnA>0,那么更新columnB=1或者不更新,然后就在网上对duplicate key和update的用法大肆搜索一番,看有没有类似的用法,结果都是比较常规的用法,颇为失望。然后又想到普通的update是在后面加where条件的,那能不能试试直接加where条件呢?残念,这个也行不通。。。

然后在准备放弃老老实实用2条sql执行的时候,脑子里突然灵光一闪,想到mysql不是有自带函数的么?能不能结合利用一下呢?于是查mysql函数大全,我翻翻翻,bingo!终于被我找到一个函数

IF 函数用法

语法: IF(expr1,expr2,expr3)

函数用法说明:如果 expr1 是 TRUE (expr1 <> 0 and expr1 <> NULL) ,则 IF() 的返回值为 expr2 ; 否则返回值则为 expr3 。 IF() 的返回值为数字值或字符串值,具体情况视其所在语境而定

这不就是我想要的吗?赶紧试试

INSERT INTO tbl (columnA,columnB,columnC) VALUES (1,2,3) ON DUPLICATE KEY UPDATE columnA=IF(columnB>0,1,columnA)

自增

array(2) {
[0]=>
int(0)
[1]=>
int(0)
}

iframe异步加载页面动态内容,实现页面动静分离

之前实现了手机站小说封面页动静分离的改造,稍微简单啰嗦几句,后面有机会详细的再写下。

封面页以书为key,缓存起来封面页的静态的通用的,很少改变的主要部分内容,利用异步加载的方法,修改页面上个别按钮和个人信息的内容部分。主页面内容部分由原来的300-500ms的响应时间可降低至50ms左右,因为内容都是直接根据url里的书号产生的key来从存储中获得的。另外通过异步加载动态获取的内容可以控制在60-100ms之内,基本实现了页面的动静分离和提速。

现在的问题是这样的,因为某些原因页面上布置了至少4、5个广告,当用户处于2g,甚至GPRS网络的情况下,因为网速的限制以及其他的一些原因,原本用的jquery的ajax加载非常的滞后执行,导致页面显示出来后目录部分原本文字需要等待4、5秒才能看到动态加载获取到目录内容替换掉静态内容中的目录部分。

这样就会给用户及其不好的加载延后的体验,后来经过摸索实验。将目录部分的内容放在iframe中,随页面dom结构加载,并在iframe的内的页面末端加上js,将iframe内的目录部分的内容替换主页面的目录部分的内容。
Continue reading

Ubuntu Server 14.04 LTS 服务器配置(java)

1.sudo su,切换到管理员权限下
2.添加ppa
add-apt-repository ppa:webupd8team/java

3.apt-get update更新资源索引

apt-get update 和 upgrade 的区别

update

update 是同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。

upgrade

upgrade 是升级已安装的所有软件包,升级之后的版本就是本地索引里的,因此,在执行 upgrade 之前一定要执行 update, 这样才能是最新的。

An update should always be performed before an upgrade or dist-upgrade.

upgrade is used to install the newest versions of all packages currently installed on the system from the sources enumerated in /etc/apt/sources.list. Packages currently installed with new versions available are retrieved and upgraded.


4.sudo apt-get install oracle-java8-installer

安装java

5 java -version 查看是否安装成功

java,php的BOM头处理

[code type=php]
“;
}else{

$dirname = $basedir.”/”.$file;
checkdir($dirname);
}
}
}
closedir($dh);
}
}
function checkBOM ($filename) {
global $auto;
$contents = file_get_contents($filename);
$charset[1] = substr($contents, 0, 1);
$charset[2] = substr($contents, 1, 1);
$charset[3] = substr($contents, 2, 1);
if (ord($charset[1]) == 239 && ord($charset[2]) == 187 && ord($charset[3]) == 191) {
if ($auto == 1) {
$rest = substr($contents, 3);
rewrite ($filename, $rest);
return (“BOM found, automatically removed.“);
} else {
return (“BOM found.“);
}
}
else return (“BOM Not Found.”);
}
function rewrite ($filename, $data) {
$filenum = fopen($filename, “w”);
flock($filenum, LOCK_EX);
fwrite($filenum, $data);
fclose($filenum);
}
?>
[/code]

[code type=java]
/**

* 去除bom报头

*/

public static String formatString(String s) {

if (s != null) {

s = s.replaceAll(“\ufeff”, “”);

}

return s;

}
[/code]
来源 http://blog.csdn.net/u012519664/article/details/41596857

MySQL分区性能初探[转]

一, 分区概念

分区允许根据指定的规则,跨文件系统分配单个表的多个部分。表的不同部分在不同的位置被存储为单独的表。MySQL从5.1.3开始支持Partition。

分区和手动分表对比

手动分表 分区
多张数据表 一张数据表
重复数据的风险 没有数据重复的风险
写入多张表 写入一张表
没有统一的约束限制 强制的约束限制

MySQL支持RANGE,LIST,HASH,KEY分区类型,其中以RANGE最为常用:

Range(范围)–这种模式允许将数据划分不同范围。例如可以将一个表通过年份划分成若干个分区。
Hash(哈希)–这中模式允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如可以建立一个对表主键进行分区的表。
Key(键值)-上面Hash模式的一种延伸,这里的Hash Key是MySQL系统产生的。
List(预定义列表)–这种模式允许系统通过预定义的列表的值来对数据进行分割。
Composite(复合模式) –以上模式的组合使用 

二,分区能做什么

逻辑数据分割
提高单一的写和读应用速度
提高分区范围读查询的速度
分割数据能够有多个不同的物理文件路径
高效的保存历史数据
一个表上的约束检查
不同的主从服务器分区策略,例如master按Hash分区,slave按range分区

Continue reading

MySQL的表分区详解[转]

这篇文章主要介绍了MySQL的表分区,例如什么是表分区、为什么要对表进行分区、表分区的4种类型详解等,需要的朋友可以参考下

一、什么是表分区
通俗地讲表分区是将一大表,根据条件分割成若干个小表。mysql5.1开始支持数据表分区了。
如:某用户表的记录超过了600万条,那么就可以根据入库日期将表分区,也可以根据所在地将表分区。当然也可根据其他的条件分区。

二、为什么要对表进行分区
为了改善大型表以及具有各种访问模式的表的可伸缩性,可管理性和提高数据库效率。
分区的一些优点包括:
1)、与单个磁盘或文件系统分区相比,可以存储更多的数据。
2)、对于那些已经失去保存意义的数据,通常可以通过删除与那些数据有关的分区,很容易地删除那些数据。相反地,在某些情况下,添加新数据的过程又可以通过为那些新数据专门增加一个新的分区,来很方便地实现。通常和分区有关的其他优点包括下面列出的这些。MySQL分区中的这些功能目前还没有实现,但是在我们的优先级列表中,具有高的优先级;我们希望在5.1的生产版本中,能包括这些功能。
3)、一些查询可以得到极大的优化,这主要是借助于满足一个给定WHERE语句的数据可以只保存在一个或多个分区内,这样在查找时就不用查找其他剩余的分区。因为分区可以在创建了分区表后进行修改,所以在第一次配置分区方案时还不曾这么做时,可以重新组织数据,来提高那些常用查询的效率。
4)、涉及到例如SUM()和COUNT()这样聚合函数的查询,可以很容易地进行并行处理。这种查询的一个简单例子如 “SELECT salesperson_id, COUNT (orders) as order_total FROM sales GROUP BY salesperson_id;”。通过“并行”,这意味着该查询可以在每个分区上同时进行,最终结果只需通过总计所有分区得到的结果。
5)、通过跨多个磁盘来分散数据查询,来获得更大的查询吞吐量。

三、分区类型
· RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区。
· LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。
· HASH分区:基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL 中有效的、产生非负整数值的任何表达式。
· KEY分区:类似于按HASH分区,区别在于KEY分区只支持计算一列或多列,且MySQL 服务器提供其自身的哈希函数。必须有一列或多列包含整数值。

1.RANGE分区
基于属于一个给定连续区间的列值,把多行分配给分区。这些区间要连续且不能相互重叠,使用VALUES LESS THAN操作符来进行定义。以下是实例。 Continue reading

PHP explode 分割空字符串

今天开发的时候偶然间遇到一个神奇的情况,当用explode分割一个空字符串的时候有可能会得到一个array(0=>”)这样的数组,对于处理后的数据使用起来非常的不方便,所以记录下,在explode之前先判断被分割的字符串是否为空

© 2018 CheungQ

Theme by Anders NorénUp ↑