首页 文章 精选 留言 我的

精选列表

搜索[搭建],共10007篇文章
优秀的个人博客,低调大师

搭建Jmeter容器集群平台

版权声明:本文为博主原创文章,未经博主允许不得转载。欢迎访问我的博客 https://blog.csdn.net/smooth00/article/details/80174900 基于大量虚拟机的Jmeter集群有个缺点,就是不方便管理,比如需要重启Jmeter服务,还需要一个个的连接到虚拟机上进行操作,而且安装部署不方便(无法一键部署),也不方便将集群封装成整体应用对外提供服务。这些缺点通过Rancher部署的容器云平台就能够解决。 一、给各个节点的虚拟机安装Docker 可以让创建虚拟机时就自动带上统一版本的Docker,就可以省掉这一步操作,网上还推荐使用DaoCloud进行Docker安装和镜像加速,我们是为了做实现,就原始的方式安装吧: 1、对于CantOS安装Docker最好是CentOS7,这样可以保证内核至少是3.10(通过uname -r 命令查看),低于这个版本的内核无法安装Docker。 2、使用 root 权限登录 Centos。确保 yum 包更新到最新(sudo yum update),我是没有更新。 3、卸载旧版本(如果安装过旧版本的话) sudo yum remove docker docker-common docker-selinux docker-engine 4、安装需要的软件包, yum-util 提供yum-config-manager功能,另外两个是devicemapper驱动依赖的 sudo yum install -y yum-utils device-mapper-persistent-data lvm2 5、设置yum源 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo 6、直接安装最新版的docker(记住版本宁可最新,也不要低于Rancher所要求的版本) sudo yum install docker-ce 7、启动并加入开机启动 $ sudo systemctl start docker $ sudo systemctl enable docker 二、Rancher安装和配置 可以选择一台机独立安装,也可以和Jmeter的Master节点部署在一台机上。Rancher是一个开源的容器管理平台(支持华人的产品),帮助构建企业私有容器服务,相当于KVM里的Openstack。 1、直接调用Docker安装 sudo docker run -d --restart=unless-stopped -p 8080:8080 rancher/server 2、登录Rancher 装完后,(等启动完后)通过http://IP:8080登录,可以选择语言为中文版显示,进行Rancher认证配置(我也不配了,直接忽略) 3、Rancher主机添加 Rancher提供了很多machine drivers批量添加主机,我们也简单一点,直接选择Custom手动添加吧 以上的两标签可先不加,留后面再加也行,主要是为了标识这是主节点,host.ip为指定IP(对于Slave节点不需要加标签io.rancher.host.name=master),第4步的IP也可以不用配置,除非是某个节点主机与Rancher部署在一台机器上(我就是)。最后奔向第5步,复制那一串代码,到需要添加的主机上运行就可以(前提也是主机装好了Docker,并且可以访问Rancher,避免访问失败连防火墙也可以先关了)。 添加完一个主机后,继续添加其他Slave节点的主机,我是添加了一台master(与Rancher共用)、两台slave(这三台机的IP最好都是同网段的,不要用相邻网段的,比如网段为172.16的虚拟机创建Docker后,其网桥的默认网段就变成172.17,这就导致和172.17网段的虚拟机会网络冲突,碰到冲突临时的解决方式就是手动修改网桥docker0的网段并重启机器) 逐台主机登录输入命令添加Custom也挺头疼,可以使用expect编写一个脚本来减轻部分工作量(我就添加三台,用不上): #!/usr/bin/expect set timeout -1 set ip [lindex $argv 0] spawn ssh root@$ip expect { "*Are you sure you want to continue connecting (yes/no)?*" { send "yes\r" } "*password*" { send "123456\r" } } expect { "*password*" { send "123456\r" } } expect { "]# " { send "sudo docker run --rm --privileged -v /var/run/docker.sock:/var/run/docker.sock -v /var/lib/rancher:/var/lib/rancher rancher/agent:v1.2.2 http://172.16.1.37:8080/v1/scripts/EE431DCFC650693D335A:1483142400000:3FSEGIHT9rsY68RViGJGV8sBiBk\r" } } send "exit\r" expect eof exit 添加完三台主机后的效果: 4、添加Jmeter应用 添加应用(Add Stack)就是填写docker-compose.yml和rancher-compose.yml。由于slave集群在压测过程中往往由于压力过大出现各种rmi异常导致崩溃,我们把主从分别建两个应用(Stack)。 jmeter-master的docker-compose.yml配置如下(调用的是Docker Hub镜像库里的镜像): version: '2' services: master: image: malfurionpd/jmeter-master stdin_open: true network_mode: host tty: true ports: - 60000:60000/tcp labels: io.rancher.scheduler.affinity:host_label: io.rancher.host.name=master io.rancher.container.pull_image: always jmeter-master的rancher-compose.yml配置如下: version: '2' services: master: scale: 1 start_on_create: true jmeter-slaves的docker-compose.yml配置如下(包含多节点): version: '2' services: slave01: image: malfurionpd/jmeter-slave-ip environment: HOST_IP: 172.16.1.37 stdin_open: true tty: true ports: - 1099:1099/tcp - 50000:50000/tcp labels: io.rancher.container.pull_image: always io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.37 slave02: image: malfurionpd/jmeter-slave-ip environment: HOST_IP: 172.16.1.140 stdin_open: true tty: true ports: - 1099:1099/tcp - 50000:50000/tcp labels: io.rancher.container.pull_image: always io.rancher.scheduler.affinity:host_label: host.ip=172.16.1.140 jmeter-slaves的rancher-compose.yml配置如下: version: '2' services: slave01: scale: 1 start_on_create: true slave02: scale: 1 start_on_create: true 添加应用时导入以上配置文件,点击创建,顺间就能创建jmeter集群(几秒钟的事情)。 创建好的集群各个节点,就可以方便的进行管理(升级、重启、停止服务、查看日志、执行命令行等操作),无需连接Linux,就可直接进行各节点的命令操作: 通过以上ps查看,就能发现jmeter的从节点自动启动了jmeter-server,无需人为操作jmeter-server的启动。 登录到master主机,也能看到jmeter-master容器和rancher服务 三、Jmeter集群应用 到这一步就可以验证上面的成果了,直接到一个脚本newTest.jmx进行测试: jmeter -n -t /jmeter/apache-jmeter-3.2/bin/newTest.jmx -Djava.rmi.server.hostname=172.16.1.30 -Dclient.rmi.localport=60000 -R 172.16.1.140,172.16.1.37 -l /jmeter/apache-jmeter-3.2/DashReport/log-222.csv -e -o /jmeter/apache-jmeter-3.2/DashReport/htmlReport-222 将输出的报告从容器中拷出用html查看,一切OK 四、扩展应用 以上已经实现了一套Jmeter的容器云平台,但是为了让脚本和报告集中管理,我们需要构建一个文件服务器,通过nginx或是SVN都行。在文件目录下建立jmx,jtl,report三个子目录。 将本机编辑和测试通过的脚本,直接上传到文件服务器上(需要配置SSH免密登录) scp newTest.jmx root@x.x.x.x:/data/jmetertest/jmx/ 通master节点的jmeter可以直接连接文件服务器调用脚本,并将生成的报告保存到文件服务器上。以下是jmeter的示例脚本: #!/bin/bash if [ ! -n "$1" ] ;then echo 'give me a parameter, ok?' else now=`date --date='0 days ago' "+%Y%m%d%H%M%S"` echo "=====Start JMeter Test $1 on $now" echo "=====Step1 wget" cmd1="wget -P /jmeter/apache-jmeter-3.2/bin/ https://xxx.xxx.xxx/jmetertest/jmx/$1" eval ${cmd1} echo "=====Step2 makedir in local" #jmeter-jtl if [ ! -d "/jmeter-jtl" ]; then mkdir /jmeter-jtl fi #jmeter-jtl/xxx.jmx if [ ! -d "/jmeter-jtl/$1" ]; then mkdir "/jmeter-jtl/$1" fi #jmeter-report if [ ! -d "/jmeter-report" ]; then mkdir /jmeter-report fi #jmeter-report/xxx.jmx if [ ! -d "/jmeter-report/$1" ]; then mkdir "/jmeter-report/$1" fi echo "=====Step3 jmeter" cmd2="/jmeter/apache-jmeter-3.2/bin/jmeter -n -t /jmeter/apache-jmeter-3.2/bin/$1 -l /jmeter-jtl/$1/$now.jtl -e -o /jmeter-report/$1/$now -Djava.rmi.server.hostname=172.16.1.30 -Dclient.rmi.localport=60000 -R 172.16.1.37,172.16.1.140" eval ${cmd2} tip="10.135.147.74" echo "=====Step4 scp" #scp jtl tjtl="/data/jmetertest/jmetertest/jtl" cmd3="ssh root@${tip} \"[ -d ${tjtl}/$1 ] && echo ok || mkdir -p ${tjtl}/$1\"" eval ${cmd3} cmd4="scp /jmeter-jtl/$1/$now.jtl root@${tip}:${tjtl}/$1/" eval ${cmd4} #scp report treport="/data/jmetertest/report" cmd5="ssh root@${tip} \"[ -d ${treport}/$1 ] && echo ok || mkdir -p ${treport}/$1\"" eval ${cmd5} cmd6="ssh root@${tip} \"[ -d ${treport}/$1/$now ] && echo ok || mkdir -p ${treport}/$1/$now\"" eval ${cmd6} cmd7="scp -r /jmeter-report/$1/$now root@${tip}:${treport}/$1/" eval ${cmd7} echo "=====End JMeter Test $1 on $now" fi 备注说明:上面所用到的jmeter镜像都是从DockerHub调用的,为了方便镜像的分布式下发和运行,调用DockerHub的镜像是个简便的方式,我们也可以自己生成jmeter镜像,申请个Docker Hub账号后上传到镜像库里。 由于Rancher还有很多其他功能,也可以做一些其他方面的集成,后续再做研究!

