当前位置: 首页 > 编程日记 > 正文

spring cloud连载第二篇之Spring Cloud Config

Spring Cloud Config

Spring Cloud Config为分布式服务提供了服务侧和客户侧的外部配置支持。通过Spring Cloud Config你可以有一个统一的地方来管理所有应用的外部配置。

默认服务端存储实现用的是git,因此,它很容易支持配置环境的标签版本,并且可以访问各种管理内容的工具。

1. Quick Start

此小结将介绍Spring Cloud Config Server的客户端和服务端。

首先,启动服务端:

1 $ cd spring-cloud-config-server
2 $ ../mvnw spring-boot:run

接着试一下客户端:

1 $ curl localhost:8888/foo/development
2 {"name":"foo","label":"master","propertySources":[
3   {"name":"https://github.com/scratches/config-repo/foo-development.properties","source":{"bar":"spam"}},
4   {"name":"https://github.com/scratches/config-repo/foo.properties","source":{"foo":"bar"}}
5 ]}

默认定位属性资源的策略是使用git(spring.cloud.config.server.git.uri),并且用它来初始化一个迷你SpringApplication,这个迷你application的Environment是用来枚举属性资源并将它发布到一个JSON端点。

HTTP服务的格式如下:

1 /{application}/{profile}[/{label}]
2 /{application}-{profile}.yml
3 /{label}/{application}-{profile}.yml
4 /{application}-{profile}.properties
5 /{label}/{application}-{profile}.properties

其中application是是使用spring.config.name属性注入的,profile是一个激活的配置文件(或者是以逗号分隔的属性),label是一个可选的git标签(默认是master)。

Spring Cloud Config Server从git仓库为客户端拉取配置,如下:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/spring-cloud-samples/config-repo

1.1 Client Side Usage(客户端用法)

要在一个应用中使用这些特性,你可以构建一个Spring Boot application并且添加spring-cloud-config-client相关的依赖,最方便的方法是添加org.springframework.cloud:spring-cloud-starter-config依赖。

下面是一个典型的maven配置:

 1 <parent>
 2        <groupId>org.springframework.boot</groupId>
 3        <artifactId>spring-boot-starter-parent</artifactId>
 4        <version>{spring-boot-docs-version}</version>
 5        <relativePath /> <!-- lookup parent from repository -->
 6    </parent>
 7 
 8 <dependencyManagement>
 9     <dependencies>
10         <dependency>
11             <groupId>org.springframework.cloud</groupId>
12             <artifactId>spring-cloud-dependencies</artifactId>
13             <version>{spring-cloud-version}</version>
14             <type>pom</type>
15             <scope>import</scope>
16         </dependency>
17     </dependencies>
18 </dependencyManagement>
19 
20 <dependencies>
21     <dependency>
22         <groupId>org.springframework.cloud</groupId>
23         <artifactId>spring-cloud-starter-config</artifactId>
24     </dependency>
25     <dependency>
26         <groupId>org.springframework.boot</groupId>
27         <artifactId>spring-boot-starter-test</artifactId>
28         <scope>test</scope>
29     </dependency>
30 </dependencies>
31 
32 <build>
33     <plugins>
34            <plugin>
35                <groupId>org.springframework.boot</groupId>
36                <artifactId>spring-boot-maven-plugin</artifactId>
37            </plugin>
38     </plugins>
39 </build>

现在可以创建一个标准的Spring Boot application,如下:

 1 @SpringBootApplication
 2 @RestController
 3 public class Application {
 4 
 5     @RequestMapping("/")
 6     public String home() {
 7         return "Hello World!";
 8     }
 9 
10     public static void main(String[] args) {
11         SpringApplication.run(Application.class, args);
12     }
13 
14 }

当这个HHTP服务启动时,它默认从本地的config server(端口8888)加载配置,可以使用bootstrap.properties配置来改变这个默认行为:

1 spring.cloud.config.uri: http://myconfigserver.com

可以使用/env端点来查看bootstrap properties配置:

1 $ curl localhost:8080/env
2 {
3   "profiles":[],
4   "configService:https://github.com/spring-cloud-samples/config-repo/bar.properties":{"foo":"bar"},
5   "servletContextInitParams":{},
6   "systemProperties":{...},
7   ...
8 }

