1.config

1.1定义

对于分布式微服务,有很多的配置,那么修改起来很麻烦。这就需要对这些配置文件进行集中式的管理,config的功能就是用来统一管理配置文件的。
它为微服务提供集中化的外部配置支持,配置服务器为各个不同的微服务的所有环境提供了中心化的外部配置。它也分为服务端和客户端。

1.2项目开发

源代码:https://github.com/zhongyushi-git/cloud-config.git

1.2.1服务端配置

1)在github上创建服务配置的仓库spring-cloud-server-config

2)把仓库克隆到本地

git clone https://github.com/zhongyushi-git/spring-cloud-server-config.git

3)在spring-cloud-server-config目录下创建配置文件application.yml

注意,配置文件必须以utf-8编码保存。

#指定激活哪个配置
spring:
profiles:
active: dev #开发环境配置
---
spring:
profiles: dev
application:
name: cloud-config-dev #参测试环境配置
---
spring:
profiles: test
application:
name: cloud-config-test

4)把创建的yml推送到github上

git add .
git commit -m 'first commit'
git push

5)创建父模块cloud-config,创建子模块cloud-config-server3344

<?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.zys.cloud</groupId>
<artifactId>cloud-config</artifactId>
<packaging>pom</packaging>
<version>1.0-SNAPSHOT</version>
<modules>
<module>cloud-config-server3344</module>
</modules> <!--统一管理jar包版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<junit.version>4.12</junit.version>
<lombok.version>1.16.18</lombok.version>
<log4j.version>1.2.17</log4j.version>
<mysql.version>5.1.47</mysql.version>
<druid.version>1.1.16</druid.version>
<mybatis.spring.boot.version>1.3.0</mybatis.spring.boot.version>
</properties> <!-- 依赖管理,父工程锁定版本-->
<dependencyManagement>
<dependencies>
<!--spring boot 2.2.2-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.2.2.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud Hoxton.SR1-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Hoxton.SR1</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--spring cloud alibaba 2.1.0-->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-alibaba-dependencies</artifactId>
<version>2.1.0.RELEASE</version>
<type>pom</type>
<scope>import</scope>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis.spring.boot.version}</version>
</dependency>
<!--junit-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>${log4j.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</dependency>
</dependencies>
</dependencyManagement> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<fork>true</fork>
<addResources>true</addResources>
</configuration>
</plugin>
</plugins>
</build> </project>

父模块pom

6)子模块3344导入依赖

<dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--config-server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency> </dependencies>

7)yml配置

server:
port: 3344 spring:
application:
name: cloud-config-server
cloud:
config:
server:
git:
#github仓库上面的git仓库名字
uri: https://github.com/zhongyushi-git/spring-cloud-server-config.git

8)在com.zys.cloud包下创建启动类

package com.zys.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.config.server.EnableConfigServer; @SpringBootApplication
@EnableConfigServer
public class ConfigServerMain3344 {
public static void main(String[] args) {
SpringApplication.run(ConfigServerMain3344.class, args);
}
}

9)hosts添加映射

127.0.0.1  config-3344.com

10)启动测试

配置读取规则 

/{application}/{profile}[/{label}]
/{label}/{application}-{profile}.yml
/{application}-{profile}.yml

启动3344,在浏览器分别输入

http://config-3344.com:3344/application/dev/master
http://config-3344.com:3344/application-dev.yml
http://config-3344.com:3344/master/application.dev.yml

都可以看到相关的配置信息,此时已完成从github上读取配置信息。    

1.2.2客户端配置

1)在spring-cloud-server-config目录下创建配置文件cloud-config-client.yml

注意,配置文件必须以utf-8编码保存。

spring:
profiles:
active: dev ---
server:
port: 8021 spring:
profiles: dev
application:
name: cloud-config-client ---
server:
port: 8022 spring:
profiles: test
application:
name: cloud-config-client

2)把创建的yml推送到github上

3)创建模块cloud-config-client3355

此模块用于连接config服务测试。

