SpringCloud之配置中心&swagger聚合
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聚合中的内容,如有漏缺请在下方留言告知,我会及时补充