cloudConfigCentre

  应用服务除了实现系统功能,还需要连接资源和其他应用,经常有很多需要在外面配置的数据用于调整应用的行为,如切换不同的数据库,设置功能开关等。微服务的使用,就意味者要管理很多的服务实例,

但是如果没有配置中心那么配置的更新会变得很麻烦。

  spring-cloud-config就是一个配置中心,为外部配置提供了客户端和服务端的支持。基于config服务器就可以集中管理各种环境下的各种应用的配置信息。在springconfig中客户端和服务端与spring中的Environment和ProprtyuSource概念相匹配。config服务器默认的存储实现是GIT,这能够很容易的支持配置环境的标签版本,而且有各种工具方便的管理这些配置内容。Config配置服务还支持多种仓库的实现。

配置GIT:

  本来我是准备在我的云服务器上配置的,但是我想到了码云,所以我就在码云上开了个仓库,通过windows本地提交文件到这个仓库,因为”Please make sure you have the correct access rights and the repository exists“错误,所以记录下正确的流程。

1. 在码云上创建一个仓库。

2. 在本地init一个git仓库。

3.本地clone远程仓库地址。

4.生成pubkey,这一步什么也不用填写,一路回车即可。

 5.根据路径打开id_rsa.pub复制全部内容到码云的ssh公钥添加处,中间会有中文也没有关系,添加上即可。

 6.验证是否成功。

7.将配置文件提交到本地然后推到远程仓库。

 

 8.结果:

 配置ConfigServer:

 1 spring:
 2   application:
 3     name: configCentre
 4   cloud:
 5     config:
 6       server:
 7         git:
 8           uri: git@gitee.*/coreConfigCentre.git
 9           searchPaths: core
10           username: *11           
        password: *

 然后报错:

1 ***************************
2 APPLICATION FAILED TO START
3 ***************************
4 
5 Description:
6 
7 Failed to bind properties under 'spring.cloud.config.server.git' to org.springframework.cloud.config.server.environment.MultipleJGitEnvironmentProperties:
8 
9     Reason: com.jcraft.jsch.JSchException

之前还报错了connectionfactory是关于http连接的需要加上两个依赖:

 1      <!-- https://mvnrepository.com/artifact/org.eclipse.jgit/org.eclipse.jgit -->
 2         <dependency>
 3             <groupId>org.eclipse.jgit</groupId>
 4             <artifactId>org.eclipse.jgit</artifactId>
 5             <version>5.7.0.202003110725-r</version>
 6         </dependency>
 7         <!-- https://mvnrepository.com/artifact/com.jcraft/jsch -->
 8         <dependency>
 9             <groupId>com.jcraft</groupId>
10             <artifactId>jsch</artifactId>
11             <version>0.1.55</version>
12         </dependency>
1 2020-03-24 08:46:09.772 DEBUG 17080 --- [nio-8091-exec-1] .s.c.c.s.s.GitCredentialsProviderFactory : Constructing UsernamePasswordCredentialsProvider for URI https://gitee.com/YangShengQiangWWw/coreConfigCentre.git
2 2020-03-24 08:46:11.018  WARN 17080 --- [nio-8091-exec-1] .c.s.e.MultipleJGitEnvironmentRepository : Error occured cloning to base directory.
3 
4 Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

上面的错误很常见,是https连接无法验证证书:

  1.导出证书从https://gitee.com/YangShengQiangWWw/coreConfigCentre.git。

  2.进入C:\Program Files\Java\jdk1.8.0_201\jre\lib\security,并执行下面的命令:

1           keytool -import -alias cacerts 
2                 -keystore cacerts #注意如果是全路径包含空格会报错,需要cd到cacerts路径下,然后直接查找,否则找不到
3                 -file H:\gitee.cer #你的证书位置
4                 -trustcacerts #要求输入密钥,密钥为changeit

ok,如果你的用户名和密码没有问题,那么此时进入配置服务器拉去配置信息就会得到如下的内容:

但是这样是有问题的,propertysources中应该显示居体的详细信息,但是为空,修改配置文件如下:

   再次拉取propertysources属性仍然为空。