4)pom导入依赖

 <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--config客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>

5)yml配置

bootstrap.yml:系统级别的配置,优先级更高
application.yml:用户级别的配置

spring:
cloud:
config:
#指定从github读取的配置文件的名称,不加后缀名
name: cloud-config-client
#指定访问的配置环境
profile: dev
label: master
uri: http://config-3344.com:3344

bootstrap.yml

spring:
application:
name: cloud-config-client

application.yml

6)在com.zys.cloud包下创建启动类

package com.zys.cloud;

import javafx.application.Application;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication
public class ConfigClientMain3355 {
public static void main(String[] args) {
SpringApplication.run(ConfigClientMain3355.class, args);
}
}

7)在com.zys.cloud包下创建测试接口ConfigClientTest

package com.zys.cloud;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController; @RestController
public class ConfigClientTest { @Value("${spring.application.name}")
private String applicationName; @Value("${server.port}")
private String serverPort; @GetMapping("/config")
public String test(){
String str="applicationName: "+applicationName+"\t"+"serverPort:"+serverPort;
return str;
} }

8)hosts添加映射

127.0.0.1  config-client.com

9)启动测试  

先启动3344,然后3355启动。访问http://config-client.com:8021/config可以看到相关的返回信息。

1.2.3动态刷新配置

动态刷新是说,当我们修改了spring-cloud-server-config目录下的配置文件时,项目会动态的刷新配置。但是会出现一个问题,就是只要修改了配置文件,还要重启3355才能使用最新的配置。这样会重复的启动服务,比较麻烦,有一种不重启服务的方法就是手动的刷新配置。

1)在3355中添加一个访问接口,用于访问配置的信息

  @Value("${config.info}")
private String info; @GetMapping("/config2")
public String test2(){
String str="info: "+info;
return str;
}

2)修改spring-cloud-server-config目录下配置文件cloud-config-client.yml

config:
info: version1

3)把这个文件推送到github上,然后启动3344,最后3355启动。访问http://config-client.com:8021/config2,此时会看到返回的信息是info: version1。

4)再修改spring-cloud-server-config目录下配置文件cloud-config-client.yml,把version1改为version2,然后推送到github。不重启3355。访问http://config-client.com:8021/config2,返回的信息还是info: version1。

5)使用postman发送一条post请求给服务3355

http://localhost:8021/actuator/refresh

发送请求的原因就是通知3355服务,去拉取最新的配置。需要注意的是,这里3355使用的端口是根据配置文件来的,是8021。

6)再访问http://config-client.com:8021/config2,返回的信息就为info: version2。

从这里可以看出,并没有重启服务,只是手动发送了一条请求,就实现了动态的刷新。

1.2.4项目实战

在1.2.2中,配置服务端只是一个测试的demo,并没有结合项目,在实际开发中不需要此模块。这一小节就简单的结合项目进行统一配置。

(1)配置版eureka服务

1)创建子模块cloud-config-eureka-server7001

2)pom导入

 <dependencies>
<!--eureka server-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-server</artifactId>
</dependency>
<!--boot web actuator-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--config客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency> </dependencies>

3)yml配置

bootstrap.yml主要指定github上面的配置文件名称,而application.yml指定应用的名称,两者必不可少。

spring:
cloud:
config:
#指定从github读取的配置文件的名称,不加后缀名
name: cloud-config-eureka-client
#指定访问的配置环境
profile: dev
label: master
uri: http://config-3344.com:3344

bootstrap.yml

spring:
application:
name: cloud-config-eureka-client

application.yml

4)在com.zys.cloud包下创建启动类

package com.zys.cloud;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.netflix.eureka.server.EnableEurekaServer; @SpringBootApplication
@EnableEurekaServer
public class ConfigEurekaMain7001 {
public static void main(String[] args) {
SpringApplication.run(ConfigEurekaMain7001.class, args);
}
}

5)在pring-cloud-server-config目录下创建配置文件cloud-config-eureka-client.yml

