![微服务分布式架构基础与实战:基于Spring Boot + Spring Cloud](https://wfqqreader-1252317822.image.myqcloud.com/cover/390/31186390/b_31186390.jpg)
1.8 【实例】通过单配置文件让工程适应多应用场景
1.8.1 实例背景
在生产中通常会运行UAT(用户单元测试环境)或SIT(用户验收测试集成环境)等多种环境,可能会造成频繁修改application资源配置文件的情况。
本实例在boot_01工程的基础上,基于Profile方式在一个资源配置文件下同时设置多个环境参数,每个环境所使用的参数不同。Spring Boot微服务在启动时根据所输命令去适应应用场景。
1.8.2 更改application.yml文件
更改application.yml文件代码如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_40_2.jpg?sign=1739282681-huZtryE498WU1tRip1dGRxnDYhFn5XjL-0-03d1ad46461301db391615e28de06d8d)
1.8.3 更改启动类
之前工程的启动类一直用SpringApplication.run(ApplicationMain.class,args)启动,而下述代码的启动类使用了SpringApplicationBuilder(),两者在运行上并无任何区别,只是SpringApplication.run()不会额外设置profile文件等,大多采用默认状态。
更改Spring Boot的启动类ApplicationMain.java代码如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_41_1.jpg?sign=1739282681-TS7RXC7VlI7JnYvYv3ScBaczbKbLaUek-0-e2fef9fae161acd2131a32001871e1a0)
SpringApplication.run(.class,args)和SpringApplicationBuilder().run(.class)在底层上都会进入SpringApplication.java类的SpringApplication(ResourceLoader resourceLoader,Class<?>...sources)函数,加载配置文件相关信息,其底层代码如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_41_2.jpg?sign=1739282681-q7o9GqZRLmyXXzflWLy5QBeAfPoDefIL-0-a6b8f45da343b008c5fea066a21d7981)
SpringApplication构造函数相当于创建了一个新的SpringApplication实例,并且将加载应用程序上下文。之前做的更改实例配置等相关方式最终也是为了更改SpringApplication构造函数。该函数详解如下。
(1)ResourceLoader参数:需要加载的资源与相关配置信息。
(2)primarySources参数:额外引入的Bean资源。
(3)deduceWebApplicationType()函数:返回该Web程序的枚举类型,在Spring Boot中应用程序分为以下3种类型。
● 不需要在Web容器下运行,也是普通Java工程:WebApplicationType.NONE。
● 基于Servlet的Web应用:WebApplicationType.SERVLET。
● 响应式reactive Web应用:WebApplicationType.REACTIVE。响应式编程是Spring5推出的新特性,Spring单独创建了一个Spring WebFlux框架,即响应式Web编程框架,其底层是由Netty框架提供的异步支持;它用少量的线程处理更高的并发,在支持异步方式的同时也支持同步方式,类似于WebSocket式的客户端与服务器双向监听。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_42_1.jpg?sign=1739282681-yNLJNNFMg8odxr8kctpK8RLs8SE3ggeY-0-9d3c6009f0a9d57e733f496b04ee9c76)
图1-17
(4)ApplicationListener监听接口:属于Spring Boot的核心组件之一,由多种方式实现,它基于观察者设计模式设计监听接口,用于应用程序的各种事件监听。
1.8.4 输入启动参数
在ApplicationMain.java类中右键单击工程,如图1-17所示,选择Run As→Run Configurations配置工程启动命令。因为在配置文件中编写了UAT和SIT两套资源环境,所以在Eclipse里需更改Run Configurations启动配置参数,否则Spring Boot无法判断用哪种方式启动。
Run Configurations对话框如图1-18所示,Run Configurations相当于java-jar命令行启动时后续输入的参数。在Program arguments文本框中书写UAT或SIT,便是将参数传入main方法的String[] args入参中,根据程序处理将工程配置成UAT或SIT相应的环境。若要配置JVM内存等相关信息,则在VM arguments文本框中书写。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_43_1.jpg?sign=1739282681-xMo633SwKk0XaSCBPA0H5Legu9nDEIMh-0-42b94b2a067138b0f3475e2a20cedc10)
图1-18
此时运行项目会通过9998端口进行启动,实现了通过单个配置文件让程序适应多个环境的目的。
1.8.5 运行结果
Spring Boot已经用9998端口启动,并且通过/getName接口获取了book下的another参数,运行结果如图1-19所示。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_43_2.jpg?sign=1739282681-72FQKgiW6AYv1PSp4C5XL0bOvE5RSMWP-0-c671fe9a77f15888524c9b3ff47f5e91)
图1-19
1.8.6 实例易错点
“---”(三个减号)用来分割多套配置信息。前面不可加空格,否则会报错,报错信息如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_44_1.jpg?sign=1739282681-z9VbsSsLeIGfrArI9knipyFnpeiTvioi-0-aaaf7300839263c0c78bebf2c7b822b5)
(1)spring下profiles后的Value值可自定义,即自定义某一区域内配置信息所起的名字,代码如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_44_2.jpg?sign=1739282681-QyUFKS45YGOUKHb0YrxLX6Gya3gG9EbP-0-91bc9506925f0859ef46004ba320cb24)
(2)spring下profiles放置的位置只要在此区域内即可。