2. Spring Cloud Config Server(配置服务器的服务端)

Spring Cloud Config Server为外部配置提供一个基于资源的HTTP API。使用注解@EnableConfigServer可以在一个Spring Boot application中嵌入配置服务器。例如:

1 @SpringBootApplication
2 @EnableConfigServer
3 public class ConfigServer {
4   public static void main(String[] args) {
5     SpringApplication.run(ConfigServer.class, args);
6   }
7 }

最简单的方法是通过属性spring.config.name=configserver启动,因为在config server的jar中有一个configserver.yml配置文件,它已经设置好了默认的配置仓库。

或者你可以使用自己的配置:application.properties

1 server.port: 8888
2 spring.cloud.config.server.git.uri: file://${user.home}/config-repo

其中${user.home}/config-repo是一个包含YAML或者properties格式配置文件的git仓库。

注意:

1)在windows上,你需要在file url前多添加一个“/”,如果是绝对路径的话。(例如:file:///${user.home}/config-repo)

2)使用本地仓库只是为了演示和测试使用,在正式环境中需要使用一台服务器来管理配置

3)初始化克隆配合仓库在只有一个文件时可能比较快,但是如果存储一个二进制文件,特别是比较大的文件时,可能在第一次请求配置时有延迟甚至可能导致服务端内存溢出。

2.1 Environment Repository

在config server中我们应该将配置存储在什么地方?掌控这个行为的策略的就是为Environment对象服务的EnvironmentRepository。

Environment资源由一下三个变量参数化:

1){application} 对应客户端的spring.application.name

2){profile} 对应客户端的spring.profiles.active(以逗号分隔)

3){label} 它是服务器端功能标签“版本化”的配置文件集

Repository的实现通常像一个spring boot application,从一个和{application}相等的spring.config.name参数和与{profiles}相等的spring.profiles.active参数指定的文件来加载配置。

优先级策略和普通spring boot 的应用一样:Active profiles优先级比默认的高,如果有多个profiles,那么最后一个优先级最高。下面是客户端bootstrap 配置bootstrap.yml:

1 spring:
2   application:
3     name: foo
4   profiles:
5     active: dev,mysql

(和一般Spring Boot application一样,这些参数也可以在环境变量或者命令行参数中指定)

2.1.1 Git Backend

在config server中使用spring.cloud.config.server.git.uri来设置仓库位置,如果uri是以file:开头,则是本地仓库。

但是如果要扩展config server并且高可用的话,必须使所有服务器实例指向同一个仓库。因此需要一个共享的文件系统。在这种情况下,使用ssh协议是比较好的,这样服务器可以克隆一份配置到本地作为缓存使用。

仓库的实现是将HTTP路径中的{label}映射到一个git标签(commit id, branch name, or tag),如果一个git分支或者标签中包含“/”斜杠,那么在HTTP url中需要用一个特殊字符(_)来替代,以免发生混淆。

比如标签为foo/bar,则应该替换成:foo(_)bar。这个规则同样可应用到{application}参数上。

Skipping SSL Certificate Validation(跳过ssl验证)

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://example.com/my/repo
7           skipSslValidation: true

Setting HTTP Connection Timeout(设置HTTP连接超时时间,以秒为单位)

spring:cloud:config:server:git:uri: https://example.com/my/repotimeout: 4

Placeholders in Git URI(git URI中的占位符)

Spring Cloud Config Server支持git URI中的占位符为:{application},{profile},{label}(记住label是作为git 的标签使用的)。通过下面的配置你可以支持每个应用一个仓库的策略:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/myorg/{application}

Pattern Matching and Multiple Repositories(规则匹配和多仓库)

Spring Cloud Config包含对application和profile名称的规则匹配支持,规则格式是包含通配符的以逗号分隔的{application}/{profile}名称。例如:

 1 spring:
 2   cloud:
 3     config:
 4       server:
 5         git:
 6           uri: https://github.com/spring-cloud-samples/config-repo
 7           repos:
 8             simple: https://github.com/simple/config-repo
 9             special:
10               pattern: special*/dev*,*special*/dev*
11               uri: https://github.com/special/config-repo
12             local:
13               pattern: local*
14               uri: file:/home/configsvc/config-repo