spring:
profiles:
active: dev ---
server:
port: 7001 spring:
profiles: dev
application:
name: cloud-config-eureka-client eureka:
instance:
#eureka服务端的实例名称
hostname: localhost
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/ ---
server:
port: 7002 spring:
profiles: test
application:
name: cloud-config-eureka-client eureka:
instance:
#eureka服务端的实例名称
hostname: localhost
client:
#false表示不向注册中心注册自己
register-with-eureka: false
#false表示自己端就是注册中心,我的职责就是维护服务实例,并不需要去检索服务
fetch-registry: false
service-url:
#设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/

此文件是eureka的配置,由原来在项目中的配置到现在提出来放到github上配置。创建完成后提交到github。

6)运行测试

启动3344,然后再启动eureka7001,浏览器输入http://127.0.0.1:7001/可以正常访问eureka页面。

(2)配置版服务提供者

1)创建子模块cloud-config-provider8001

2)pom导入

 <dependencies>
<!--web-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!--引入自己定义的模块-->
<dependency>
<groupId>com.zys.cloud</groupId>
<artifactId>cloud-api-common</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
<!--mysql-connector-java-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--eureka-client-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!--config客户端-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
</dependencies>

3)yml配置

spring:
cloud:
config:
#指定从github读取的配置文件的名称,不加后缀名
name: cloud-config-provider-client
#指定访问的配置环境
profile: dev
label: master
uri: http://config-3344.com:3344

bootstrap.yml

spring:
application:
name: cloud-config-provider-client

application.yml

bootstrap.yml主要指定github上面的配置文件名称,而application.yml指定应用的名称,两者必不可少。

4)创建接口和相关的类,见源码

5)在pring-cloud-server-config目录下创建配置文件cloud-config-provider-client.yml

