springcloudconfig--基于JDBC数据库配置
Spring Cloud Config
Spring Cloud Config为分布式系统中的外部配置提供服务端和客户端⽀持,所谓的服务端是⽤⼀台,或者⼀组(为实现⾼可⽤)机器实现从某个固定的地⽅,默认是git,也可以是其它版本控制⼯具如SVN,⽂件服务器,或者JDBC等源头获取配置信息。然后给多个客户端使⽤,做到统⼀配置。
⼀、先动⼿,创建Spring Cloud Config Server
1、建⽴Spring boot项⽬,建⽴的时候除了勾选web,再勾选⼀个cloud config -> config server
2、配置application.l)
在创建完项⽬之后,需要等待maven加载依赖,不然⽆法进⾏下⼀步。我这⼀步经常卡住,可能是⽹络渣渣,然后我会将idea中下载maven的progress停⽌掉。去⽂件所在⽬录中敲mvn命令更新,⼀般会很快。然后回过头来有可能停⽌maven的操作还卡在那⾥,索性关掉idea重新打开就好了。
到这⾥我们停⼀下,稍微看下源码,spring cloud有⼏种配置⽅式,都在下图⾥了。
默认是使⽤git来配置,git这个东西不太会⽤,其实⽤来讲spring cloud config程度的“会⽤”我还是会的,只是发现好特么卡。我们可以使⽤本地配置,svn配置,或者数据库配置。其实⼤同⼩异。git、svn配置的不讲,⼤家⾃⼰去百度搜,基于JDBC的着重再讲⼀下。先从最简单的本地配置开始。
#指定应⽤程序名称
spring.application.name=config-server
#指定端⼝
server.port=8888
#指定配置⽅式是本地⽂件
spring.profiles.active=native
#配置⽂件的⽬录
fig.server.native.search-locations=D:/spring-config/config-file
我们去D盘下,建这两个⽬录,然后按照xx-xxx的命名规则,建⼀个.properties的配置⽂件。⽐如我们叫做config-dev.properties。
3、打开Application.java,添加⼀句@EnableConfigServer,开启配置中⼼服务器选项。
4、浏览器⾥⾯敲击localhost:8888/config/dev,就可以看到是否能成功获取配置
扩展:
1、扩展名只能是.properties或者.yml
基于⽂件的叫别的扩展名是不⾏的,只能叫xxx.properties,或者l也可以。假设我们把config-dev.properties改成 就不⾏
2、即使不到也会有返回信息的
即使查询不到配置值,也会有返回信息,会把查询信息返回回来,所以要看后半段的"propertySources"是否为空。
3、⽬标⽂件应该长什么样
Spring配置规范,要求按照applicationName+profile+label组合的⽅式来存放配置资源,供客户端读取。其中label是可选的。配置源可以通过三种⽅式组织,restful,l,xx-xx.properties,也就
是⼀共包括6种⽅式,每⼀种都可缺省label的⽅式。其中jdbc通过restful组织,其它⽅式是基于⽂件系统的,通过后两种⽅式组织,注意这两种⽅式的label的位置是不相同,基于⽂件系统时候,label拼在上级⽬录的最后(不是⼀层新的⽬录,⽽是就拼在上级⽬录的最后,等于说是⽤来区分上级⽬录的,看到后⾯会明⽩)。
restful(jdbc)
application/profile[/label]
yml (基于⽂件系统)
[label/]l
properties (基于⽂件系统)
[label]/application-profile.properties
4、中⽂乱码
看上⾯的图,会发现中⽂是乱码。
原因:jdk加载properties时候使⽤的是ISO-8859-1的字符集。
1)分析:
我们看⼀下源码,Spring使⽤PropertiesPropertySourceLoader这个类加载.properties⽂件,顺着代码往上追,最后是调⽤
java.util.Properties的load⽅法。
java.util.properties中默认使⽤ISO-8859-1来解析,所以如果xml中出现中⽂是⽆法解析的。
2)解决⽅法1:
我们可以和PropertiesPropertySourceLoader这个类⼀样,实现⾃⼰的PropertySourceLoader接⼝,使⽤utf-8编码读取流。并通过spring boot的配置项org.v.figserver.MyPropertiesHandler 重新指定读取.propeties⽂件的类。
3)解决⽅法2:
还可以索性使⽤yml来实现,这个是通过utf-8来解析的。可能代表java不倾向于properties格式的配置
⽅式了,改⽤xml、yml这两种配置⽅式,这两种默认是utf-8的编码格式。
为了⽅便编写yml语句,可以通过在线yml编辑器,或者下载⼀款叫做Atom的编辑⼯具进⾏编辑。
5、label在不同模式下表现出的差异性
label可选。但是在不同的配置⽅式下,label表现出来不⼀样的效果,每⼀种模式都有⼀个⾃⼰实现的配置解析逻辑。在本地⽂件访问的时候,表现的特别奇怪。。。
经过查看源码,会发现并不是新增⼀层label的⽂件夹,⽐如localhost:8888/config/dev/test
我们新建⼀个test⽂件夹,把yml拷贝⼀份放进去,把name改成“⼩红”,新建⼀个test⽂件夹到"config-file"⽂件夹下。会发现访问不到。查看源码原来是要把config-file后⾯拼上label,就可以访问了(不是⼀层新的⽬录,⽽是就拼在上级⽬录的最后)。
6、profile这⼀层,会默认先不匹配,只匹配applicationName。如果有profile,会再匹配profile对不对。
先会把不带dev的这⼀层也会读取出来,假设我准备了两个⽂件l和l,都会读出来。
然后我们再复制⼀个config-test试试看,发现dev的是读取不出来的,只能读取出l和l,也就是先⽤applicationName去,然后如果有env,再⽤env去。
7、本地配置的作⽤,只是提供⼀个临时开发环境,最好不要⽤于⽣产。
Spring官⽅⽂档上说,label是⽤来在版本控制⼯具作为配置源的时候,确定版本分⽀的,并且可以⽤逗号分隔的⽅式配置多个,到任意⼀个都可以。
⽽native的初衷并不是⽤来配置的,是⽤来在开发时,⽅便本地模拟配置。应该使⽤成熟的基于⽂件系统的版本控制⼯具,如git和svn来实现。因为如果没有版本控制⼯具的⽀撑,需要我们⾃⼰实现事务、同步、版本控制,⽽git、svn天⽣拥有完美的事务、同步、版本控制的功能。也就是说spring-config期望从⼀个有版本控制的配置源来获取配置。本地数据只是⼀个临时解决⽅案。
另⼀种选择是使⽤数据库作为配置源,利⽤了数据库的同步性,实现复杂⼀些也能实现版本控制,并且更安全。
基于数据库的配置有⼀个缺点,数据库不容易表现出嵌套的属性。也可以,实现起来略微复杂。⽂件系统的话,使⽤properties或者yml,
可以很快实现嵌套关系,以及嵌套关系的修改。但是数据库⼀旦实现起来,稳定性会相对⾼⼀些。毕竟⽂件⾥可以胡乱输⼊,经常敲少了⼀
mysql下载配置个空格什么的,所以在⽂件中编辑,最好借助⾼级的⽂本编辑⼯具,或者格式检查⼯具。
8、yml格式的坑
上⾯留了⼀个坑,会发现上⾯的值是"document":"name ⼩明",理论上应该是"name":"⼩明"。上⾯的yml格式是错误的,标准的yml,属性
的冒号后⾯需要有个空格,然后⼦属性不需要空格,⼦属性往后缩进两个空格,⽽不是tab。类似下⾯的写法:
name: ⼤壮
age: 22
tt:
qq: 33
上⾯的冒号后⾯没加空格,加⼀下返回值就正确了。
⼆、创建spring cloud config客户端
1、客户端会根据⾃⾝的信息,拼接成url从服务器中拿属于⾃⼰的数据
通过fig.uri表⽰server的地址,fig.profile表⽰当前环境,figlabel表⽰标签,uri和spring.application.name和profile,label⼀起作为查询条件。
2、Spring Clound Config的获取配置所需要的信息需要写在bootstrap.l)中。
所以⼀些需要提前进⾏的操作,为保证提前执⾏,需要放在l中。如加密解密,获取配置信息。l中的数据不会
做其它操作,直接就当key value来读取。
It is typically used for the following:
when using Spring Cloud Config Server, you should specify spring.application.name and fig.server.git.uri l
some encryption/decryption information
Technically, l is loaded by a parent Spring ApplicationContext. That parent ApplicationContext is loaded before the one that l.
所以spring.application.name 和 相关的配置,应该丢到l中。配置如下:
#指定配置模式,⽬前是dev模式
spring:
application:
name: pricecompare
cloud:
config:
#指定配置服务中⼼地址
uri: localhost:8888/
#这个如果不写,会⽤spring.application.name
#name: ${spring.application.name}
profile: dev
#其它配置
# fail-fast: true
# username: user
# password: ${CONFIG_SERVER_PASSWORD:password}
# retry:
# initial-interval: 2000
# max-interval: 10000
# multiplier: 2
# max-attempts: 10
讲解l和l差别的帖⼦⽹上⼀搜⼀⼤把
3、准备⼀个使⽤到配置信息的Controller做测试
@RestController
public class TestController {
@Value(value = "${name}")
private String name;
@RequestMapping("hello")
public String hello(){
return "你好" + name;
}
}
输出:
三、从jdbc中获取配置信息
jdbc可以依赖数据库来实现数据同步,Spring并没有提供固定的配置页⾯,可以⾃⼰实现⽐较灵活的编辑、配置页⾯(写个前台,增删改查就⾏了,但要注意嵌套属性如何维护)
1、添加jdbc依赖
添加starter-jdbc和对应数据库的连接jar包,我们⽤mysql试⼀下。
<!-- JDBC -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- MYSQL -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
2、修改application.properties
改成jdbc,指定数据连接参数,指定查询sql,这⼀步有点好玩,后⾯会细讲⼀下
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论