如果{application}/{profile}不匹配任何一个规则,则使用spring.cloud.config.server.git.uri下面的默认URI。在上面的例子中,匹配“simple”仓库的规则是simple/*({application}为simple,{profile}为任意值)。“local”仓库匹配任何一个以local开头的应用名称,如果没有指定{profile}规则,则会自动在规则后面添加“/*”。

由于pattern参数实际上是一个数组,所以使用YAML数组(或者在.properties文件中使用[0], [1]等后缀)来绑定多种规则。如下:

 1 spring:
 2   cloud:
 3     config:
 4       server:
 5         git:
 6           uri: https://github.com/spring-cloud-samples/config-repo
 7           repos:
 8             development:
 9               pattern:
10                 - '*/development'
11                 - '*/staging'
12               uri: https://github.com/development/config-repo
13             staging:
14               pattern:
15                 - '*/qa'
16                 - '*/production'
17               uri: https://github.com/staging/config-repo

每个仓库都可以在子目录中存储配置文件,如果要在子目录中搜索则需要使用searchPaths配置。例如:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/spring-cloud-samples/config-repo
7           searchPaths: foo,bar*

在上面的例子中,服务器将会在顶级目录和foo子目录还有以bar开头的子目录中搜索配置文件。

默认情况下,服务器会在第一次收到配置请求时,克隆远程仓库。也可以在服务启动时克隆远程仓库,如下:

 1 spring:
 2   cloud:
 3     config:
 4       server:
 5         git:
 6           uri: https://git/common/config-repo.git
 7           repos:
 8             team-a:
 9                 pattern: team-a-*
10                 cloneOnStart: true
11                 uri: http://git/team-a/config-repo.git
12             team-b:
13                 pattern: team-b-*
14                 cloneOnStart: false
15                 uri: http://git/team-b/config-repo.git
16             team-c:
17                 pattern: team-c-*
18                 uri: http://git/team-a/config-repo.git

在上面的例子中只有team-a的远程仓库会在启动时克隆,其他的都是在第一次接受到配置请求时才克隆。

Authentication(用户验证)

添加username和password属性来使用远程仓库基于HTTP的验证。例如:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/spring-cloud-samples/config-repo
7           username: trolley
8           password: strongpassword

如果不使用HTTPS和用户凭证,也可以使用SHH,在默认目录下存储key(~/.ssh),并且URI指向一个SSH地址(例如:git@github.com:configuration/cloud-configuration)。

Git SSH configuration using properties(使用属性配置GIT SSH)

SSH配置可以使用java属性来解决,spring.cloud.config.server.git.ignoreLocalSshSettings值必须设置为true。例如:

 1 spring:
 2     cloud:
 3       config:
 4         server:
 5           git:
 6             uri: git@gitserver.com:team/repo1.git
 7             ignoreLocalSshSettings: true
 8             hostKey: someHostKey
 9             hostKeyAlgorithm: ssh-rsa
