25、SpringCloud整合配置中心

259 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第25天,点击查看活动详情

25、SpringCloud整合配置中心

本节将讲述 Spring Cloud Config 与其他框架的整合 Zuul 等。

1、准备工作

本节的案例主要涉及5个项目,这些项目的大概信息如下:

  • eureka-server: Eureka 服务器,端口为 8761
  • Eureka-config-server :配置服务器,同时也是 Eureka 客户端,端口为 8899
  • Eureka-config-client :配置客户端,同时也是 Eureka 客户端,端口为 8081 ,在本例 充当普通的服务实例角色。
  • eureka-zuul :集群网关,既是 Eureka 客户端,也是配置客户端,会到配置服务器抓取路由规则,端口为 9000
  • eureka-bus :在本例中,它主要向消息中间件 CRabbitMQ 等)发送消息,通知所有的节点更新配置,端口为 10000。

以上项目对应的结构请见图 9-4。

image.png

图 9-4 展示了本例中的 5 个项目在集群中的职责及位置,项目名称下括号中的内容为对应项目的端口号。需要注意的是, eureka-zuul 项目既是配置客户端,也是集群的网关,它会去配置服务器获取路由配置。

2、配置服务器、客户端整合Eureka

配置服务器为 srl-configure-server 项目,pom.xml 如下: 核心是 spring-cloud-config-server,spring-cloud-starter-config,spring-cloud-starter-eureka,svnkit 这四个依赖。 配置服务器上启动类上添加注解:

@SpringBootApplication
@EnableConfigServer
@EnableEurekaClient

POM文件:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-config-server</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-config</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-eureka</artifactId>
        </dependency>
        <dependency>
            <groupId>org.tmatesoft.svnkit</groupId>
            <artifactId>svnkit</artifactId>
            <version>1.9.0</version>
        </dependency>

        <!--配置服务器安全配置-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
            <version>1.5.12.RELEASE</version>
        </dependency>
    </dependencies>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Dalston.SR1</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>

配置文件如下:

#配置端口
server.port=8888
#指定应用名称
spring.application.name=configure-server
#默认情况下,很多端点需要认证才能访问,关闭认证,默认开启 true
management.security.enabled=false
#让配置服务器连接SVN 默认git:git仓库。
spring.profiles.active=subversion
#SVN服务器的uri,仓库地址是test_project,  SVN服务器默认会在前面加一个/svn/
spring.cloud.config.server.svn.uri=https://localhost/svn/test_project
#SVN服务器的用户名 密码
spring.cloud.config.server.svn.username=root
spring.cloud.config.server.svn.password=root
#配置获取配置文件的目录,默认test_project/trunk,test_project是上面配置的仓库路径
spring.cloud.config.server.default-label=default-config

#配置本服务示例的主机名称
eureka.instance.hostname=localhost
#指定服务注册中心地址,为集群时,多个地址以逗号分隔
eureka.client.serviceUrl.defaultZone=http://slave1:8761/eureka/,http://slave2:8762/eureka/

配置服务器的 bootstrap.properties 与前面章节中的类似,仅加入了 eureka 注册的配置。接下来,对客户端( eureka-config-client )项目进行配置,该项目的 pom.xml 中引入 spring-cloud-starter-config, spring-cloud-starter-eureka, spring-boot-starter-actuator, spring-cloud-starter-bus-amqp 这四个依赖 。由于配置客户端会作为一个消息消费者接收 RabbitMQ 发送的消息,因此要使用 amqp 的依赖。 该项目的 POM文件如下:

客户端启动类上添加注解:

@SpringBootApplication
@RestController
@EnableEurekaClient

POM文件:

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>1.5.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-config</artifactId>
        <version>1.4.3.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-actuator</artifactId>
        <version>1.5.4.RELEASE</version>
    </dependency>

    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-eureka</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.cloud</groupId>
        <artifactId>spring-cloud-starter-bus-amqp</artifactId>
    </dependency>

    <!--客户端连接配置中心 错误提前 与重试-->
    <dependency>
        <groupId>org.springframework.retry</groupId>
        <artifactId>spring-retry</artifactId>
        <version>1.2.2.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
        <version>1.5.4.RELEASE</version>
    </dependency>
</dependencies>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-dependencies</artifactId>
            <version>Dalston.SR1</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

bootstrap.properties 文件:

#指定应用名称
spring.application.name=book-server
#指定配置服务器的位置
#spring.cloud.config.uri=http://localhost:8888
#指定读取的配置  -- dev pro test 文件名后半部分  多个逗号分隔
spring.cloud.config.profile=test
#默认情况下,很多端点需要认证才能访问,关闭认证,默认开启 true
management.security.enabled=false
#配置获取配置文件的目录,默认使用config服务器里的配置
spring.cloud.config.server.default-label=book-module

#指定读取的配置文件名称  -- 多个逗号分隔
spring.cloud.config.name=first

#开启客户端发现配置服务器的功能
spring.cloud.config.discovery.enabled=true
#配置服务在注册中心的service-id
spring.cloud.config.discovery.service-id=configure-server

注意粗体部分的配置。 由于配置服务器已经注册到 Eureka 中,完全有可能部署多个配 置服务实例,因此开启客户端的配置发现功能 让客户端去发现、使用配置服务器的服务 相对于之前的直接配置IP地址,使用 service-id 来配置服务可以使服务器与客户端之间的 关系变得松散,也增加了灵活性。

测试:

 // import org.springframework.core.env.Environment;
  @Autowired
  private Environment env;

  @RequestMapping("/")
  public String home() {
      System.out.println("读取的值:" + env.getProperty("test.user.name"));
      return "Hello";
  }

first-test.properties : SVN上的该文件 test.user.name 可正常输出,

image.png

3、整合Zuul

上图所示的结构图,eureka-zuul项目实际上也是一个配置客户端,它会去配置服务器中获取路由配置。其取得路由配置后,调用配置客户端提供的 /refresh端点来刷新配置,这样就可以实现动态路由功能。

网关项目的配置基本与前面的配置客户端(eureka-config-client项目)类似,同样使用service-id来查找配置服务器。细心的读者可能会发现,作为网关项目,配置中却没有任何路由配置。为了实现动态路由,该项目的路由配置都放到了SYN中。新建一份eureka-zuul-rel.yml配置文件,上传到https://localhost/svn/test-project/eureka目录,配置文件的内容如下:

zuul:
  routes:
    routeTest:path:/routeTest
      url:http://www.sohu.com

当访问 http://localhost:9000/routeTest时,会自动路由到 www.sohu.com。依次启动Eureka服务器、配置服务器、网关,访问http://localhost:… 修改SYN上面的配置文件,让其跳转到163网站,修改完成井上传SYN后,向http://localhost:9000/refresh端点发送POST请求刷新配置。完成后再次访问/routeTest,成功跳转到163网站。在整个过程中都不需要对任何节点进行重启操作,只需要访问/refresh端点即可完成。