优秀的个人博客,低调大师

Docker搭建Robot Framework环境

基础镜像选择Alpine Linux,关于Alpine的介绍参见Alpine Docker 安装 bash。Dockerfile内容如下: FROM alpine:3.7 MAINTAINER Rethink shijianzhihu@foxmail.com RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories # 加--virtual 会报错 RUN apk update \ && apk upgrade \ && apk add --no-cache bash python python-dev py-pip mysql-dev build-base libffi libffi-dev \ #&& python -m ensurepip \ #&& rm -rf /usr/lib/python*/ensurepip \ && pip --default-timeout=1000 install --upgrade pip setuptools \ robotframework \ robotframework-databaselibrary \ robotframework-requests \ robotframework-seleniumlibrary \ robotframework-yamllibrary \ robotframework-faker \ # PyMySQL \ && rm -rf /var/cache/apk/* \ && rm -rf ~/.cache/* \ ENV PYTHON_VERION 2.7.14 #CMD ["python"] 关于Dockerfile的内容,有几点需要注意: 以上安装的python版本是2.7.14,对于rf框架来说,这个版本是可以的,如果想安装3.x版本的python,清华大学的apk源中也提供了3.5.2版本,只需要把上面Dockerfile内容中所有的python改为 python3,把pip改成pip3就可以了; apk源中的Python版本 以上只安装了PySQL模块,如果是连接其他数据库,请自行修改内容; 为了方便的进入容器操作,额外为Alpine安装了bash; Dockerfile的内容非常灵活,可以根据自己实际需要,为dockerfile添加CMD和ENTRYPOINT命令,二者结合后可以更方便的执行pybot命令; 启动容器实例进行测试,如下: [root@JDu4e00u53f7 ~]# docker run --rm alpine-py27 python --version Python 2.7.14 [root@JDu4e00u53f7 ~]# docker run --rm -v /opt/docker/alpine-py/:/alpine-py alpine-py27 python /alpine-py/hello-world.py hello world 【To be continue...】