10             privateKey: |
11                          -----BEGIN RSA PRIVATE KEY-----
12                          MIIEpgIBAAKCAQEAx4UbaDzY5xjW6hc9jwN0mX33XpTDVW9WqHp5AKaRbtAC3DqX
13                          IXFMPgw3K45jxRb93f8tv9vL3rD9CUG1Gv4FM+o7ds7FRES5RTjv2RT/JVNJCoqF
14                          ol8+ngLqRZCyBtQN7zYByWMRirPGoDUqdPYrj2yq+ObBBNhg5N+hOwKjjpzdj2Ud
15                          1l7R+wxIqmJo1IYyy16xS8WsjyQuyC0lL456qkd5BDZ0Ag8j2X9H9D5220Ln7s9i
16                          oezTipXipS7p7Jekf3Ywx6abJwOmB0rX79dV4qiNcGgzATnG1PkXxqt76VhcGa0W
17                          DDVHEEYGbSQ6hIGSh0I7BQun0aLRZojfE3gqHQIDAQABAoIBAQCZmGrk8BK6tXCd
18                          fY6yTiKxFzwb38IQP0ojIUWNrq0+9Xt+NsypviLHkXfXXCKKU4zUHeIGVRq5MN9b
19                          BO56/RrcQHHOoJdUWuOV2qMqJvPUtC0CpGkD+valhfD75MxoXU7s3FK7yjxy3rsG
20                          EmfA6tHV8/4a5umo5TqSd2YTm5B19AhRqiuUVI1wTB41DjULUGiMYrnYrhzQlVvj
21                          5MjnKTlYu3V8PoYDfv1GmxPPh6vlpafXEeEYN8VB97e5x3DGHjZ5UrurAmTLTdO8
22                          +AahyoKsIY612TkkQthJlt7FJAwnCGMgY6podzzvzICLFmmTXYiZ/28I4BX/mOSe
23                          pZVnfRixAoGBAO6Uiwt40/PKs53mCEWngslSCsh9oGAaLTf/XdvMns5VmuyyAyKG
24                          ti8Ol5wqBMi4GIUzjbgUvSUt+IowIrG3f5tN85wpjQ1UGVcpTnl5Qo9xaS1PFScQ
25                          xrtWZ9eNj2TsIAMp/svJsyGG3OibxfnuAIpSXNQiJPwRlW3irzpGgVx/AoGBANYW
26                          dnhshUcEHMJi3aXwR12OTDnaLoanVGLwLnkqLSYUZA7ZegpKq90UAuBdcEfgdpyi
27                          PhKpeaeIiAaNnFo8m9aoTKr+7I6/uMTlwrVnfrsVTZv3orxjwQV20YIBCVRKD1uX
28                          VhE0ozPZxwwKSPAFocpyWpGHGreGF1AIYBE9UBtjAoGBAI8bfPgJpyFyMiGBjO6z
29                          FwlJc/xlFqDusrcHL7abW5qq0L4v3R+FrJw3ZYufzLTVcKfdj6GelwJJO+8wBm+R
30                          gTKYJItEhT48duLIfTDyIpHGVm9+I1MGhh5zKuCqIhxIYr9jHloBB7kRm0rPvYY4
31                          VAykcNgyDvtAVODP+4m6JvhjAoGBALbtTqErKN47V0+JJpapLnF0KxGrqeGIjIRV
32                          cYA6V4WYGr7NeIfesecfOC356PyhgPfpcVyEztwlvwTKb3RzIT1TZN8fH4YBr6Ee
33                          KTbTjefRFhVUjQqnucAvfGi29f+9oE3Ei9f7wA+H35ocF6JvTYUsHNMIO/3gZ38N
34                          CPjyCMa9AoGBAMhsITNe3QcbsXAbdUR00dDsIFVROzyFJ2m40i4KCRM35bC/BIBs
35                          q0TY3we+ERB40U8Z2BvU61QuwaunJ2+uGadHo58VSVdggqAo0BSkH58innKKt96J
36                          69pcVH/4rmLbXdcmNYGm6iu+MlPQk4BUZknHSmVHIFdJ0EPupVaQ8RHT
37                          -----END RSA PRIVATE KEY-----

其中hostKeyAlgorithm必须是ssh-dss, ssh-rsa, ecdsa-sha2-nistp256, ecdsa-sha2-nistp384, or ecdsa-sha2-nistp521中的一个。

Force pull in Git Repositories

如果本地copy已经失效(即远程仓库有改动),则Spring Cloud Config Server会强制从从远程库拉取最新的配置。如下:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/spring-cloud-samples/config-repo
7           force-pull: true

如果有多个远程仓库的话,可以使用类似下面的配置:

 1 spring:
 2   cloud:
 3     config:
 4       server:
 5         git:
 6           uri: https://git/common/config-repo.git
 7           force-pull: true
 8           repos:
 9             team-a:
10                 pattern: team-a-*
11                 uri: http://git/team-a/config-repo.git
12                 force-pull: true
13             team-b:
14                 pattern: team-b-*
15                 uri: http://git/team-b/config-repo.git
16                 force-pull: true
17             team-c:
18                 pattern: team-c-*
19                 uri: http://git/team-a/config-repo.git

force-pull属性默认是false。

Deleting untracked branches in Git Repositories(删除git仓库中未跟踪的分支)

因为Spring Cloud Config Server会克隆远程仓库到本地并且会一直保持这个分支知道下次重启,所以有一种情况是远程分支已经被删除,但是本地副本还仍然可用。

为了保证本地仓库分支和远程同步,需要设置deleteUntrackedBranches属性,它会使Spring Cloud Config Server强制删除本地未跟踪的分支。例如:

1 spring:
2   cloud:
3     config:
4       server:
5         git:
6           uri: https://github.com/spring-cloud-samples/config-repo
7           deleteUntrackedBranches: true

deleteUntrackedBranches默认值为false。

3. Spring Cloud Config Client(配置客户端)

3.1 Config First Bootstrap(启动时先读取config server配合)

在classpath中存在Spring Cloud Config Client的任何应用的默认行为如下:当一个config客户端启动时,它绑定到Config Server(通过bootstrap的配置属性spring.cloud.config.uri)然后使用远程配置文件初始化spring环境。

这种行为的最终结果是所有想要到 Config Server消费的客户端应用都需要一个配置有spring.cloud.config.uri(默认为:"http://localhost:8888")的bootstrap.yml或者环境变量。

3.2 Discovery First Bootstrap(使用服务发现寻找config server)

如果你正在使用服务发现框架例如Spring Cloud Netflix 和 Eureka Service Discovery 或者 Spring Cloud Consul,你可以把Config Server 注册到服务注册中心。

但是在默认的“Config First”模式下,客户端是感知不到注册中心中的config server服务的。如果你选择使用服务发现来定位Config Server,那么你需要在Config server中设置spring.cloud.config.discovery.enabled=true,

默认是false。这么做的话就需要每个客户端应用都要有一个bootstrap.yml或者环境变量来配置服务注册中心的内容。例如在Spring Cloud Netflix中,你需要配置Eureka server地址(eureka.client.serviceUrl.defaultZone),

这么做的代价是在启动时需要一个额外的网络往返来定位服务注册中心。好处是,只要注册中心是固定的,那么config server就可以随意改变坐标。默认的服务ID是configserver,但是可以通过spring.cloud.config.discovery.serviceId

来重新设置(但是通常是通过spring.application.name来设置一个服务ID)。

一般服务发现实现客户端都是支持某些元数据映射的(例如在Eureka中的eureka.instance.metadataMap)。为了让配置客户端能正确连接到config server需要在Config Server中配一些服务注册相关的元数据。

如果Config Server安全策略是基于HTTP的,你可以设置一些用户凭证像username,password。另外,如果Config Server有上下文路径,可以使用configPath设置。如下(bootstrap.yml):

1 eureka:
2   instance:
3     ...
4     metadataMap:
5       user: osufhalskjrtl
6       password: lviuhlszvaorhvlo5847
7       configPath: /config

3.3 Config Client Fail Fast(快速失败响应)

在某些情况下,你可能希望服务在启动时如果连接config server失败时立刻响应失败而停止启动,可以设置spring.cloud.config.fail-fast=true。

3.4 Config Client Retry(配置客户端重试机制)

如果你觉得config server在你启动应用是不可达是暂时的或者偶然的,你需要在一次失败后接着重新尝试连接。第一步,设置spring.cloud.config.fail-fast=false。

接着将spring-retry和spring-boot-starter-aop加入到classpath中。默认行为是重试6次,初始间隔为1000ms,后续间隔乘以1.1。

可以通过设置spring.cloud.config.retry.*来改变默认行为。

注意:如果要完全控制重试机制,可以通过创建一个RetryOperationsInterceptor类型id为configServerRetryInterceptor的bean。

可以使用Spring Retry中的RetryInterceptorBuilder来创建。

3.5 Locating Remote Configuration Resources(定位远程配置资源)

配置服务提供/{name}/{profile}/{label}的属性源,其在客户端应用的映射为:

  • "name" = ${spring.application.name}
  • "profile" = ${spring.profiles.active}(其实是Environment.getActiveProfiles())
  • "label" = "master"

可以使用spring.cloud.config.*来覆盖上面的默认值。

其中可以使用label属性回滚到以前的版本。在config server的实现中,label可以是git 标签,分支名或者commit ID。也可以是以逗号分隔的列表。在这种列表情况下,其中的元素会一个一个的被尝试,直到有一个成功。

3.6 Specifying Multiple Urls for the Config Server(指定多个config server url)

为了保证高可用,你可能部署多个config server,在客户端可以使用spring.cloud.config.uri,以逗号分隔指定多个URL,或者将config server的多个实例注册到服务注册中心,此时客户端需要使用之前提到的Discovery-First Bootstrap

