首页 文章 精选 留言 我的

精选列表

搜索[快速入门],共10000篇文章
优秀的个人博客,低调大师

dubbo 入门

1 介绍 1.1 背景 随着互联网的发展,网站应用的规模不断扩大,常规的垂直应用架构已无法应对,分布式服务架构以及流动计算架构势在必行,亟需一个治理系统确保架构有条不紊的演进。 1.2 说明 DUBBO是一个分布式服务框架,致力于提供高性能和透明化的RPC远程服务调用方案,是阿里巴巴SOA服务化治理方案的核心框架。 1.3 功能 启动时检查、集群容错、负载均衡、线程模型、直连提供者、只订阅、只注册、静态服务、多协议、多注册中心、服务分组、多版本、分组聚合、参数验证、结果缓存、泛化引用、泛化实现、回声测试、上下文信息、隐式传参、异步调用、本地调用、参数回调、事件通知、本地存根、本地伪装、延迟暴露、并发控制、连接控制、延迟连接、粘滞连接、令牌验证、路由规则、配置规则、服务降级、优雅停机、主机绑定、日志适配、访问日志、服务容器、Reference Config缓存、分布式事务 1.4 支持的协议 dubbo rmi http webservice thrift memcached redis 2 环境准备 Java7、Java8 ZooKeeper Maven Tomcat7 Eclipse 3 架构图 节点角色说明及对应demo模块: Provider: 暴露服务的服务提供方。对应dubbo-demo-provider。 Consumer: 调用远程服务的服务消费方。对应dubbo-demo-consumer Registry: 服务注册与发现的注册中心。这个demo使用ZooKeeper,关于ZooKeeper的搭建可参考这篇文章。 Monitor: 统计服务的调用次调和调用时间的监控中心。需要搭建dubbo-admin,对应的war包可从这里下载,也可自行编译运行。 Container: 服务运行容器。使用Tomcat跟Jetty。 我的demo代码:https://github.com/JasperZXY/dubbo-demo 4 开始搭建项目 4.1 说明 下面的代码是在Java8下运行通过的。 4.2 创建maven项目 名称为dubbo-demo,加入需要的jar,这里把各个项目需要的jar包都放入了父pom中,实际项目最好做好分类,如下 <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <junit.version>4.12</junit.version> <spring.version>4.3.8.RELEASE</spring.version> <dubbo.version>2.5.3</dubbo.version> <zookeeper.version>3.4.10</zookeeper.version> <zkclient.version>0.10</zkclient.version> <jackson.version>2.7.4</jackson.version></properties><dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>${junit.version}</version> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>${spring.version}</version> </dependency> <!--SpringMVC集成slf4j-logback--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.1.3</version> </dependency> <dependency> <groupId>org.logback-extensions</groupId> <artifactId>logback-ext-spring</artifactId> <version>0.1.2</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>jcl-over-slf4j</artifactId> <version>1.7.12</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>dubbo</artifactId> <version>${dubbo.version}</version> <exclusions> <exclusion> <!--排除传递spring依赖,防止冲突--> <artifactId>spring</artifactId> <groupId>org.springframework</groupId> </exclusion> </exclusions> </dependency> <!--导入zookeeper依赖--> <dependency> <groupId>org.apache.zookeeper</groupId> <artifactId>zookeeper</artifactId> <version>${zookeeper.version}</version> </dependency> <dependency> <groupId>com.github.sgroschupf</groupId> <artifactId>zkclient</artifactId> <version>0.1</version> </dependency> <dependency> <groupId>org.jboss.netty</groupId> <artifactId>netty</artifactId> <version>3.2.10.Final</version> </dependency> <dependency> <groupId>com.101tec</groupId> <artifactId>zkclient</artifactId> <version>${zkclient.version}</version> </dependency> <!--jackson--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-core</artifactId> <version>${jackson.version}</version> </dependency> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-annotations</artifactId> <version>${jackson.version}</version> </dependency></dependencies> 4.3 dubbo-demo-api 这个模块用于定义接口以及交互的实体对象,创建一个User跟UserService publicclassUserimplementsjava.io.Serializable{privatestaticfinallongserialVersionUID=-2218791253527448503L;privateLongid;privateStringusername;privateStringpassword;privateIntegerage;//这里省略了getset方法 @Override publicStringtoString(){return"User[id="+id+",username="+username+",password="+password+",age="+age+"]"; } } publicinterfaceUserService{publicList<User>queryAll(); } 4.4 dubbo-demo-provider 这个模块用于提供服务,是使用main方法直接运行的。 1、需要添加dubbo-demo-api这个依赖,pom.xml如下 <dependency> <groupId>zxy.demo</groupId> <artifactId>dubbo-demo-api</artifactId> <version>${project.parent.version}</version></dependency> 2、UserService的实现 publicclassUserServiceImplimplementsUserService{/***这里通过模拟查询数据库返回用户信息*/ @Override publicList<User>queryAll(){ List<User>list=newArrayList<User>();for(inti=0;i<3;i++){ Randomrandom=newRandom(); Useruser=newUser(); user.setAge(random.nextInt(10)+18); user.setId(Long.valueOf(i+1)); user.setPassword("123456"); user.setUsername("name_"+i); list.add(user); }returnlist; } } 3、Spring配置 <beansxmlns="http://www.springframework.org/schema/beans"xmlns:context="http://www.springframework.org/schema/context"xmlns:p="http://www.springframework.org/schema/p"xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-4.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.0.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.0.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.0.xsdhttp://code.alibabatech.com/schema/dubbohttp://code.alibabatech.com/schema/dubbo/dubbo.xsd"> <!--提供方应用信息,用于计算依赖关系--> <dubbo:applicationname="dubbo-demo-provider"/> <!--这里使用的注册中心是zookeeper--> <dubbo:registryaddress="zookeeper://127.0.0.1:2181"client="zkclient"/> <!--用dubbo协议在20880端口暴露服务--> <dubbo:protocolname="dubbo"port="20880"/> <!--将该接口暴露到dubbo中--> <dubbo:serviceinterface="zxy.demo.dubbo.api.service.UserService"ref="userServiceImpl"/> <!--将具体的实现类加入到Spring容器中--> <beanid="userServiceImpl"class="zxy.demo.dubbo.provider.service.UserServiceImpl"/></beans> 注:如果<dubbo:标签有报错的,可下载一个dubbo.xsd文件(可从我的git上找到),在Eclipse上windows->preferrence->XML->XML Catalog->add->catalog entry->file system,选择刚刚下载的文件路径,修改key值(dubbo.xsd),保存。在xml文件右键validate即可解决。 4、编写启动方法 ublicclassApplication{@SuppressWarnings("resource")publicstaticvoidmain(String[]args)throwsException{ (newClassPathXmlApplicationContext(newString[]{"spring/provider.xml"})).start();//保持main方法不退出 CountDownLatchlatch=newCountDownLatch(1); latch.await(); } } 4.5 dubbo-demo-consumer 这个模块用于调用dubbo-demo-provider提供的服务,使用SpringMVC进行运行。 1、需要添加dubbo-demo-api这个依赖,pom.xml如下 <dependency> <groupId>zxy.demo</groupId> <artifactId>dubbo-demo-api</artifactId> <version>${project.parent.version}</version></dependency> 2、Spring的配置 appContext.xml,主配置文件 <context:component-scanbase-package="zxy.demo.dubbo.consumer"></context:component-scan><importresource="classpath*:spring/dubbo-*.xml"/><importresource="classpath*:spring/springmvc-servlet.xml"/> springmvc-servlet.xml <!--添加注解驱动--><mvc:annotation-driven/><!--返回json支持--><beanid="jsonConverter"class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"> <propertyname="supportedMediaTypes"> <list> <value>text/html;charset=UTF-8</value> </list> </property></bean> dubbo-consumer.xml <!--提供方应用信息,用于计算依赖关系--><dubbo:applicationname="dubbo-demo-consumer"/><!--这里使用的注册中心是zookeeper--><dubbo:registryaddress="zookeeper://127.0.0.1:2181"client="zkclient"/><!--从注册中心中查找服务--><dubbo:referenceid="userService"interface="zxy.demo.dubbo.api.service.UserService"/> 3、web.xml <?xmlversion="1.0"encoding="UTF-8"?><web-appversion="3.0"xmlns="http://java.sun.com/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring/appContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>ch.qos.logback.ext.spring.web.LogbackConfigListener</listener-class> </listener> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value></param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app> 4、controller 调用远程服务并返回前端数据。 @Controller@RequestMapping("/user")publicclassUserController{@Autowired privateUserServiceuserService; @RequestMapping("/list")@ResponseBody publicObjectlistAll(){returnuserService.queryAll(); } } 4.6 运行 先启动ZooKeeper 启动dubbo-demo-provider 启动dubbo-demo-consumer,mvn jetty:run -Djetty.port=8083 访问http://127.0.0.1:8083/user/list获取数据 5 监控 自行编译运行dubbo-admin或从我的git上下载dubbo-admin-2.5.3.war,放入tomcat中运行。默认用的注册中心是zookeeper://127.0.0.1:2181,可修改,在WEB-INF/dubbo.properties中进行修改。 启动后访问http://127.0.0.1:8080/dubbo-admin-2.5.3,如果war包是改名为ROOT.war后运行的,则访问http://127.0.0.1:8080/,输入账号密码(root/root)。 注意,由于现在很多机器都安装了高版本的Java8,运行这个dubbo-admin将导致出错,报错信息为“Bean property 'URIType' is not writable or has an invalid setter method”,详见官方的issues。我自己的解决方法是下载一个低版本的Java,修改tomcat对应的Java版本,找到setclasspath.bat中的set _RUNJAVA,set _RUNJDB这两行,修改如下: set_RUNJAVA="C:\ProgramFiles\Java\jdk1.7.0_80\bin\java.exe"set_RUNJDB="C:\ProgramFiles\Java\jdk1.7.0_80\bin\jdb.exe" 本文转自帅气的头头博客51CTO博客,原文链接http://blog.51cto.com/12902932/1925692如需转载请自行联系原作者 sshpp

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