优秀的个人博客,低调大师

SpringCloud微服务框架搭建

一、微服务架构 1.1什么是分布式 不同模块部署在不同服务器上 作用:分布式解决网站高并发带来问题 1.2什么是集群 多台服务器部署相同应用构成一个集群 作用:通过负载均衡设备共同对外提供服务 1.3什么是RPC RPC 的全称是 Remote Procedure Call 是一种进程间通信方式。 它允许程序调用另一个地址空间(通常是共享网络的另一台机器上)的过程或函数,而不用程序员显式编码这个远程调用的细节。即无论是调用本地接口/服务的还是远程的接口/服务,本质上编写的调用代码基本相同。 比如两台服务器A,B,一个应用部署在A服务器上,想要调用B服务器上应用提供的函数或者方法,由于不在一个内存空间,不能直接调用,这时候需要通过就可以应用RPC框架的实现来解决 1.3.1restful、soap、rpc (1)RESTful是一种架构设计风格,提供了设计原则和约束条件,而不是架构。而满足这些约束条件和原则的应用程序或设计就是 RESTful架构或服务。 (2)SOAP,简单对象访问协议是一种数据交换协议规范, 是一种轻量的、简单的、基于XML的协议的规范。SOAP协议和HTTP协议一样,都是底层的通信协议,只是请求包的格式不同而已,SOAP包是XML格式的。 SOAP的消息是基于xml并封装成了符合http协议,因此,它符合任何路由器、 防火墙或代理服务器的要求。 soap可以使用任何语言来完成,只要发送正确的soap请求即可,基于soap的服务可以在任何平台无需修改即可正常使用。 (3)RPC就是从一台机器(客户端)上通过参数传递的方式调用另一台机器(服务器)上的一个函数或方法(可以统称为服务)并得到返回的结果。 RPC 会隐藏底层的通讯细节(不需要直接处理Socket通讯或Http通讯) RPC 是一个请求响应模型。客户端发起请求,服务器返回响应(类似于Http的工作方式) RPC 在使用形式上像调用本地函数(或方法)一样去调用远程的函数(或方法)。 1.3.2rpc远程调用框架 几种比较典型的RPC的实现和调用框架。 (1)RMI实现,利用java.rmi包实现,基于Java远程方法协议(Java Remote Method Protocol) 和java的原生序列化。 (2)Hessian,是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 基于HTTP协议,采用二进制编解码。 (3)thrift是一种可伸缩的跨语言服务的软件框架。thrift允许你定义一个描述文件,描述数据类型和服务接口。依据该文件,编译器方便地生成RPC客户端和服务器通信代码。 (4)SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。 1.4什么是SOA 业务系统分解为多个组件,让每个组件都独立提供离散,自治,可复用的服务能力 通过服务的组合和编排来实现上层的业务流程 作用:简化维护,降低整体风险,伸缩灵活 1.5什么是微服务 架构设计概念,各服务间隔离(分布式也是隔离),自治(分布式依赖整体组合)其它特性(单一职责,边界,异步通信,独立部署)是分布式概念的跟严格执行 SOA到微服务架构的演进过程 作用:各服务可独立应用,组合服务也可系统应用(巨石应用[monolith]的简化实现策略-平台思想) 1.6使用RPC http技术实现会员与订单系统通讯 二、微服务架构 三、SpringCloud SpringCloud 为开发人员提供了快速构建分布式系统的一些工具,包括配置管理、服务发现、断路器、路由、微代理、事件总线、全局锁、决策竞选、分布式会话等等。它运行环境简单,可以在开发人员的电脑上跑。 四、服务提供者与消费关系 服务提供者:提供服务被人调用 消费者:调用被人服务 五、服务的注册与发现(Eureka ) 在这里,我们需要用的的组件上Spring Cloud Netflix的Eureka ,eureka是一个服务注册和发现模块。 4.1 服务注册 4.1.1创建eurekaserver 项目 4.1.2引入maven依赖 以上都是概念。 image.png 以上是我的springcloud项目,eureka是注册中心,zuul是注册网关,ribbon和feign都是cloud的rpc远程调用。 zuul主要是用来配置网关 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <!--eureka server --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka-server</artifactId> </dependency> <!-- spring boot test --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> 4.3配置application.yml server: port: 8761 eureka: instance: hostname: localhost client: registerWithEureka: false fetchRegistry: false serviceUrl: defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ 4.4启动EurekaServer @SpringBootApplication @EnableEurekaServer public class EurekaServerApplication { public static void main(String[] args) { SpringApplication.run(EurekaServerApplication.class, args); } } 1.eureka.client.registerWithEureka=true #是否将自身注册 2.eureka.client.fetchRegistry=false #如果为true,启动时报警. 4.5打开eureka server 界面的 image.png 4.2 服务提供者 创建一个服务提供者 (eureka client),当client向server注册时,它会提供一些元数据,例如主机和端口,URL,主页等。Eureka server 从每个client实例接收心跳消息。 如果心跳超时,则通常将该实例从注册server中删除。 4.2.1 创建项目eurekaclient 4.2.2 引入maven依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath /> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> 4.2.3 application.yml配置 eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8762 spring: application: name: service-hi 4.2.4 发布服务 通过注解@EnableEurekaClient 表明自己是一个eurekaclient. @SpringBootApplication @EnableEurekaClient @RestController public class ServiceHiApplication { public static void main(String[] args) { SpringApplication.run(ServiceHiApplication.class, args); } @Value("${server.port}") String port; @RequestMapping("/hi") public String home(@RequestParam String name) { return "hi " + name + ",i am from port:" + port; } } 4.2.5演示效果 需要指明spring.application.name,这个很重要,这在以后的服务与服务之间相互调用一般都是根据这个name 。 启动工程,打开http://localhost:8761 ,即eureka server 的网址: image.png 你会发现一个服务已经注册在服务中了,服务名为SERVICE-HI ,端口为7862 这时打开 http://localhost:8762/hi?name=forezp ,你会在浏览器上看到 : hi forezp,i am from port:8762 一、 服务消费者(Feign) 什么是Feign Feign是一个声明式的伪Http客户端,它使得写Http客户端变得更简单。使用Feign,只需要创建一个接口并注解。 它具有可插拔的注解特性,可使用Feign 注解和JAX-RS注解。Feign支持可插拔的编码器和解码器。 Feign默认集成了Ribbon,并和Eureka结合,默认实现了负载均衡的效果。 简而言之: Feign 采用的是基于接口的注解 Feign 整合了ribbon 准备工作 继续用上一节的工程, 启动eureka-server,端口为8761; 启动service-hi 两次,端口分别为8762 、8773. 准备工创建一个feign的服务 新建一个spring-boot工程,取名为serice-feign,在它的pom文件引入Feign的起步依赖spring-cloud-starter-feign、Eureka的起步依赖 spring-cloud-starter-eureka、Web的起步依赖spring-boot-starter-web,代码如下: <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.2.RELEASE</version> <relativePath/> <!-- lookup parent from repository --> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-eureka</artifactId> </dependency> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-feign</artifactId> </dependency> <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> </dependencies> <dependencyManagement> <dependencies> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-dependencies</artifactId> <version>Dalston.RC1</version> <type>pom</type> <scope>import</scope> </dependency> </dependencies> </dependencyManagement> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> <repositories> <repository> <id>spring-milestones</id> <name>Spring Milestones</name> <url>https://repo.spring.io/milestone</url> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories> application.yml配置 在工程的配置文件application.yml文件,指定程序名为service-feign,端口号为8765,服务注册地址为http://localhost:8761/eureka/ ,代码如下: eureka: client: serviceUrl: defaultZone: http://localhost:8761/eureka/ server: port: 8765 spring: application: name: service-feign 定义一个feign接口 @FeignClient(value = "service-hi") public interface SchedualServiceHi { @RequestMapping(value = "/hi", method = RequestMethod.GET) String sayHiFromClientOne(@RequestParam(value = "name") String name); } 一个”/hi”的API接口 @RestController public class HiController { @Autowired SchedualServiceHi schedualServiceHi; @RequestMapping(value = "/hi",method = RequestMethod.GET) public String sayHi(@RequestParam String name){ return schedualServiceHi.sayHiFromClientOne(name); } } 启动方式 @SpringBootApplication @EnableDiscoveryClient @EnableFeignClients public class SericeFeign { public static void main(String[] args) { SpringApplication.run(SericeFeign.class, args); } } 演示效果 启动程序,多次访问http://localhost:8765/hi?name=forezp(http://localhost:8765/hi?name=forezp),浏览器交替显示: hi forezp,i am from port:8762 hi forezp,i am from port:8763 Hystrix断路器 在微服务架构中,根据业务来拆分成一个个的服务,服务与服务之间可以相互调用(RPC),在Spring Cloud可以用RestTemplate+Ribbon和Feign来调用。为了保证其高可用,单个服务通常会集群部署。由于网络原因或者自身的原因,服务并不能保证100%可用,如果单个服务出现问题,调用这个服务就会出现线程阻塞,此时若有大量的请求涌入,Servlet容器的线程资源会被消耗完毕,导致服务瘫痪。服务与服务之间的依赖性,故障会传播,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩”效应。 为了解决这个问题,业界提出了断路器模型。 7.1 什么是Hystrix Netflix开源了Hystrix组件,实现了断路器模式,SpringCloud对这一组件进行了整合。 在微服务架构中,一个请求需要调用多个服务是非常常见的,如下图: image.png 较底层的服务如果出现故障,会导致连锁故障。当对特定的服务的调用的不可用达到一个阀值(Hystric 是5秒20次) 断路器将会被打开。 image.png 断路打开后,可用避免连锁故障,fallback方法可以直接返回一个固定值。 准备工作 这篇文章基于上一篇文章的工程,首先启动上一篇文章的工程,启动eureka-server 工程;启动service-hi工程,它的端口为8762。 在ribbon使用断路器 改造serice-ribbon 工程的代码,首先在pox.xml文件中加入spring-cloud-starter-hystrix的起步依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-hystrix</artifactId> </dependency> 改造service 改造HelloService类,在hiService方法上加上@HystrixCommand注解。该注解对该方法创建了熔断器的功能,并指定了fallbackMethod熔断方法,熔断方法直接返回了一个字符串,字符串为”hi,”+name+”,sorry,error!”,代码如下: @Service public class HelloService { @Autowired RestTemplate restTemplate; @HystrixCommand(fallbackMethod = "hiError") public String hiService(String name) { return restTemplate.getForObject("http://SERVICE-HI/hi?name=" + name, String.class); } public String hiError(String name) { return "hi," + name + ",sorry,error!"; } } 在启动类上加入 @SpringBootApplication @EnableEurekaClient @EnableHystrix //断路器 public class App { public static void main(String[] args) { SpringApplication.run(App.class, args); } @Bean @LoadBalanced RestTemplate restTemplate() { return new RestTemplate(); } } 演示效果 image.png