模式(spring.cloud.config.discovery.enabled=true)。

如果Config Server使用的是HTTPS协议,则可以将用户凭证信息填写在每个config server 的 url上。如果使用其他的安全机制,则不支持为每个config server配置验证信息。

3.7 Configuring Read Timeouts(读取超时)

使用spring.cloud.config.request-read-timeout配置超时时间。

3.8 Security(安全机制)

如果config server使用的是HTTPS,则需要在url上指定用户名和密码,或者使用单独的username和password属性设置。如下(bootstrap.yml)

1 spring:
2   cloud:
3     config:
4      uri: https://user:secret@myconfig.mycompany.com
1 spring:
2   cloud:
3     config:
4      uri: https://myconfig.mycompany.com
5      username: user
6      password: secret

spring.cloud.config.password 和 spring.cloud.config.username会覆盖url中的用户名和密码。

好了,spring cloud config就先讲到这。下一篇就是spring cloud netflix。如果文章中写的有问题的希望各位读者批评指出。如果觉得在我这学到了点东西的,特别希望您能动动可爱的小手给点个赞!^_^

转载于:https://www.cnblogs.com/CLAYJJ/p/9633109.html

相关文章:

CodeOnly

关于设置[Key]标志 要先添加 程序集的引用 在添加 using System.ComponentModel.DataAnnotations; 命名控件转载于:https://www.cnblogs.com/since87/archive/2013/06/09/3129399.html

继承和多态 2.0 -- 继承的六个默认成员函数

本文重要介绍普通继承中如何写派生类的六个默认成员函数&#xff0c;主要是针对在派生类中&#xff0c;如何调用基类的六个默认成员函数 需要说明的一点就是&#xff0c;如果子类中没有调用父类的函数时&#xff0c;系统会自动生成一个。 构造函数 子类中有父类的成员&#…

js 让鼠标右下角有一排小字_js布局中一排大字下面接着一排小字怎么打出来?...

展开全部可以使用 TypewriterJS 实现效果是这样 ,百度图片少了一部分&#xff0c;可以通过链接32313133353236313431303231363533e78988e69d8331333433626438看效果链接: 网页链接示例在这里: 网页链接文档地址: 网页链接使用步骤引用 TypewriterJShtmlcss.article__title {fon…

Hudson神奇的环境变量

Hudson神奇的环境变量 http://blog.sina.com.cn/s/blog_798f21a00100z6zw.html转载于:https://blog.51cto.com/myloveworld/950156

英语影视台词---四、Sideways

英语影视台词---四、Sideways 一、总结 一句话总结&#xff1a;杯酒人生 Sideways&#xff0c;大致意思是“偏离、倾斜、转向…”。很明显中文译名与英文原名并没有什么关联&#xff0c;《杯酒人生》这个名字&#xff0c;其实也可以译为《并肩前行》&#xff0c;应该是从影片内…

继承和多态 3.0 -- 菱形继承

单继承和多继承 C的继承方式是支持单继承和多继承的&#xff0c;首先看一下代码&#xff0c;分清单继承和多继承 单继承 class A { public:int _a; };class B :public A { public:int _b; };class C : public A { public:int _c; }; 类似于上面的方式就是单继承&#xff0c;或…

C# split 几种使用方法

第一种方法&#xff1a; string s "abcdeabcdeabcde"; string[] sArray s.Split(c); foreach (string i in sArray) Console.WriteLine(i.ToString()); Console.ReadKey();输出下面的结果:abdeabdeabd…

模糊匹配 读音_onenote搜索机制详解②:两种搜索模式,模糊与精确匹配

先从纯文本搜索讲起&#xff0c;这是最基本也是最重要的。从这篇开始&#xff0c;以及接下来连续几篇文章&#xff0c;都会介绍搜索的基础功能。注意&#xff0c;这几篇文章中谈论的都是基本的、正常的搜索功能&#xff0c;暂时不考虑Bug等因素。在很多软件&#xff08;例如wor…

EXT3与EXT4的主要区别

Linux kernel 自 2.6.28 开始正式支持新的文件系统 Ext4。 Ext4 是 Ext3 的改进版&#xff0c;修改了 Ext3 中部分重要的数据结构&#xff0c;而不仅仅像 Ext3 对 Ext2 那样&#xff0c;只是增加了一个日志功能而已。Ext4 可以提供更佳的性能和可靠性&#xff0c;还有更为丰富的…