spring:
profiles:
active: dev ---
server:
port: 8001 spring:
profiles: dev
application:
name: cloud-config-provider-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver #mysql驱动包
url: jdbc:mysql://localhost:3306/db2020?useUnicode=true&characterEncoding-utr-8&useSSL=false
username: root
password: 123456 mybatis:
mapper-locations: classpath:mapper/*.xml
#所有Entity别名类所在包
type-aliases-package: com.zys.cloud.entity #把客户端注册到服务列表中
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7001/eureka/
#设置入驻的服务的名称,是唯一的
instance:
instance-id: cloud-config-provider8001
#访问路径显示ip
prefer-ip-address: true ---
server:
port: 8001 spring:
profiles: test
application:
name: cloud-config-provider-client
datasource:
type: com.alibaba.druid.pool.DruidDataSource #当前数据源操作类型
driver-class-name: org.gjt.mm.mysql.Driver #mysql驱动包
url: jdbc:mysql://localhost:3306/db2021?useUnicode=true&characterEncoding-utr-8&useSSL=false
username: root
password: 123456 mybatis:
mapper-locations: classpath:mapper/*.xml
#所有Entity别名类所在包
type-aliases-package: com.zys.cloud.entity #把客户端注册到服务列表中
eureka:
client:
#表示是否将自己注册进EurekaServer默认为true
register-with-eureka: true
#是否从EurekaServer抓取已有的注册信息,默认为true。单节点无所谓,集群必须设置为true才能配合ribbon使用负载均衡
fetch-registry: true
service-url:
defaultZone: http://localhost:7002/eureka/
#设置入驻的服务的名称,是唯一的
instance:
instance-id: cloud-config-provider8001
#访问路径显示ip
prefer-ip-address: true

此文件是服务提供者8001的配置,由原来在项目中的配置到现在提出来放到github上配置。创建完成后提交到github。

6)运行测试

启动3344,然后再启动eureka7001,最后启动8001,浏览器输入http://localhost:8001/user/get/1可以正常访问数据。

从这里可以看出,在项目中的yml并没有具体的配置。把配置进行统一的管理,如果需要修改配置文件,只需要把github上的配置项目拉取下来修改后再提交即可。

2.bus(消息总线)

2.1定义

对于上面config的项目,我们只能通过手动的方式进行动态刷新配置,而如果同时修改了多个配置文件,那么就要进行多次的手动刷新,而bus可以实现一次刷新,在其他的服务中不需要再刷新就可生效。也就是说,它是一个把分布式分摊的节点与轻量级消息系统链接起来的框架,整合了java的事件处理机制和消息中间件的功能,目前仅支持RabbitMQ和Kafka。它能管理和传播分布式系统间的消息,可用于广播状态更改、事件推送等。

基本原理:ConfigClient实例都监听MQ中同一个topic。当一个服务刷新数据时,就会把这个信息放入topic中,这样其他监听同一topic的服务就能得到通知,然后去更新各自的配置。

设计思想:利用消息总线触发一个服务端ConfigServer的/bus/refresh端点从而来刷新客户端的配置。

2.2项目开发

本项目在config项目的基础上进行开发。

(1)环境配置

在使用bus之前,必须先安装erlang和RabbitMQ。erlang的安装和RabbitMQ的安装请参考https://www.cnblogs.com/zys2019/p/12828152.html

(2)3344服务添加消息总线支持

1)添加依赖

  <!--添加消息总线RbbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2)yml配置

(3)3355服务添加消息总线支持

1)添加依赖

  <!--添加消息总线RbbitMQ支持-->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-bus-amqp</artifactId>
</dependency>

2)bootstrap.yml配置

spring:
cloud:
config:
#指定从github读取的配置文件的名称,不加后缀名
name: cloud-config-client
#指定访问的配置环境
profile: dev
label: master
uri: http://config-3344.com:3344
#rabbit相关配置
rabbitmq:
host: localhost
port: 5672
username: guest
password: guest #rabbitmq相关配置,暴露端点
management:
endpoints:
web:
exposure:
include: '*'

(4)启动测试

1)先启动3344,然后启动3355。访问http://config-client.com:8021/config2,此时会看到返回的信息是info: version2。

2)再修改spring-cloud-server-config目录下配置文件cloud-config-client.yml,把version2改为version3,然后推送到github。不重启3355。访问http://config-client.com:8021/config2,返回的信息还是info: version2。

3)使用postman发送一条post请求给服务3344去刷新配置中心服务

http://localhost:3344/actuator/bus-refresh

4)再访问http://config-client.com:8021/config2,返回的信息就为info: version3。这里并没有给3355服务发送post请求,也实现了动态的刷新,这就是bus的广播。如果想验证bus的广播,可以再新建一个3366的client,配置同3355,只是端口号不一样,然后可以实现同样的效果。

SpringCloud之服务配置的更多相关文章

  1. 【微服务】之三:从零开始,轻松搞定SpringCloud微服务-配置中心

    在整个微服务体系中,除了注册中心具有非常重要的意义之外,还有一个注册中心.注册中心作为管理在整个项目群的配置文件及动态参数的重要载体服务.Spring Cloud体系的子项目中,Spring Clou ...

  2. 从零开始,轻松搞定SpringCloud微服务系列

    本系列博文目录 [微服务]之一:从零开始,轻松搞定SpringCloud微服务系列–开山篇(spring boot 小demo) [微服务]之二:从零开始,轻松搞定SpringCloud微服务系列–注 ...

  3. SpringCloud与微服务Ⅹ --- SpringCloud Config分布式配置中心

    一.SpringCloud Config是什么 分布式系统面临的问题 --- 配置问题 微服务意味着要将单体应用中的业务拆分成一个个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个 ...

  4. 七. SpringCloud服务配置

    1. SpringCloud Config概述 1.1 分布式系统面临的配置问题 微服务意味着要将单体应用中的业务拆分成一个一个子服务,每个服务的粒度相对较小,因此系统中会出现大量的服务.由于每个服务 ...

  5. 【SpringCloud构建微服务系列】使用Spring Cloud Config统一管理服务配置

    一.为什么要统一管理微服务配置 对于传统的单体应用而言,常使用配置文件来管理所有配置,比如SpringBoot的application.yml文件,但是在微服务架构中全部手动修改的话很麻烦而且不易维护 ...

  6. SpringCloud微服务(06):Config组件,实现配置统一管理

    本文源码:GitHub·点这里 || GitEE·点这里 一.Config简介 在微服务系统中,服务较多,相同的配置:如数据库信息.缓存.参数等,会出现在不同的服务上,如果一个配置发生变化,需要修改很 ...

  7. springcloud(十二)-springcloud-config统一管理微服务配置

    1.为什么要统一管理微服务配置 对于传统的单体应用,常使用配置文件管理所有配置.例如一个SpringBoot开发的单体应用,可将配置内容放在application.yml文件中.如果需要切换环境,可设 ...

  8. SpringCloud+Consul 服务注册与服务发现

    SpringCloud+Consul 服务注册与服务发现 1. 服务注册: 在Spring.factories有一段: # Discovery Client Configuration org.spr ...

  9. springcloud(七):配置中心svn示例和refresh

    上一篇springcloud(六):配置中心git示例留了一个小问题,当重新修改配置文件提交后,客户端获取的仍然是修改前的信息,这个问题我们先放下,待会再讲.国内很多公司都使用的svn来做代码的版本控 ...

随机推荐

  1. Joomla 3.4.6 RCE复现及分析

    出品|MS08067实验室(www.ms08067.com) 本文作者:whojoe(MS08067安全实验室SRST TEAM成员) 前言 前几天看了下PHP 反序列化字符逃逸学习,有大佬简化了一下 ...

  2. HBase 数据迁移方案介绍(转载)

    原文链接:https://www.cnblogs.com/ballwql/p/hbase_data_transfer.html 一.前言 HBase数据迁移是很常见的操作,目前业界主要的迁移方式主要分 ...

  3. 2019icpc徐州站 Cat 计蒜客 - 42540 && The Answer to the Ultimate Question of Life, The Universe, and Everything. 计蒜客 - 42545

    VJ链接:https://vjudge.net/contest/412095#problem/A Cat 计蒜客 - 42540 题意: 给你一个区间[L,R],给你现在拥有的钱S.你需要从[L,R] ...

  4. Codeforces Round #651 (Div. 2) E. Binary Subsequence Rotation(dp)

    题目链接:https://codeforces.com/contest/1370/problem/E 题意 给出两个长为 $n$ 的 $01$ 串 $s$ 和 $t$,每次可以选择 $s$ 的一些下标 ...

  5. 【poj 1961】Period(字符串--KMP 模版题)

    题意:给你一个字符串,求这个字符串到第 i 个字符为止的重复子串的个数. 解法:判断重复子串的语句很重要!!if (p && i%(i-p)==0) printf("%d % ...

  6. KMP && Manacher && 扩展KMP整理

    KMP算法: kmp示例代码: void cal_next(char *str, int *next, int len) { next[0] = -1;//next[0]初始化为-1,-1表示不存在相 ...

  7. Redis全面解析

    1.什么是Redis? Redis是BSD协议,是一个高性能的key-value非关系型数据库. 2.redis单线程问题 所谓的单线程指的是网络请求模块使用了一个线程(所以不需考虑并发安全性),即一 ...

  8. Maven与Nexus3.x环境构建详解

    一.Maven介绍Apache Maven是一个创新的软件项目管理和综合工具.Maven提供了一个基于项目对象模型(POM)文件的新概念来管理项目的构建,可以从一个中心资料片管理项目构建,报告和文件. ...

  9. mybaits(十)mybatis常见面试

      面试题总结 1.MyBatis 解决了什么问题? 或:为什么要用 MyBatis? 或:MyBatis 的核心特性? 1)资源管理(底层对象封装和支持数据源) 2)结果集自动映射 3)SQL 与代 ...

  10. hdu5303贪心

    http://acm.hdu.edu.cn/showproblem.php?pid=5303 说一下题目大意.. 有一个长为L的环..你家在原点位置0,那么剩下L-1个点上种有一些树, 给你树的位置和 ...