优秀的个人博客,低调大师

Centos7搭建Confluence

Confluence破解版 应用环境: Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。通过它可以实现团队成员之间的协作和知识共享. 系统及安装软件 centos7.2 java-1.8 mariadb atlassian-confluence-5.10.4.tar.gz 安装JAVA yum -y install java-1.8* 测试java安装:java -version 安装mariadb数据库 启动数据库 systemctl start mariadb systemctl enable mariadb 修改配置文件,支持字符集 [client] port = 3306 socket = /var/lib/mysql/mysql.sock default-character-set=utf8 [mysqld] character-set-server=utf8 max_allowed_packet = 48M 创建数据库用户 设置root用户密码 grant all privileges on *.* to 'root'@'localhost' identified by 'withub'; grant all privileges on *.* to 'root'@'%' identified by 'withub'; 创建Confluence数据库和用户 create database ConfluenceDB default character set utf8 collate utf8_bin; grant all privileges on ConfluenceDB.* to 'confluence_user'@'localhost' identified by 'withub'; grant all privileges on ConfluenceDB.* to 'confluence_user'@'%' identified by 'withub'; flush privileges; 安装Confluence 首先下载atlassian-confluence-5.10.4.tar.gz安装包,上传至linux服务器上,我这儿上传的/opt目录 2、解压并修改配置文件 tar -zxvf atlassian-confluence-5.10.4.tar.gz cd /opt/atlassian-confluence-5.10.4/confluence/WEB-INF/classes 修改配置文件: vi confluence-init.properties confluence.home=/opt/data/conf/confluence :wq 保存退出! 启动Confluence cd /opt mv atlassian-confluence-5.10.4 atlassian-confluence cd /opt/atlassian-confluence/bin ./startup.sh #启动confluence tailf ../logs/catalina.out #查看启动过程 打开浏览器输入http://IP:8090/ 我们选择生产安装,下一步: 暂时不勾选,下一步: 记住服务ID,然后暂时关闭程序。 关闭Confluence cd /opt/atlassian-confluence/bin ./shutdown.sh或者pkill java #停止confluence 然后cd /opt/atlassian-confluence/confluence/WEB-INF/lib目录下 ls | grep atlassian-extras-decoder-v2-3.2.jar 将atlassian-extras-decoder-v2-3.2.jar放到windows平台上,改名为atlassian-extras-2.4.jar mv atlassian-extras-decoder-v2-3.2.jar atlassian-extras-decoder-v2-3.2.jar.bak 破解Confluence软件 下载破解软件confluence5.6.6-crack,进入windows平台 运行confluence_keygen.jar,有可能运行不了,因为windows平台上需要安装JAVA才能打开 点击.gen!生产key值,复制key保留。 将破解后的atlassian-extras-2.4.jar改为atlassian-extras-decoder-v2-3.2.jar放到linux上/opt/atlassian-confluence/confluence/WEB-INF/lib目录下 将下载的破解文件中的jar目录下的Confluence-5.6.6-language-pack-zh_CN.jar和mysql-connector-java-5.1.39-bin.jar两个文件放入到/opt/atlassian-confluence/confluence/WEB-INF/lib目录下 重新启动Confluence cd /opt/atlassian-confluence/bin ./startup.sh #启动confluence tailf ../logs/catalina.out #查看启动过程 再次浏览器访问http://IP:8090/ 将生成的key复制到框内,下一步 选择Mysql,然后点击External Database 选择Direct JDBC,下一步 点击下一步,自动创建需要的表,可能需要两分钟时间 配置用户 配置用户和密码 下一步 安装完成! 完成安装之后,进入浏览器会看到有黄色警告之类的报错! 问题解决: 报错innodb_log_file_size大小设置问题 解决: 1、Shutdown Confluence 2、Shutdown MySQL 3、Edit the my.cnf: vim /etc/my.cnf(添加配置文件) max_allowed_packet = 512M innodb_log_file_size = 2G 4、Delete the current innodb log files. cd /var/lib/mysql/(yum安装的mysql都在这个目录下) rm -rf ib_logfile* 5、Start MySQL. 6、Start Confluence. 即可! 报错:Checks if your JDK / JRE version and vendor are supported. 解决: atlassian-confluence-5.10.4.tar.gz搭配jdk1.8版本:jdk-8u152-linux-x64.tar.gz 即可!! 欢迎提出问题!!! Just Do It

