![微服务分布式架构基础与实战:基于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=1739679379-QJ7Tn2Aq0tdisC5NETY8TZW0LS5KdJSI-0-a1790a41354d6adc2db1b22284dcb4da)
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=1739679379-CXxI5GwwwXEOYTkyTn0mxwX8kH6YkDWm-0-1c3763c2a20099530f565f152a7e9dcb)
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=1739679379-TdyjEfFRE0QhE8mA8EmLzhng0C5jPYN5-0-ecaeeac96ce5081881afc696c39db44a)
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=1739679379-81N7i7BR8HcEZlGx4XoIlypC2p42Ucol-0-a7be9c40441f0806a0b4d239a6538cbe)
图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=1739679379-zdjIKTtWObCoNF8kl8VEJckcAN86frQV-0-5656689facd2f0506d83f1620db5dc4b)
图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=1739679379-tfwRQLV7UtaxGZX8t7kzSwNmVBLYaSnb-0-3bd25b538f8c0ff7e3f5773ab155ccdd)
图1-19
1.8.6 实例易错点
“---”(三个减号)用来分割多套配置信息。前面不可加空格,否则会报错,报错信息如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_44_1.jpg?sign=1739679379-cNyCvXZLioqBGYPrZuIW8QXsDQXvmZjS-0-ce194dde4b007475a538b3e3485e3df4)
(1)spring下profiles后的Value值可自定义,即自定义某一区域内配置信息所起的名字,代码如下。
![](https://epubservercos.yuewen.com/C493B8/16896238005622406/epubprivate/OEBPS/Images/38413_44_2.jpg?sign=1739679379-SZvOrYL3Z4oGa3NP2a8zsipS6OqmMu33-0-918c687ac363d407f6c24c0ebdf7b9d3)
(2)spring下profiles放置的位置只要在此区域内即可。