elasticsearch入门

elasticsearch 本文基于elasticsearch-6.4.2版本 安装 1、安装JDK略2、安装es wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-6.4.2.tar.gz; tar -zxvf elasticsearch-6.4.2.tar.gz; mv elasticsearch-6.4.2 /usr/local; #创建用户elasticsearch 有elasticsearch 不能使用root账户运行,必须先创建用户 useradd elasticsearch; chown -R elasticsearch:elasticsearch /usr/local/elasticsearch-6.4.2/ ; #启动运行 su elasticsearch cd /usr/local/elasticsearch-6.4.2; sh ./bin/elasticsearch; 启动成功后,如下所示 3、安装head_plugin插件elasticsearch-6.x版本不支持使用elasticsearch-plugin install mobz/elasticsearch-head的方式安装。官方支持的plugin安装的方式的插件为 #安装head_plugin插件 wget https://github.com/mobz/elasticsearch-head/archive/master.zip yum install -y unzip; unzip master.zip; mv elasticsearch-head-master/ /usr/local/ #安装node wget https://npm.taobao.org/mirrors/node/v10.11.0/node-v10.11.0-linux-x64.tar.gz tar -zxvf node-v10.11.0-linux-x64.tar.gz mv node-v10.11.0-linux-x64 /usr/local/ vi /etc/profile #set node NODE_HOME=/usr/local/node-v10.11.0-linux-x64 export PATH=$PATH:$NODE_HOME/bin export NODE_PATH=$NODE_HOME/lib/node_modules "/etc/profile" 89L, 2079C written [root@k8s-master-101 ~]# source /etc/profile [root@k8s-master-101 ~]# node -v v10.11.0 #elasticsearch配置文件中授权 node.name: node-rcl-1 cluster.name: my-application-rcl network.host: 192.168.31.101 http.cors.enabled: true http.cors.allow-origin: "*" 启动过程中的几个问题: 1.max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536] 2.max number of threads [1024] for user [lishang] likely too low, increase to at least [4096] 3.max virtual memory areas vm.max_map_count [65530] likely too low, increase to at least [262144] 分别修改 vi /etc/security/limits.conf elasticsearch hard nofile 65536 elasticsearch sorf nofile 65536 vi /etc/security/limits.d/20-nproc.conf * soft nproc 4096 * hard nproc 4096 elasticsearch soft nproc 4096 elasticsearch hard nproc 4096 #需要重启操作系统生效,使用ulimit -a 查看线程限制数 vi /etc/sysctl.conf vm.max_map_count=262144 4、启动ES、head-plugin #启动es cd /usr/local/elasticsearch-6.4.2 ./bin/elasticsearch -d #启动head-plugin cd /usr/local/elasticsearch-head-master npm run start 5、访问 ES的基本概念 群集 集群是一个或多个节点(服务器)的集合,它们共同保存您的整个数据,并提供跨所有节点的联合索引和搜索功能。群集由唯一名称标识,默认情况下为“elasticsearch”。此名称很重要,因为如果节点设置为按名称加入群集,则该节点只能是群集的一部分。 确保不要在不同的环境中重用相同的群集名称,否则最终会导致节点加入错误的群集。例如,您可以使用logging-dev,logging-stage以及logging-prod 用于开发,登台和生产集群。 请注意,如果群集中只有一个节点,那么它是完全正常的。此外,您还可以拥有多个独立的集群,每个集群都有自己唯一的集群名称。 节点 节点是作为群集一部分的单个服务器,存储数据并参与群集的索引和搜索功能。就像集群一样,节点由名称标识,默认情况下,该名称是在启动时分配给节点的随机通用唯一标识符(UUID)。如果不需要默认值,可以定义所需的任何节点名称。此名称对于管理目的非常重要,您可以在其中识别网络中哪些服务器与Elasticsearch集群中的哪些节点相对应。 可以将节点配置为按群集名称加入特定群集。默认情况下,每个节点都设置为加入一个名为cluster的集群elasticsearch,这意味着如果您在网络上启动了许多节点并且假设它们可以相互发现 - 它们将自动形成并加入一个名为的集群elasticsearch。 在单个群集中,您可以拥有任意数量的节点。此外,如果您的网络上当前没有其他Elasticsearch节点正在运行,则默认情况下启动单个节点将形成一个名为的新单节点集群elasticsearch。 索引 索引是具有某些类似特征的文档集合。例如,您可以拥有客户数据的索引,产品目录的另一个索引以及订单数据的另一个索引。索引由名称标识(必须全部小写),此名称用于在对其中的文档执行索引,搜索,更新和删除操作时引用索引。 在单个群集中,您可以根据需要定义任意数量的索引。 文档 文档是可以编制索引的基本信息单元。例如,您可以为单个客户提供文档,为单个产品提供另一个文档,为单个订单提供另一个文档。该文档以JSON(JavaScript Object Notation)表示,JSON是一种普遍存在的互联网数据交换格式。 在索引/类型中,您可以根据需要存储任意数量的文档。请注意,尽管文档实际上驻留在索引中,但实际上必须将文档编入索引/分配给索引中的类型。 碎片和副本 索引可能存储大量可能超过单个节点的硬件限制的数据。例如,占用1TB磁盘空间的十亿个文档的单个索引可能不适合单个节点的磁盘,或者可能太慢而无法单独从单个节点提供搜索请求。 为了解决这个问题,Elasticsearch提供了将索引细分为多个称为分片的功能。创建索引时,只需定义所需的分片数即可。每个分片本身都是一个功能齐全且独立的“索引”,可以托管在集群中的任何节点上。 分片很重要,主要有两个原因: 它允许您水平拆分/缩放内容量它允许您跨分片(可能在多个节点上)分布和并行化操作,从而提高性能/吞吐量分片的分布方式以及如何将其文档聚合回搜索请求的机制完全由Elasticsearch管理,对用户而言是透明的。 在可以随时发生故障的网络/云环境中,非常有用,强烈建议使用故障转移机制,以防分片/节点以某种方式脱机或因任何原因消失。为此,Elasticsearch允许您将索引的分片的一个或多个副本制作成所谓的副本分片或简称副本。 复制很重要,主要有两个原因: 它在碎片/节点发生故障时提供高可用性。因此,请务必注意,副本分片永远不会在与从中复制的原始/主分片相同的节点上分配。它允许您扩展搜索量/吞吐量,因为可以在所有副本上并行执行搜索。总而言之,每个索引可以拆分为多个分片。索引也可以复制为零(表示没有副本)或更多次。复制后,每个索引都将具有主分片(从中复制的原始分片)和副本分片(主分片的副本)。 可以在创建索引时为每个索引定义分片和副本的数量。创建索引后,您还可以随时动态更改副本数。您可以使用_shrink和_splitAPI 更改现有索引的分片数,但这不是一项简单的任务,并且预先计划正确数量的分片是最佳方法。 默认情况下,Elasticsearch中的每个索引都分配了5个主分片和1个副本,这意味着如果群集中至少有两个节点,则索引将包含5个主分片和另外5个副本分片(1个完整副本),总计为每个索引10个分片。 注意每个Elasticsearch分片都是Lucene索引。单个Lucene索引中可以包含最大数量的文档。截止LUCENE-5843,限制是2,147,483,519(= Integer.MAX_VALUE - 128)文档。您可以使用_cat/shardsAPI 监控分片大小。 参考:https://www.elastic.co/guide/en/elasticsearch/reference/current/_basic_concepts.html 索引管理 1、创建索引 PUT /index_name/ #参数配置 "settings": { "index": { "number_of_shards": "5", "number_of_replicas": "1" } } #number_of_shards为主分片数,默认为5;number_of_replicas为主分片对应的副本数,默认为1 2、mapping管理创建索引myindex4,并添加类型log、添加字段year(字段类型为整形) 向已经存在的索引myindex3添加类型log、字段year(字段类型为整形) 2、删除索引 DELETE /my_index DELETE /index_one,index_two DELETE /index_* DELETE /_all #禁止使用_all或者通配符*进行索引删除 action.destructive_requires_name: true 别名不能用于删除索引? 3、获取索引 GET /{myindex}/ 4、打开、关闭索引 POST /{indexname}/_open POST /{indexname}/_close #settingscluster.indices.close.enable: false 默认为开启 5、索引别名a、索引别名不能重复,也不能与索引名重复b、可以对一个或者多个索引指定一个别名(多个索引可以对应一个别名);一个索引也可以添加多个别名c、别名不能更新,只能删除后重建 GET /{myindex}/_alias/{alias} GET /{myindex}/_alias/{*} #添加索引 PUT /{myindex}/_alias/{myindexalias} #删除索引 DELETE /{myindex}/_alias/{alias} POST /_aliases/ { "actions": [ { "add": { "index": "myindex", "alias": "myindexalias" } }, { "add": { "index": "myindex", "alias": "myindexalias2" } }, { "add": { "index": "myindex2", "alias": "myindexalias" } }, { "remove": { "index": "myindex", "alias": "myindexalias" } } ] } 过滤索引别名 /* "filter": {"term": {"year": 2018}} #路由 "routing": "" 或者分开设置索引路由和查询路由 "index_routing": "2", "search_routing": "1,2" */ 6、获取、更新索引配置 GET /{index}/_settings/ #{index}的形式可以是:_all | *、xxx* | xxx,xxx,... 的形式 /**可以更新副本数量和添加分词(必须先关闭、添加、在打开索引)**/ PUT /{index}/_settings/ {"index": {"number_of_replicas": 4}} {"analysis":{"analyzer":{"content":{"type":"custom","tokenizer":"whitespace"}}}} 2、elastic操作2.1、集群状态监控 集群状态监控api如下所示 [root@localhost ~]# curl localhost:9200/_cat/ =^.^= /_cat/allocation /_cat/shards /_cat/shards/{index} /_cat/master /_cat/nodes /_cat/tasks /_cat/indices /_cat/indices/{index} /_cat/segments /_cat/segments/{index} /_cat/count /_cat/count/{index} /_cat/recovery /_cat/recovery/{index} /_cat/health /_cat/pending_tasks /_cat/aliases /_cat/aliases/{alias} /_cat/thread_pool /_cat/thread_pool/{thread_pools} /_cat/plugins /_cat/fielddata /_cat/fielddata/{fields} /_cat/nodeattrs /_cat/repositories /_cat/snapshots/{repository} /_cat/templates /_cat/health:集群状态/_cat/thread_pool:线程池状态/_cat/indices:索引状态/_cat/nodes:节点状态 2.2、索引创建索引 [root@localhost ~]# curl -XPUT localhost:9200/log?pretty { "acknowledged" : true, "shards_acknowledged" : true, "index" : "log" } 查询索引 curl localhost:9200/_cat/indices?v health status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open log zm0ho3xFR1KaPFwHWfsX3Q 5 1 0 0 810b 810b yellow open customer lpfXum5qQoi3Mj9PJZB8Ug 5 1 1 0 4kb 4kb 关于重做索引、删除索引,索引之间如何平滑切换,后面详细讲解 2.3、文档创建文档 [root@localhost ~]# curl -XPUT localhost:9200/log/authlog/1?pretty -d '{"name":"rcl","detail":"blacklist"}' { "_index" : "log", "_type" : "authlog", "_id" : "1", "_version" : 1, "result" : "created", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "created" : true } 更新文档 [root@localhost ~]# curl -XPUT localhost:9200/log/authlog/1?pretty -d '{"name":"amao","detail":"blacklist"}' { "_index" : "log", "_type" : "authlog", "_id" : "1", "_version" : 2, "result" : "updated", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 }, "created" : false } 查询文档 [root@localhost ~]# curl localhost:9200/log/authlog/1?pretty { "_index" : "log", "_type" : "authlog", "_id" : "1", "_version" : 2, "found" : true, "_source" : { "name" : "amao", "detail" : "blacklist" } } 此处name已被更新为amao,有此可见更新是有效的删除文档 [root@localhost ~]# curl -XDELETE localhost:9200/log/authlog/1?pretty { "found" : true, "_index" : "log", "_type" : "authlog", "_id" : "1", "_version" : 3, "result" : "deleted", "_shards" : { "total" : 2, "successful" : 1, "failed" : 0 } } [root@localhost ~]# curl localhost:9200/log/authlog/1?pretty { "_index" : "log", "_type" : "authlog", "_id" : "1", "found" : false } 2.4、DSL查询示例 [root@localhost ~]# curl -XPOST localhost:9200/log/_search -d '{"query":{"match":{"name":"amao"}}}' {"took":38,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":1,"max_score":0.2876821,"hits":[{"_index":"log","_type":"authlog","_id":"1","_score":0.2876821,"_source":{"name":"amao","detail":"blacklist"}}]}} kibana 1、安装 wget https://artifacts.elastic.co/downloads/kibana/kibana-6.4.2-linux-x86_64.tar.gz tar -zxvf kibana-6.4.2-linux-x86_64.tar.gz mv kibana-6.4.2-linux-x86_64 /usr/local cd /usr/local chown -R elasticsearch:elasticsearch kibana-6.4.2-linux-x86_64 ./bin/kibana Filebeat ./filebeat -e -c filebeat.yml filebeat.yml配置如下cat filebeat.yml | grep -v '#' | grep -v '^$' filebeat.inputs: - type: log enabled: true paths: - /usr/local/elastic-data/aaaaaa* fields: logtype: filelog logsource: log4j filebeat.config.modules: path: ${path.config}/modules.d/*.yml reload.enabled: false setup.template.settings: index.number_of_shards: 3 setup.kibana: output.logstash: hosts: ["192.168.31.101:5044"] Logstash 1、安装 wget https://artifacts.elastic.co/downloads/logstash/logstash-6.4.2.tar.gz tar -zxvf logstash-6.4.2.tar.gz mv logstash-6.4.2 /usr/local cd /usr/local chown -Relasticsearch:elasticsearch logstash-6.4.2 bin/logstash -f first-pipeline.conf --config.reload.automatic first-pipeline.conf在logstash home目录下新建first-pipeline.conf # comments to describe your configuration. input { beats { host => "192.168.31.101" port => "5044" } } # The filter part of this file is commented out to indicate that it is # optional. # filter { # # } output { elasticsearch { hosts => ["192.168.31.101:9200"] } }

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