优秀的个人博客,低调大师

Go语言_eclipse环境搭建

1 下载eclipse 2 下载goeclipse http://code.google.com/p/goclipse/wiki/InstallationInstructions 3 下载GoCode https://github.com/nsf/gocode 下载源码到Gopath路径下 Go build 可以到父目录上生成了gocode.exe 4 下载MinGW http://sourceforge.net/projects/mingw/files/MinGW/ 并按照要求安装 5 设置Go环境 设置go环境变量 Windows->Reference-> Go 设置gocode环境变量 Windows->Reference-> Go->Gocode 设置gocode path为之前生成的exe文件 设置GDB路径 下面就可以进行单点调试和运行了 本文转自轩脉刃博客园博客,原文链接:http://www.cnblogs.com/yjf512/archive/2012/06/19/2555248.html,如需转载请自行联系原作者

优秀的个人博客,低调大师

CentOS搭建自己的SS

服务器:Vultr官网链接 基本步骤: 注册账号 添加信用卡或paypel充值(注意:如果网页自动翻译,可能看不到paypel充值页面,选择重新载入然后拒绝翻译就好) 选择服务器主机,购买。我买的时候最低配置的2.5美元的已经没有了,据说这个就够了,我用的5美元版本 -选择服务器机房地址 -选择套餐(实际上是按照时间计费的) -然后点击右下角的”Deploy Now”就好 服务器系统:Cent 6 x64(尽量不要选择7以上版本哦) 然后开始部署啦! SSH连接服务器 ssh root@ip地址 密码是系统给的密码哦,如果需要,可以重置。会方便许多。 passwd - 开始部署SS,代码如下 yum -y install wget wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev.sh chmod +x shadowsocks-libev.sh ./shadowsocks-libev.sh 2>&1 | tee shadowsocks-libev.log 卸载命令:./shadowsocks-libev.sh uninstall 注意中途要输入密码和端口哦~成功后如下: 记得重启哦~ 重启命令行 reboot 部署加速 yum -y install wget wget --no-check-certificate https://github.com/teddysun/across/raw/master/bbr.sh chmod +x bbr.sh ./bbr.sh 成功后如下: 参考:https://github.com/Alvin9999/new-pac/wiki/%E8%87%AA%E5%BB%BAss%E6%9C%8D%E5%8A%A1%E5%99%A8%E6%95%99%E7%A8%8B

