SpringCloud之配置中心&swagger聚合

发布时间 2023-09-27 20:06:35作者: 九极致之术

1. 什么是服务配置中心

首先我们来看一下,微服务架构下关于配置文件的一些问题:

1. 配置文件相对分散。

在一个微服务架构下,配置文件会随着微服务的增多变的越来越多,而且分散 在各个微服务中,不好统一配置和管理。

2. 配置文件无法区分环境。

微服务项目可能会有多个环境,例如:测试环境、预发布环境、生产环 境。每一个环境所使用的配置理论上都是不同的,一旦需要修改,就需要我们去各个微服务下手动 维护,这比较困难。

3. 配置文件无法实时更新。

我们修改了配置文件之后,必须重新启动微服务才能使配置生效,这对一 个正在运行的项目来说是非常不友好的。 基于上面这些问题,我们就需要配置中心的加入来解决这些问题。

配置中心的思路是:

首先把项目中各种配置全部都放到一个集中的地方进行统一管理,并提供一套标准的接口。

当各个服务需要获取配置的时候,就来配置中心的接口拉取自己的配置。

当配置中心中的各种参数有更新的时候,也能通知到各个服务实时的过来同步最新的信息,使之动 态更新。

当加入了服务配置中心之后,我们的系统架构图会变成下面这样

 

【注: 咱们这次依然使用NacosConfig配置中心】

2. 使用Nacos配置中心

2.1 Nacos创建配置文件

在微服务,这里在serve微服务内pom文件内添加Nacos配置中心依赖:

<dependency>
    <groupId>com.alibaba.cloud</groupId>
    <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>

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

 

登录Nacos

 

2.2 项目微服务拉取配置中心文件

 打开idea进入SpringCloud项目:

随便找到一个微服务模块,在其resources包下创建一个名为bootstrap.yml配置文件

【注:一定要是bootstrap.yml】名字不可变!!!

在其中:bootstrap.yml:

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        shared-configs:
          - data-id: test.properties

 

 【注:bootstrap.yml是有默认值的,如果不写这个配置文件,那么它会默认以服务名.properties,Nacos地址默认:localhost:8848

 【注:比如说,如果你的微服务名称恰好及叫做test,那么,即使你不写bootstrap.yml配置文件,其也会自动匹配】

【注:所以以上写的bootstrap.yml配置类,是在微服务名称与配置中心的配置文件名称不一致时写的】

 

2.3 在不同开发环境下的配置中心文件

点击配置列表,点击右边+号,新建配置。在新建配置过程中,要注意下面的细节:

1)Data ID不能随便写,要跟配置文件中的对应,对应关系如图所示

2)配置文件格式要跟配置文件的格式对应,且目前仅仅支持YAML和Properties

3)配置内容按照上面选定的格式书

配置的信息:

Data ID :test-dev.properties(这个地方一定不能出错!!!!)

-dev指的是环境的标识

.properties是配置文件的格式

test是服务的名字

 【注:我们在开发时有着不同环境的需求,比如开发环境,测试环境等】

【注:那么配置中心的配置文件也要动态的改变,比如连接数据库的url就要动态的去改变】

【注:那么我们就该把那些需要动态改变的配置信息给提取出来,表示在不同的开发环境下依然不影响使用】

 

那么我们将动态修改的url配置信息单独拿出来

 

新建一个配置中心配置文件:test-dev.properties

【注:注意名字的格式:服务名-测试环境标识[test/dev].文件后缀名

将所需要动态修改的配置信息拿出来:

点击发布

 

 那么我们继续在项目中的微服务的bootstrap.yml进行配置些信息:

spring:
  cloud:
    nacos:
      config:
        server-addr: localhost:8848
        shared-configs:
          - data-id: test-dev.properties
          - data-id: test.properties

万事大吉

 那么在将其运用到所需的微服务模块配置类中,微服务会读取bootstrap.yml配置文件进行从Nacos配置中心拉取对应的配置文件

 