Spring Cloud Config changes the files of Git to REST interfaces,so when i want access http://127.0.0.1:8091/cloud/dev,i should see the infomation of propertySources'version,but i had‘t see it, why?

 1 public class JGitEnvironmentRepository extends AbstractScmEnvironmentRepository implements EnvironmentRepository, SearchPathLocator, InitializingBean {
 2     public static final String MESSAGE = "You need to configure a uri for the git repository.";
 3     private static final String FILE_URI_PREFIX = "file:";
 4     private static final String LOCAL_BRANCH_REF_PREFIX = "refs/remotes/origin/";
 5     private int timeout;
 6     private int refreshRate = 0;
 7     private long lastRefresh;
 8     private boolean cloneOnStart;
 9     private JGitEnvironmentRepository.JGitFactory gitFactory = new JGitEnvironmentRepository.JGitFactory();
10     private String defaultLabel;
11     private GitCredentialsProviderFactory gitCredentialsProviderFactory = new GitCredentialsProviderFactory();
12     private TransportConfigCallback transportConfigCallback;
13     private boolean forcePull;
14     private boolean initialized;
15     private boolean deleteUntrackedBranches;
16     private boolean skipSslValidation;

  spring cloud config 支持git,svn,本地文件系统,jdbc,Valut,所以找到git的configuration class:org.springframework.cloud.config.server.environment.JGitEnvironmentRepository,上图,看看是不是有哪些配置属性有误。经检查无误,是我的理解有误,正确的访问应该是下面:

 Config支持我们使用的请求的参数规则为:

  • / { 应用名 } / { 环境名 } [ / { 分支名 } ]
  • / { 应用名 } - { 环境名 }.yml
  • / { 应用名 } - { 环境名 }.properties
  • / { 分支名 } / { 应用名 } - { 环境名 }.yml
  • / { 分支名 } / { 应用名 } - { 环境名 }.properties

 上面这句话在刚开始我没太明白,后来仔细看了下明白了,这个规则指的是你配置文件的命名规则,因为searchPaths在application.yml中已经声明了,所以这里只需要关注接口的命名规则,对这里的命名规则其实就是config应用给我们指定的接口命名规则。

   比如你的配置文件叫a-b-c.yml,那么它对应的规则就是第一个规则,应用名a,环境名b,分支名c,http://127.0.0.1:8091/dev/cloud中dev对应的是接口的命名规则,cloud是你的前缀,ok服务器搭建完成。

 配置客户端:

  新建bootstrap.yml 添加如下内容:

 1 spring:
 2   cloud:
 3     config:
 4 
 5       discovery:
 6         enabled: true
 7         service-id: configCentre #配置中心的服务类型
 8       enabled: true
 9       fail-fast: true
10       profile: cloud
11       name: dev

  之前我在上面的第四行加上了leable:master,然后该服务请求的路径就按照上面的接口规则在最后面加上了/master,导致请求错误,所以你的配置文件yml名字中没有lable,就不要加上leable:master。按章你定义接口规则的方式取按需在bootstrap中添加属性,你每添加一个属性,springboot都会把它们自动比照规则去拼接get路径,代码永远是死的,所以它会把路径拼的乱七八糟,所以按照你命名时规则去添加spring.cloud.config下的属性。

 

 

好了客户端也配置好了。

springcloudConfig原理:

   Bootstrap上下文是springcloud提供的加载外部资源的配置文件,它的优先级高于应用上下文,但是不包括bootstrap.yml中声明的属性。

  在bootstrap.yml中声明的属性优先级非常低,可以被应用上下文属性所覆盖,可以作为默认值。

  但是bootstrap引用外部的资源文件的属性值优先性极高,理论上只有命令行参数可以覆盖该属性,

  如果想让应用上下文可以覆盖bootstrap上下文需要在外部属性源中设置:spring.cloud.config.allowOverride=true。注意这个属性只能在远程属性源中设置,在本地设置无效。

       springcloud中默认的bootstrap属性源是spring cloud config server,这个东西就是配置中心。

posted @ 2020-03-23 21:02  永不熄灭的火  阅读(356)  评论(0编辑  收藏  举报