Java IO 4 : RandomAccessFile

RandomAccessFile:   认识&#xff1a;java输入/输出流体系中功能最丰富的文件内容访问类 既可以读取文件内容&#xff0c;也可以向文件传输数据&#xff0c;并且支持“随机访问“的方式&#xff0c;程序可以跳转到任意地方来读写数据。 特点&#xff1a;与OutputStream/Writ…

二叉树 1.0 -- 创建二叉树、遍历二叉树、二叉树常见问题求解

树的结构主要是为了查找&#xff0c;这个主要是为了搜索&#xff0c;树的结构关注的不是增删查改 树 广义上面的树的结构我们不知道树的一个节点是有几个子节点的&#xff0c;所以这个时候我们需要定义的一种结构就是&#xff0c;一个节点的孩子是可以动态的增加的&#xff0…

impala 本年格式化时间_hive,hbase,impala之间的对比

hbase在三者中更注重的是存储&#xff0c;它实现了类似mysql的double write机制&#xff0c;但是它是一种NoSQL的数据库&#xff0c;并且是可以支持列式存储的&#xff0c;算是比较大的一个内存Hash表。hbase也采用了类似mysql中的mvcc的思想通过时间戳来做版本控制。hbase是在…

简单上手的游戏引擎

物理游戏引擎 GameSalad 转载于:https://www.cnblogs.com/sgdkg/archive/2013/06/14/3135882.html

Linux内核中关于定时器Timer的应用

2019独角兽企业重金招聘Python工程师标准>>> 在Touchscreen驱动中 1 声明 Ad7877.c (\linux-2.6.30.4\drivers\input\touchscreen): struct timer_list timer; /* P: lock */ 2 初始化 在函数 static int __devinit ad7877_probe(struct spi_device *spi) 中 执行 …

类加载过程中几个重点执行顺序整理

类的加载过程&#xff1a; 1、 JVM会先去方法区中找有没有相应类的.class存在。如果有&#xff0c;就直接使用&#xff1b;如果没有&#xff0c;则把相关类的.class加载到方法区 2、 在.class加载到方法区时&#xff0c;会分为两部分加载&#xff1a;先加载非静态内容&#xff…

二叉树 2.0 -- 非递归遍历

二叉树递归遍历存在的问题 如果我们的二叉树只有左子树&#xff0c;而且树的高度还很深的时候&#xff0c;这个时候递归调用遍历的时候&#xff0c;栈帧空间开辟的较大&#xff0c;很可能造成栈溢出。但是我们一个程序中&#xff0c;为堆分配的空间要比栈大的多&#xff0c;这…

田忌赛马贪心算法_田忌赛马 贪心算法

算法实验课回顾田忌赛马问题描述&#xff1a;你一定听说过田忌赛马的故事吧&#xff1f;如果3匹马变成n匹(n<100)&#xff0c;齐王仍然让他的马按照优到劣的顺序初赛&#xff0c;田忌可以按任意顺序选择他的赛马出赛。赢一局&#xff0c;田忌可以得到200两银子&#xff1b;输…

[转][小结][三种方法]实现WPF不规则窗体

实现WPF不规则窗体的三种常用的方法如下&#xff1a; 1.使用Blend等工具绘制一个不规则xaml&#xff0c;然后作为窗体的背景。这个可以参考xiaowei0705的这篇博文&#xff1a;WPF制作不规则的窗体 。 2.给window的Clip属性赋Path值。这个可以参考DebugLZQ前面的博文&#xff1a…

VirtualBox虚拟机网络连接设置的四种方式

这里我先给大家大致讲解下VBox的网络配置及应用。 VirtualBox的提供了四种网络接入模式&#xff0c;它们分别是&#xff1a;1、NAT 网络地址转换模式(NAT,Network Address Translation)2、Bridged Adapter 桥接模式3、Internal 内部网络模式4、Host-only Adapter 主机…

redis-deskmanager 连不上 虚拟机 - centos redis

1、没设置redis密码 &#xff1a; https://blog.csdn.net/HUXU981598436/article/details/54668779 2、关闭防火墙 转载于:https://www.cnblogs.com/Jomini/p/9650650.html