3. 网关添加swagger

在实际开发中,我们需要一份开发接口文档,那么通过以前所做,我们是在一个个项目中运用,如今换成微服务架构,那么这次我们将需要把这一个个微服务中的swagger聚合在一起。

变成一个统合体swagger,一份swagger,查看多个微服务的接口文档

 

 3.1 聚合swagger:

在网关的微服务中的pom文件添加swagger3的依赖:

     <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-boot-starter</artifactId>
            <version>3.0.0</version>
        </dependency>

        <dependency>
            <groupId>com.github.xiaoymin</groupId>
            <artifactId>swagger-bootstrap-ui</artifactId>
            <version>1.9.6</version>
        </dependency>

 

 在网关微服务中的config层中创建SwaggerConfig 配置类:

@Configuration
@EnableSwagger2
public class SwaggerConfig {
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo());
    }

    private ApiInfo apiInfo() {

        return new ApiInfoBuilder()
                .title("分布式管理系统")
                .description("分布式管理系统平台接口文档说明")
                .termsOfServiceUrl("http://localhost:8851") //网关的地址
                .contact(new Contact("xw", "", "xw@163.com"))
                .version("1.0")
                .build();

    }
}

 

 在网关微服务中的config层中继续创建DocumentConfig配置类:其实主要将微服务中的swagger聚合在一起

@Component
@Primary
public class DocumentConfig implements SwaggerResourcesProvider {


    @Override
    public List<SwaggerResource> get() {
        //获取  其他的微服务信息
        ArrayList<SwaggerResource> swaggerResources = new ArrayList<>();
        SwaggerResource OrderResource = new SwaggerResource();
        OrderResource.setName("订单信息order");
        OrderResource.setSwaggerVersion("2.0");
        OrderResource.setLocation("/order/v2/api-docs");
        swaggerResources.add(OrderResource);

        SwaggerResource LogResource = new SwaggerResource();
        LogResource.setName("登录信息Log");
        LogResource.setSwaggerVersion("2.0");
        LogResource.setLocation("/log/v2/api-docs");
        swaggerResources.add(LogResource);

        SwaggerResource ProdectResource = new SwaggerResource();
        ProdectResource.setName("商品信息Prodect");
        ProdectResource.setSwaggerVersion("2.0");
        ProdectResource.setLocation("/prodect/v2/api-docs");
        swaggerResources.add(ProdectResource);

        return swaggerResources;
    }

}

 

当然,可能还需要在管理微服务的serve服务中添加swagger依赖:

<!--引入swagger2依赖-->
<dependency>
    <groupId>com.spring4all</groupId>
    <artifactId>swagger-spring-boot-starter</artifactId>
    <version>1.9.1.RELEASE</version>
</dependency>

 

 【注:可能还需要将拦截器关闭,或者将/服务名/v2/api-docs 路径加入白名单即可】

@Component
public class AuthGlobalFilter implements GlobalFilter, Ordered {

    //获取application.yml中定义的白名单且将其注入到whitename
    @Value("${whitename}")
    private String whitename;

    @Override
    public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
        //设置白名单
        String[] whitenames = whitename.split(",");
        //  判断请求的路径
        // header
        // 获取请求头中的请求路径
        ServerHttpRequest requestss = exchange.getRequest();
        String path = requestss.getURI().getPath();
        System.out.println("请求的路径:" + path);
        if (ArrayUtil.contains(whitenames, path)) {
            // 放行:如果请求头中的请求路径在白名单中则直接放行
            //否则执行else逻辑
            return chain.filter(exchange);
        }else{
        其他token验证逻辑
        }

【注:随后直接访问 网关地址:端口/doc.html】

      http://localhost:8851/doc.html

查看即可

 


 

 以上便是SpringCloud之配置中心&swagger聚合中的内容,如有漏缺请在下方留言告知,我会及时补充