优秀的个人博客,低调大师

hadoop2.7.2 HA搭建

配置文件 1.core配置: [qujian@master hadoop]$ vim core-site.xml <property> <name>fs.defaultFS</name> <value>hdfs://mycluster</value> </property> <property> <name>io.file.buffer.size</name> <value>4096</value> </property> <property> <name>hadoop.tmp.dir</name> <value>file:/home/qujian/hadoop-2.7.2/tmp</value> </property> <property> <name>ha.zookeeper.quorum</name> <value>master.hadoop.cn:2181,second1.hadoop.cn:2181,second2.hadoop.cn:2181</value> </property> <property> <name>ha.zookeeper.session-timeout.ms</name> <value>1000</value> </property> 修改mapred-site.xml <property> <name>mapreduce.framework.name</name> <value>yarn</value> </property> 修改yarn-site.xml <property> <name>yarn.nodemanager.aux-services</name> <value>mapreduce_shuffle</value> </property> <property> <name>yarn.nodemanager.aux-services.mapreduce_shuffle.class</name> <value>org.apache.hadoop.mapred.ShuffleHandler</value> </property> <property> <name>yarn.resourcemanager.address</name> <value>master.hadoop.cn:8032</value> </property> <property> <name>yarn.resourcemanager.scheduler.address</name> <value>master.hadoop.cn:8030</value> </property> <property> <name>yarn.resourcemanager.resource-tracker.address</name> <value>master.hadoop.cn:8031</value> </property> <property> <name>yarn.resourcemanager.admin.address</name> <value>master.hadoop.cn:8033</value> </property> <property> <name>yarn.resourcemanager.webapp.address</name> <value>master.hadoop.cn:8088</value> </property> 修改hdfs-site.xml <property> <name>dfs.namenode.name.dir</name> <value>file:/home/qujian/hadoop-2.7.2/name</value> </property> <property> <name>dfs.datanode.data.dir</name> <value>file:/home/qujian/hadoop-2.7.2/data</value> </property> <property> <name>dfs.replication</name> <value>3</value> </property> <property> <name>dfs.webhdfs.enabled</name> <value>true</value> </property> <property> <name>dfs.permissions.enabled</name> <value>false</value> </property> <property> <name>dfs.nameservices</name> <value>mycluster</value> </property> <property> <name>dfs.ha.namenodes.mycluster</name> <value>nn1,nn2</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn1</name> <value>master.hadoop.cn:9000</value> </property> <property> <name>dfs.namenode.rpc-address.mycluster.nn2</name> <value>second1.hadoop.cn:9000</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn1</name> <value>master.hadoop.cn:53310</value> </property> <property> <name>dfs.namenode.servicerpc-address.mycluster.nn2</name> <value>second1.hadoop.cn:53310</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn1</name> <value>master.hadoop.cn:50070</value> </property> <property> <name>dfs.namenode.http-address.mycluster.nn2</name> <value>second1.hadoop.cn:50070</value> </property> <property> <name>dfs.namenode.shared.edits.dir</name> <value>qjournal://second2.hadoop.cn:8485;data1.hadoop.cn:8485;data2.hadoop.cn:8485/mycluster</value> </property> <property> <name>dfs.client.failover.proxy.provider.mycluster</name> <value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value> </property> <property> <name>dfs.ha.fencing.methods</name> <value>sshfence</value> </property> <property> <name>dfs.ha.fencing.ssh.private-key-files</name> <value>/home/qujian/.ssh/id_rsa</value> </property> <property> <name>dfs.ha.fencing.ssh.connect-timeout</name> <value>30000</value> </property> <property> <name>dfs.journalnode.edits.dir</name> <value>/home/qujian/hadoop-2.7.2/journal</value> </property> <property> <name>dfs.ha.automatic-failover.enabled</name> <value>true</value> </property> <property> <name>ha.failover-controller.cli-check.rpc-timeout.ms</name> <value>60000</value> </property> <property> <name>ipc.client.connect-timeout</name> <value>60000</value> </property> <property> <name>dfs.image.transfer.bandwidthPerSec</name> <value>4194304</value> </property> 配置data服务器: [qujian@master hadoop]$ cat slaves second2.hadoop.cn data1.hadoop.cn data2.hadoop.cn for n in second1.hadoop.cn second2.hadoop.cn data1.hadoop.cn data2.hadoop.cn do scp -rp /home/qujian/hadoop-2.7.2 $n:~/ wait done 本文转自 zhuxtqw 51CTO博客,原文链接:http://blog.51cto.com/1054054/1748114,如需转载请自行联系原作者