数据库1.0 -- 数据库的基本操作

安装数据库 安装数据库的时候我们需要安装三个软件&#xff0c;使用下面的命令&#xff0c;可能还会出现一些问题&#xff0c;关于数据库的安装&#xff0c;大家可以上网自行百度 yum install mysql yum install mysql-server yum install mysql-devel 我个人的理解大概是这…

12,缓冲运动。匀速运动停止条件

缓冲运动&#xff1a;iSpeed(iTarget-oDiv.offsetLeft)/7;速度离目标点越远&#xff0c;速度越大&#xff0c;离目标点越近速度越小&#xff1b; 只支持1px是最小单位&#xff0c;没有0.5px。所以当iSpeed为小数时如&#xff08;0.7&#xff09;&#xff0c;oDiv.style.LeftoDi…

如何配置mac的mysql环境_mac安装mysql数据库及配置环境变量

安装mysql下载mysql。我下载的是&#xff1a;mysql-8.0.11-macos10.13-x86_64.dmg双击打开mysql-8.0.11-macos10.13-x86_64.dmg&#xff0c;然后双击mysql-8.0.11-macos10.13-x86_64.pkg一路点击继续&#xff0c;傻瓜式安装&#xff0c;没什么好说的此处选择“Use Legacy Passw…

三层交换机vlan间访问(第一种方式)

真的是原创&#xff0c;但是得感谢Ys_routesim软件的制作方。我将命令调试后并进行了解释。若是属于侵权&#xff0c;请立即告知我。不过学习了网工后&#xff0c;大段解读源代码不属于侵权吧。呵呵。 交换机的三层交换实际是具有路由功能的交换机&#xff0c;比如思科的Cisco …

(转载)深入浅出设计模式——桥接模式(Bridge Pattern)

模式动机设想如果要绘制矩形、圆形、椭圆、正方形&#xff0c;我们至少需要4个形状类&#xff0c;但是如果绘制的图形需要具有不同的颜色&#xff0c;如红色、绿色、蓝色等&#xff0c;此时至少有如下两种设计方案&#xff1a; 第一种设计方案是为每一种形状都提供一套各种颜色…

数据库2.0 -- 数据类型和数据表的基本操作

mysql支持多种数据类型&#xff0c;一般可以分为&#xff0c;数值&#xff0c;日期时间和字符&#xff08;串&#xff09; 数值类型 日期和时间类型 字符串类型 创建数据表 我们首先应该明白的就是一个结构的问题&#xff0c;一个用户可以管理多个数据库&#xff0c;每个数据…

virtual hust 2013.6.20 数论基础题目 D - Just the Facts

题目&#xff1a;Just the Facts 思路&#xff1a;枚举10000素数内&#xff0c;各因子出现的次数&#xff0c;然后取模为10。因为0是由2和5构成的&#xff0c;所以2和5的幂单独讨论&#xff0c;同时由于2的幂肯定大于5的&#xff0c;所以我们最后要算的再乘上2的减去后的幂就可…

MySQL中字段约束有哪些_mysql字段约束

为了确保数据的完整性和唯⼀性&#xff0c;关系型数 据库通过约束机制来实现目。一. unique 唯一性约束值不可重复&#xff1b;二. not null 非空约束值不可为空&#xff1b;三. default 默认值约束当增加数据时没有插⼊值时&#xff0c;会自动插⼊默认值&#xff1b;四. chec…

关于软件测试中那点小事中的大道理

如果想让测试在公司的项目中发挥出它最大的价值&#xff0c;并不是招两个测试技术高手&#xff0c;或引入几个测试技术&#xff0c;而是测试技术对项目流 程的渗透&#xff0c;以及测试流程的改进与完善。虽然&#xff0c;当然测试行业前景乐观&#xff0c;许多中小企业也都在引…

每日一题 -- 11-1

一天十题选择&#xff0c;一天一道编程&#xff0c;一天一个面试题&#xff0c;一个一个剑指offer 排序是必须要掌握的一个算法&#xff0c;非常的重要 题目描述 有 n 个学生站成一排&#xff0c;每个学生有一个能力值&#xff0c;牛牛想从这 n 个学生中按照顺序选取 k 名学…