Nginx入门

一、Nginx简介 1.1Nginx特性 模块化设计,较好的扩展性 高可靠性 支持热部署:不停机更新配置文件,升级版本,更换日志文件 低内存消耗:10000个keep-alive连接模式下的非活动连接,仅 需要2.5M内存event-driven,aio,mmap,sendfile 1.2Nginx的基本功能 静态资源的web服务器 http协议反向代理服务器 pop3/imap4协议反向代理服务器 FastCGI(lnmp),uWSGI(python)等协议 模块化(非DSO),如zip,SSL模块 1.3Nginx与web服务相关的功能 虚拟主机(server) 支持 keep-alive 和管道连接 访问日志(支持基于日志缓冲提高其性能) url rewirte 路径别名 基于IP及用户的访问控制 支持速率限制及并发数限制 重新配置和在线升级而无须中断客户的工作进程 Memcached 的 GET 接口 二、Nginx服务架构 master/worker结构 master进程:负责加载和分析配置文件、管理worker进程,平滑升级 worker进程:接收客户端请求、将请求一次送入各模块过滤、I/O调用、数据缓存、发送响应 cache相关进程:cache loader (缓存索引重建)与cache manager(缓存索引管理)组成 --Cache loader在Nginx服务启动后由主进程生成,根据本地磁盘上缓存建立索引元数据库后退出。 --Cache manager在元数据更新完成后,对元数据是否过期做出判断。 三、Nginx的配置文件结构 配置文件的组成部分 主配置文件:nginx.conf 子配置文件:include conf.d/*.conf fastcgi、uwsgi、scgi:等协议相关的配置文件。在根路径下 mime.types:支持的mime类型。在根路径下 四、基本配置实例讲解

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

SpringCloud入门

1.关于SpringCloud中各个微服务之间调用的URL硬编码问题 ----通过SpringCloud服务注册、发现的机制来完成 2.微服务调用的原理图 由上图可以看出: 1、 服务提供者将服务注册到注册中心 2、 服务消费者通过注册中心查找服务 3、 查找到服务后进行调用(这里就是无需硬编码url的解决方案) 4、 服务的消费者与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者 3.注册中心Eureka SpringCloud提供了多种注册中心的支持,如:Eureka、ZooKeeper等。官方推荐使用Eureka。 原理: Eureka包含两个组件:Eureka Server和Eureka Client。 Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样EurekaServer中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。 Eureka Client是一个java客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。 在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。 Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

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

Hive 入门

官网:hive.apache.org 首先,Hive是数据仓库。可以用类SQL的语言来跑MR,可以理解为Hadoop的客户端。一方面Hive 数据都来自HDFS,另一方面Hive的代码需要提交到Hadoop中去执行,来跑MR。 HiveQL或者HQL,实际上是Hive将SQL提交,后翻译成MR,在HDFS上执行。所以Hive由解释器(解释成Java代码,提交到MR执行)、编译器、优化器等功能。 Hive在运行时元数据存储在关系型数据库中。不推荐默认的,可以使用mysql代替。具体的配置文件在conf/hive-site.xml里的ConnectionURL里面. hive的语法和sql很像,举例 CREATE TABLE t_person( id int, name string, hobby array<string>, character map<string, string>) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' COLLECTION ITEMS TERMINATED BY '_' MAP KEYS TERMINATED BY ':'; 对应的example: 1, zhangsan, sports_books_TV, sex:man_color:red 另外,只有查所有数据的时候才不执行MR, 比如:select * from table 时 创建分区表,分区实际上是个文件夹,表名就是文件夹名。每一个分区,实际上就是这个文件夹下的不同文件。分区可以根据时间、区域等进行划分,如每天一个分区或者每个城市一个分区,只要写下 where pt=20170707这样的条件即可查询指定时间得到数据。 CREATE TABLE e_stu( id int, sname string, city string) PARTITIONED BY (ds string) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' sTORED AS TEXTFILE; 导入数据(在hive中执行) LOAD DATA LOCAL INPATH '/home/zkpk/ecaoyng/input/estu.txt' OVERWRITE INTO TABLE e_stu PARTITION (ds='2017-07-07') LOAD DATA LOCAL INPATH '/home/zkpk/ecaoyng/input/estu2.txt' INTO TABLE e_stu PARTITION (ds='2017-07-08') hive> select * from e_stu; OK 1 young linyi 2017-07-07 2 jerry dalian 2017-07-07 3 ian dalian 2017-07-07 1 hello usa 2017-07-08 2 world France 2017-07-08 3 hadoop English 2017-07-08 4 hive spain 2017-07-08 Time taken: 0.087 seconds, Fetched: 7 row(s) hive> select * from e_stu where ds = '2017-07-07'; OK 1 young linyi 2017-07-07 2 jerry dalian 2017-07-07 3 ian dalian 2017-07-07 Time taken: 0.211 seconds, Fetched: 3 row(s) hive> hive> insert into table e_stu > partition (ds = '2017-09-10') > select id,sname,city from e_stu; hive> select * from e_stu where ds = '2017-09-10'; OK 1 young linyi 2017-09-10 2 jerry dalian 2017-09-10 3 ian dalian 2017-09-10 1 hello usa 2017-09-10 2 world France 2017-09-10 3 hadoop English 2017-09-10 4 hive spain 2017-09-10 那么hive的文件在哪里查看?从50070的页面中的browse directory 中的user目录下/user/hive/warehouse/day0525.db/e_stu 可以看到有两个文件夹 hive的四种数据导入方式,旧的版本不支持insert into values,但新版本已经支持。 http://blog.csdn.net/lifuxiangcaohui/article/details/40588929 因为mysql中存储元数据,所以启动hive的时候需要启动mysql。但启动是有时会遇到如下的提示: Another MySQL daemon already running with the same unix socket. 解决方案: find / -name mysql.sock 将mysql.sock(e.g. /var/lib/mysql/mysql.sock)删除,重启service即可 export将表中的数据导出到hdfs. 未完待续

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

HDFS 入门

注意secondaryname node 不是name node的备份,仅仅备份了一部分的元数据,不是实时备份。它的主要工作是帮助NN合并editslog,减少NN启动时间 比如删除元数据,不会立马删除,而是将操作信息写入日志edits log,在合并的时候(edits log和fsimage合并的时候)进行实际的删除。合并完成之后会得到一个新的fsimage再传送给NN,并替换原来的。 所以NN的主要做用是接受客户端的读写操作,而元数据的更新等需要大量IO操作的合并等由SNN来做。 SNN执行合并机制: 根据配置文件设置的时间间隔fs.checkpoint.period 默认为3600s 根据配置文件设置edits log大小 fs.checkpoint.size规定edits文件的最大默认为64M NameNode的$dfs.namenode.name.dir/current/文件夹的几个文件: current/ |– VERSION |– edits_* |– fsimage_0000000000008547077 |– fsimage_0000000000008547077.md5 `– seen_txid 其中存在大量的以edits开头的文件和少量的以fsimage开头的文件。那么这两种文件到底是什么,有什么用?下面对这两中类型的文件进行详解。在进入下面的主题之前先来搞清楚edits和fsimage文件的概念: (1)、fsimage文件其实是Hadoop文件系统元数据的一个永久性的检查点,其中包含Hadoop文件系统中的所有目录和文件idnode的序列化信息; (2)、edits文件存放的是Hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所以写操作首先会被记录到edits文件中。 fsimage和edits文件都是经过序列化的,在NameNode启动的时候,它会将fsimage文件中的内容加载到内存中,之后再执行edits文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。 NameNode起来之后,HDFS中的更新操作会重新写到edits文件中,因为fsimage文件一般都很大(GB级别的很常见),如果所有的更新操作都往fsimage文件中添加,这样会导致系统运行的十分缓慢,但是如果往edits文件里面写就不会这样,每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新。如果一个文件比较大,使得写操作需要向多台机器进行操作,只有当所有的写操作都执行完成之后,写操作才会返回成功,这样的好处是任何的操作都不会因为机器的故障而导致元数据的不同步。 fsimage包含Hadoop文件系统中的所有目录和文件idnode的序列化信息;对于文件来说,包含的信息有修改时间、访问时间、块大小和组成一个文件块信息等;而对于目录来说,包含的信息主要有修改时间、访问控制权限等信息。fsimage并不包含DataNode的信息,而是包含DataNode上块的映射信息,并存放到内存中,当一个新的DataNode加入到集群中,DataNode都会向NameNode提供块的信息,而NameNode会定期的“索取”块的信息,以使得NameNode拥有最新的块映射。因为fsimage包含Hadoop文件系统中的所有目录和文件idnode的序列化信息,所以如果fsimage丢失或者损坏了,那么即使DataNode上有块的数据,但是我们没有文件到块的映射关系,我们也无法用DataNode上的数据!所以定期及时的备份fsimage和edits文件非常重要! 在前面我们也提到,文件系统客户端执行的所以写操作首先会被记录到edits文件中,那么久而久之,edits会非常的大,而NameNode在重启的时候需要执行edits文件中的各项操作,那么这样会导致NameNode启动的时候非常长!在下篇文章中我会谈到在Hadoop 1.x版本和Hadoop 2.x版本是怎么处理edits文件和fsimage文件的。 注意NN工作的数据都在内存中,会将用户操作都记录在edit 文件 HDFS读流程 其中Distributed FileSystem/FSDataInputStream是两个API,而且4,5是并发执行的,当读取所有的block在客户端合并成一个大文件。 HDFS写流程 注意当写dn的时候,仅仅是向一个dn上写block,其他副本由这个DN新起线程去完成。 HDFS文件权限 HDFS的HA,主要给NN做HA 用户连接的是ZK zk 必须是大于1的奇数(竞争锁的投票机制)) zkfc和nn的数量一致 JN也是奇数个 HDFS做HA,节点数量举例 MapReduce的HA,主要给Resource Manager做HA. 但是一般企业只对HDFS做HA

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

HBase入门

HBase 是hadoop的数据库(数据量大,实时),目标是存储并处理大型的数据,具体来讲是用普通的硬件资源,就能处理成千上万的行和列所组成的大型数据。它可以直接使用本地文件或者HDFS,因为稳定性的考虑,推荐使用HDFS。利用HDFS作为其文件存储系统,利用MR来处理Hbase中的海量数据,利用ZK来做HA(高可用)作为其分布式协同服务。 HBase的安装分为三种模式:单机、伪分布式安装、全分布模式安装。其中伪分布式模式是一个运行在单台机器上的分布式模式,此种模式性HBase所有的守护进程都运行在同一个节点。因为分布式模式依赖于HDFS,所有确认HDFS已成功安装并启动。另外,全分布模式需要zookeeper的配置。 HBase常用命令 HBase体系结构 HBase主从结构。HBase Master负责管理所有的HRegion服务器,而HBase所有的服务器都是通过Zookeeper来协调并处理HBase服务器可能遇到的错误。HBase Master本身并不存储HBase中的任何数据。Hbase逻辑上的表被划分为多个HRegion,然后存储到HRegion server 群中。 HRegion: HRegion服务器 所有的数据库文件一般保存在HDFS上,用户通过一些列的HRegion服务器获取这些数据,一台机器上面一般只运行一个HRegion服务器,且每一个区段的HRegion也智慧被一个HRegion服务器维护. HBase Master服务器 HBase 数据逻辑视图 每行列的个数可以不一样 HBase 数据物理视图 虽然从概念视图上每个表格有很多行组成,但是物理存储来看,它是按照列来保存的。 HBase体系结构 client请求zk(zk,用于HA,解决单点故障问题)。图中有一个错误,每一个HRegtionServer,只有一个Hlog,不应属于HRegion。 每一个store存在一个目录下,实际就是一个列族 MemStore,内存store,当数据刚写入时是放在内存中的,当溢写时写道StoreFile,而真正的数据是在HFile在HDSF上。StoreFile上有HFile上的元数据。在Region中不会真正的保存数据,真正的数据都在HDSF上面 HBase与RDBMS HBase常用命令 http://www.cnblogs.com/xiaolei2017/p/7245299.html http://blog.csdn.net/lifuxiangcaohui/article/details/40042117 启动Hbase 首先要确保zookeeper已经安装完成,可以用zkServer.sh 查看 start-hbase.sh. 可以通过jps查看hmaster和hregionserver是否启动。 另外可以通过网页:master:60010查看

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

入门预测

一句话理解云平台的运作模式,就是:在不同层级上、为不同规模的产业需求方提供不同形式上的互联网生态环境。 IaaS云服务的优势:省去了IT基础设施上的投资、建设工作量,研发人员可以直接获取虚拟化的基础设施资源来部署上层应用的搭建工作,客户消费的是云化资源类的服务。 PaaS云服务的优势:省去了IT应用平台上的投资、建设工作量,研发人员可以直接获取虚拟化的平台应用工具来部署上层应用的搭建工作,客户消费的是云化工具类的服务。 SaaS云服务的优势:省去了整个IT支撑上的所有工作,客户只需要根据自己的商业模式选择虚拟化的软件工作环境来部署上层应用即可,能以最快捷的方式投入商用运作、产生效益,客户消费的是云化软件类的服务。 下一步的演进方向应该是BaaS,即:客户可以自由地消费他/她所希望获取的某种商业模式,云服务商可以组合起互联网生态环境之外的其他社会生态环境(比如:物联网)的解决方案一并提供给客户。

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

JavaJDBC(快速理解)

1.JDBC是什么? Java DataBase Connectivity(Java语言连接数据库) 2.JDBC的本质是什么? JDBC是SUN公司制定的一套接口(interface) java.sql.*; (这个软件包下有很多接口。) 3.JDBC开发前的准备工作,先从官网下载对应的驱动jar包,然后将其配置到环境变量classpath当中。 classpath=.;D:\course\06-JDBC\resources\MySql Connector Java 5.1.23\mysql-connector-java-5.1.23-bin.jar 以上的配置是针对于文本编辑器的方式开发,使用IDEA工具的时候,不需要配置以上的环境变量。 IDEA有自己的配置方式。 4.JDBC编程六步(需要背会) 第一步:注册驱动(作用:告诉Java程序,即将要连接的是哪个品牌的数据库) 第二步:获取连接(表示JVM的进程和数据库进程之间的通道打开了,这属于进程之间的通信,重量级的,使用完之后一定要关闭通道。) 第三步:获取数据库操作对象(专门执行sql语句的对象) 第四步:执行SQL语句(DQL DML....) 第五步:处理查询结果集(只有当第四步执行的是select语句的时候,才有这第五步处理查询结果集。) 第六步:释放资源(使用完资源之后一定要关闭资源。Java和数据库属于进程间的通信,开启之后一定要关闭。) import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; public class JDBCTest{ public static void main(String[] args) { Connection conn= null; Statement stmt = null; ResultSet rs = null; try{ //1.注册驱动 //第一种方式 Driver driver = new com.mysql.jdbc.Driver(); DriverManager.registerDriver(driver); //第二种方式(一下方法不需要返回值,我们只需要它的类加载动作) class.forName("com.mysql.jdbc.Driver"); //2.获取连接 String url = "jdbc:mysql://127.0.0.1:3306/bjpowernode"; String user = "root"; String password = "333"; conn = DriverManager.getConnection(url,user,password); System.out.println("数据库连接对象:"+conn); //com.mysql.jdbc.JDBC4Connection@34340fab //3.获取数据库操作对象(statement专门执行sql语句) stmt = conn.createStatement(); //4.执行sql String sql = "select empno as a,ename,sal from emp"; rs= stmt.executeQuery(sql); //executeUpdate执行DML语句 executeQuery(sql)执行DQL语句 //5.处理查询结果集 while(rs.next()) { int empno = rs.getInt("a"); String ename = rs.getString("ename"); double sal = rs.getDouble("sal"); System.out.pritnln(empno+","+ename+","+sal); } } catch(SQLException e){ e.printStackTrace(); }finally{ try{ if(stmt !=null){ stmt.close(); } }catch(SQLException e){ e.printStackTrace(); } try{ if(conn !=null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } } 使用属性配置文件 //jdbc.propertes属性配置文件 driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/bjpowernode user=root password=333 import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Connection; import java.sql.Statement; import java.util.*; public class JDBCTest{ public static void main(String[] args) { //使用资源绑定器绑定属性配置文件 ResourceBundle bundle = ResourceBundle.getBundle("jdbc"); String driver = bundle.getString("driver"); String url = bundle.getString("url"); String user = bundle.getString("user"); String password = bundle.getString("password"); Connection conn= null; Statement stmt = null; try{ //1.注册驱动 class.forName(driver); //2.获取连接 conn = DriverManager.getConnection(url,user,password); System.out.println("数据库连接对象:"+conn); //com.mysql.jdbc.JDBC4Connection@34340fab //3.获取数据库操作对象(statement专门执行sql语句) stmt = conn.createStatement(); //4.执行sql String sql = "insert into dept(deptno,dname,loc) values(50,'人事部','北京')"; int count = stmt.executeUpdate(sql); //执行DML语句 System.out.println(count == 1 ? "保存成功":"保存失败"); //5.处理查询结果集 } catch(Exception e){ e.printStackTrace(); }finally{ try{ if(stmt !=null){ stmt.close(); } }catch(SQLException e){ e.printStackTrace(); } try{ if(conn !=null){ conn.close(); } }catch(SQLException e){ e.printStackTrace(); } } } } 5.登录功能实现(防止SQL注入,PreparedStatement) package com.bjpowernode.jdbc; import java.sql.*; import java.util.HashMap; import java.util.Map; import java.util.Scanner; /*实现功能: 1.需求:模拟用户登录功能的实现。 2.业务描述: 程序运行的时候,提供一个输入的入口,可以让用户输入用户名和密码 合法:显示登录成功。 不合法:显示登录失败。 3.数据准备: 在实际的开发中使用建模工具 4.Sql注入现象(安全隐患): 根本原因 fdsa ''or 将用户名或密码的or 当做了sql语句 解决SQL注入问题: 要想用户信息不参与Sql语句编译,那么必须使用java.sql.PreparedStatement PreparedStatement是属于预编译数据库操作对象,编译一次执行多次。 PreparedStatement ps = null; 其中一个?代表一个占位符,站位符不能用点引号括起来 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); 给占位符传值 ps.setString(1,loginName); ps.setString(2,loginPwd); */ public class JDBCTest06 { public static void main(String[] args) { //初始一个界面 Map<String,String> userLoginInfo = initUI(); boolean loginSuccess = login(userLoginInfo); System.out.println(loginSuccess? "登录成功!":"登录失败用户名密码错误!"); } private static boolean login(Map<String, String> userLoginInfo) { boolean loginSuccess = false; Connection conn = null; PreparedStatement ps = null;//这里是PreParedStatement(预编译数据库操作对象) ResultSet rs = null; try{ //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //连接语句 conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/bjpowernode","root","333"); //获取数据库操作对象 String sql = "select * from t_user where loginName = ? and loginPwd = ?"; ps = conn.prepareStatement(sql); //给占位符传值 ps.setString(1,userLoginInfo.get("loginName")); ps.setString(2,userLoginInfo.get("loginPwd")); rs = ps.executeQuery(); if (rs.next()) { loginSuccess = true; } }catch (ClassNotFoundException e){ e.printStackTrace(); }catch (SQLException e) { e.printStackTrace(); }finally { if (rs !=null){ try { rs.close(); }catch (SQLException e) { e.printStackTrace(); } } if (ps !=null){ try { ps.close(); }catch (SQLException e) { e.printStackTrace(); } } if (conn !=null) { try{ conn.close(); }catch (SQLException e) { e.printStackTrace(); } } } return loginSuccess; } /* * 初始化用户页面 * @return 用户输入用户名密码等登录信息 * */ private static Map<String, String> initUI() { Scanner s = new Scanner(System.in); System.out.println("用户名:"); String loginName = s.nextLine(); System.out.println("密码:"); String loginPwd = s.nextLine(); Map<String,String> userLoginInfo = new HashMap<>(); userLoginInfo.put("loginName",loginName); userLoginInfo.put("loginPwd",loginPwd); return userLoginInfo; } } Statement的用处(需要SQL注入) Statement存在SQL注入问题,是编译一次执行一次。PreparedStatement执行效率高。 需要先 用户台输入desc降序,输入asc升序,此时需要使用Sql注入 String keyWords = desc或者asc String sql = "select ename = from emp order by ename " + keyWords; 6.账户转账演示事务 sql脚本 drop table if exists t_act; create table t_act( actno bigint, balance double(7,2) //注意:7表示有效数字,2表示小数位个数 ); insert into t_act(actno,balance) values(111,20000); insert into t_act(actno,balance) values(222,0); commit; select * from t_act; 重点三句: conn.setAutoCommit(false); conn.commit(); conn.rollback(); public class HelloWorld { public static void main(String []args) { Connection conn = null; PreparedStatement ps = null; try{ //注册驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode","root","333"); //将自动提交机制改为手动提交 conn.setAutoCommit(false);//开启事务 //获取预编译的数据库操作系统 String sql = "update t_act set balance = ? where actno = ?"; ps = conn.prepareStatement(sql); //给替换符赋值 ps.setDouble(1,10000); ps.setInt(2,111); int count = ps.executeUpdate(); ps.setDouble(1,10000); ps.setInt(2,222); count +=ps.executeUpdate(); //程序到这里表示成功 conn.commit(); //提交事务 Syste.out.println(count == 2 ?"转账成功":"转账成功"); }catch(Exception e) { if(conn != null) { try{ //回滚事务 conn.rollback(); }catch(SQLException e) { e.printStackTrace(); } } e.printStackTrace(); } } } 7.JDBC工具类封装 import java.sql.*; public class DBUtil { private DBUtil() { } //工具类的构造方法是私有的; //因为工具类的方法是静态的,不需要实例化 static { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } } //获取数据库连接对象 //@return 连接对象 public static PreparedStatement createStatement(String sql) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/bjpowernode", "root", "333"); PreparedStatement ps = conn.prepareStatement(sql); return ps; } //关闭资源 //conn 连接对象 //ps 数据库操作对象 //rs 结果集 public static void close(Connection conn, Statement ps, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (ps != null) { try { ps.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }

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

PySpider 快速上手

因为工作原因,最近一段时间都在做项目的数据建设工作,涉及到使用Pyspider进行数据的爬取及入库,所以此处系统的整理一下; pyspider简介 一个国人编写的强大的网络爬虫系统并带有强大的WebUI。 采用Python语言编写,分布式架构,支持多种数据库后端,强大的WebUI支持脚本编辑器,任务监视器,项目管理器以及结果查看器。 不过目前对代理支持的话,不太好,只能支持单代理,本身不支持多代理,有两种解决方法: 修改源码,在发起请求的时候,从代理中心获取代理地址进行配置访问; 通过 类似squid方法进行获取,详细点这里 GitHub地址:https://github.com/binux/pyspider 中文网地址:http://www.pyspider.cn PySpider特性 用Python编写脚本,支持Python 2. {6,7},3。{3,4,5,6}等 功能强大的WebUI,包括脚本编辑器,任务监视器,项目管理器和结果查看器 支持多种数据库存储(MySQL,MongoDB,Redis,SQLite,Elasticsearch,PostgreSQL,SQLAlchemy) 支持多种消息队列(RabbitMQ,Beanstalk,Redis,Kombu) 支持爬虫任务优先级设置,超时重爬等 支持分布式部署 支持抓取Javascript页面 PySpider组件及架构 PySpider核心组件有以下几个: Scheduler(调度器): 从task_queue中接收任务 确定任务是新任务还是重爬任务 进行优先级排序, 处理定期任务,重试丢失或失败的任务 Fetcher(提取器): 负责获取网页内容 支持url或JavaScript的页面(通过phantomjs) Processor(处理器): 负责处理内容的解析,内置PyQuery解析库 组件之间架构图如下: 每个组件相互独立,通过消息队列连接,从单进程到多机分布式灵活拓展 存储 Pyspider支持多种存储,默认使用的sqlite,具体支持如下图源码中所列 默认情况下,运行的时候,运行目录的下会生成一个data文件夹,里面会存储几个db文件: project.db (存储爬虫项目信息,一般指的一个单独的爬虫脚本) result.db (存储任务执行结果信息) task.db (存储爬虫任务信息,也就是on_start后生成的爬虫任务信息) PySpider使用 安装Pyspider 安装的话,比较简单,只有两步: pip install pyspider 运行命令pyspider,访问http://localhost:5000/ 首页介绍 操作按钮 Recent Active Tasks (查看最近活动的任务,会跳转到一个页面有列表显示) Create (创建一个新的爬虫任务) 项目列表 group:分组,点击进行修改,用于区分任务类型,可以通过点击表头进行排序,要是能做成文件夹就更好了 project name:项目名称,创建爬虫项目时填写 status (任务状态,有以下几种状态) TODO:当一个脚本刚刚被创建时的状态 STOP:你可以设置项目状态为STOP让项目停止运行 CHECKING:当一个运行中的项目被编辑时项目状态会被自动设置成此状态并停止运行. DEBUG/RUNNING:这两状态都会运行爬虫,但是他们之间是有区别的.一般来说调试阶段用DEBUG状态,线上用RUNNING状态. rate/burst:rate:每秒执行多少个请求,burst:任务并发数,可以点击进行修改 avg time:任务平均时间 progress:记录任务状态,按时间区分,会标示任务的创建数,成功数,失败数等值 actions:对爬虫项目的一些操作 Run:立即执行任务,需要status为running或debug状态;如果在配置的调度执行时间内已经执行过,再点run是无效的,需要删除task.db里的数据才行(我都是直接把文件都干掉了。。) Active Tasks:查看当前爬虫项目的活动任务 Results:查看活动任务结果 编辑页面介绍 左侧页面栏为调试信息可视化,相关区域及按钮介绍一下: 上面绿色区域,为调试信息显示,显示当前任务的相关信息; Run:调试按钮,点击即可运行当前任务 "<",">"箭头为上一步下一步,用于调试过程中切换到上一步骤 web:将当前拉取到的页面内容以web形式展示(不过显示范围很窄。。) html:显示当前页面的html源码 follow:子任务,该任务下的子任务,点击链接上的按钮,即可进行下一步调试 messages,enable css selector helper 这两个还不知道有啥用 右侧主要就是用于编写爬虫脚本了,新建默认脚本如下: 核心代码都在BaseHandler中,Handler类继承BaseHandler,该类在base_handler.py文件中 crawl_config :为全局配置对象,通过源码我们可以看到,可以支持很多配置,但是需要注意,配置是有作用区域的 on_start 入口方法:一般为主页面的方法,这名字不能改,因为源码里启动的话入口方法就是on_start,其余index_page,跟detail_page没有说强制性的,可根据自己需求起名字,就不说了; @every 注解:用于定时调度,有两个参数:minutes,seconds;分别也是代表指的多少分钟执行一次,多少秒执行一次,代码也在base_handler.py中 @config 注解:用于核心方法self.crawl的配置,在通过配置的,会作为self.crawl的默认配置; crawl 核心方法:这个方法就是告诉Pyspider抓取哪个页面,我目前为止也没都用全,完整的API点击这里,有很详细的解释 Response 返回对象:通过默认的示例代码中可以看到,通过crawl爬取返回的对象就是这个类型,可以通过response.doc方法,将返回值转换成PyQuery对象,剩下来的就根据需求去解析元素,提取你需要的东西了;完整API点击这里 总结: 因为第一次接触爬虫,对别的爬虫技术也不太了解,不好做对比,就PySpider来说,用久了还是方便的,特别是页面调试,不过刚开始用的话,对Response对象不熟悉,会比较麻烦一点,毕竟没有PyCharm通过断点查看对象属性来的方便; 因为整体来讲,比较简单,这里就不上传示例代码了,看编辑页面介绍截图的代码,就是之前爬保监会网站的代码,可以借鉴一下,比较简单。 另吐槽一下开源中国 对MarkDown的支持,在编辑预览中看到的,跟发布出来看到的格式不一样。。难受

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

Redis快速使用

1.导包(坐标) <!-- https://mvnrepository.com/artifact/redis.clients/jedis --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> <!-- 配置使用redis启动器 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 2.使用 2.1存数据: @Autowired private RedisTemplate<String, String> redisTemplate; public void run(){ /* 参数一: key 参数二:value 参数三:title 参数四:时间类型 */ redisTemplate.opsForValue().set(customer.getTelephone(), activecode, 24,TimeUnit.HOURS); } 2.2取数据 String getUUid = redisTemplate.opsForValue().get(telephone);

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

TensorFlow——快速安装

TensorFlow:2015年Google开源的机器学习框架 1、Anoconda安装 (1)Window,MacOS,Linux都已支持Tensorflow。 (2) Window用户只能使用 python3.5 (64bit) 。MacOS,Linux支持python2.7和python3.3+。 (3)有GPU可以安装带GPU版本的,没有GPU就安装CPU版本的。 推荐安装Anaconda,pip版本大于8.1 Anoconda官网: https://www.anaconda.com/ Anaconda版本下载: https://repo.continuum.io/archive/ python3.5(64bit对应的是Anaconda3-4.2.0版本,如下) 注 :更新pip版本: 管理员 方式打开命令提示符,输入命令: python -m pip install --upgrade pip 2、Windows安装Tensorflow (1) Windows安装Tensorflow CPU版本: 管理员 方式打开命令提示符,输入命令: pip install tensorflow GPU版本: 管理员方式打开命令提示符,输入命令: pip install tensorflow-gpu (2) Windows更新Tensorflow 先卸载 : pip uninstall tensorflow 再安装 : pip install tensorflow 注: 【安装完成后,打开Anoconda自带的Jupyter Notebook,输入 import tensorflow ,运行( shift+Enter ),如果不缺少文件的话就运行成功,如果缺少文件则根据错误提示安装文件。 例如:出现如下错误,则点击下面的链接,根据提示安装即可 ImportError : Could not find 'cudart64_90.dll'. TensorFlow requires that this DLL be installed in a directory that is named in your %PATH% environment variable. Download and install CUDA 9.0 from this URL: https://developer.nvidia.com/cuda-toolkit 】 3、Linux和MacOS安装Tensorflow CPU版本: Python 2.7用户: pip install tensorflow Python3.3+用户: pip3 install tensorflow GPU版本: Python 2.7用户: pip install tensorflow-gpu Python3.3+用户: pip3 install tensorflow-gpu 官方网站: https://www.tensorflow.org/ 官方GitHub仓库: https://github.com/tensorflow/tensorflow 官方文档: https://www.tensorflow.org/get_started/ 官方文档中文版: https://github.com/jikexueyuanwiki/tensorflow-zh TensorFlow 中文社区 http://www.tensorfly.cn/

资源下载

更多资源
Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册