优秀的个人博客,低调大师

Docker私库搭建和使用

环境介绍: 操作系统:Centos6.5 软件:Docker1.7.1 服务器端:192.168.1.10 客户端:192.168.1.20 启动服务器端docker服务 由于服务器在推送镜像到私库时需要进行ca认证,这里使用--insecure-registry来忽略认证 docker -d --insecure-registry 192.168.1.10:5000 & 在服务器端拉取官方registry镜像 docker pull registry 从官方拉取基础镜像 docker pull centos 给镜像一个新标签 docker tag centos 192.168.1.10:5000/centos 启动容器 docker run -d --nameregistry -p 5000:5000 -v /opt/registry:/var/lib/registry registry 查看私库是否已经启动 docker ps -a 推送基础镜像到私库中 docker push192.168.1.10:5000/centos 用客户端连接私库 --启动客户端docker服务 由于客户端在连接私库时要求使用ca进行验证,与服务器端启动同理 docker -d --insecure-registry 192.168.1.10:5000 & 拉取官方镜像 docker pull nginx 给镜像一个新标签 docker tag centos 192.168.1.10:5000/nginx 推送镜像到私库中 dockerpush192.168.1.10:5000/nginx 从私库中拉取镜像 docker pull192.168.1.10:5000/centos 查看客户端所有镜像 docker images 查看私库中存在的镜像 curlhttp://192.168.1.10:5000/v2/_catalog 本文出自 “linux运维技术” 博客,请务必保留此出处http://forall.blog.51cto.com/12356505/1924394

资源下载

更多资源
优质分享App

优质分享App

近一个月的开发和优化,本站点的第一个app全新上线。该app采用极致压缩,本体才4.36MB。系统里面做了大量数据访问、缓存优化。方便用户在手机上查看文章。后续会推出HarmonyOS的适配版本。

Oracle

Oracle

Oracle Database,又名Oracle RDBMS,或简称Oracle。是甲骨文公司的一款关系数据库管理系统。它是在数据库领域一直处于领先地位的产品。可以说Oracle数据库系统是目前世界上流行的关系数据库管理系统,系统可移植性好、使用方便、功能强,适用于各类大、中、小、微机环境。它是一种高效率、可靠性好的、适应高吞吐量的数据库方案。

Eclipse

Eclipse

Eclipse 是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse 附带了一个标准的插件集,包括Java开发工具(Java Development Kit,JDK)。

JDK

JDK

JDK是 Java 语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序。JDK是整个java开发的核心,它包含了JAVA的运行环境(JVM+Java系统类库)和JAVA工具。