概述
在项目中,很多时候需要用到一些配置信息,这些信息在测试环境和生产环境下可能会有不同的配置,后面根据实际业务情况有可能还需要再做修改,针对这种情况,我们不能将这些配置在代码中写死,最好是写到配置文件中,比如可以把这些信息写到 application.yml 文件中
1.单一服务的配置和调用
在微服务架构中,最常见的就是某个服务需要调用其他服务来获取其提供的相关信息,那么在该服务的配置文件中需要配置被调用的服务地址,比如在当前服务里,我们需要调用订单微服务获取订单相关的信息,假设订单服务的端口号是8002,那么我们可以做如下配置
server:
port: 8082
# 配置微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8002
在业务代码中,我们可以使用@Value注解来获取到这个配置的订单服务地址,在对应的类中加上一个属性,在属性上使用@Value注解即可获取到配置文件中的配置信息,如下
package com.example.springdemo1.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/test")
public class ConfigController {
private static final Logger LOGGER = LoggerFactory.getLogger(ConfigController.class);
@Value("${url.orderUrl}")
private String orderUrl;
@RequestMapping("/config")
public String testConfig(){
LOGGER.info("====获取的订单服务地址为:{}",orderUrl);
return "success";
}
}
@Value注解上通过${key}即可获取配置文件中的key对应的value值。我们启动一下项目,在浏览器中输入http://localhost:8082/test/config
,可以看到控制台会打印出订单服务地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/db1bf29b487844ee97a07b4ede8f1d0d.png)
说明我们成功获取到了配置文件中的订单微服务地址,后面如果需要修改某个服务的地址,那么只要在配置文件中修改即可
2.多个配置信息的情形
一个项目中可能会有越来越多的微服务,某个模块可能调用多个微服务获取不同的信息,那么就需要在配置文件中配置多个微服务的地址,可是,在需要调用这些微服务的代码中,如果这样一个个去使用@Value注解引入相应的微服务地址的话,太过于繁琐,也不科学。
所以,在实际项目中,业务繁琐,逻辑复杂的情况下,需要考虑封装一个或多个配置类。
举个例子:假如在当前服务中,某个业务需要同时调用订单微服务、用户微服务和购物车微服务,分别获取订单、用户和购物车相关信息,然后对这些信息做一定的逻辑处理,那么在配置文件中,我们需要将这些微服务的地址都配置好
# 配置微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8082
# 用户微服务的地址
userUrl: http://localhost:8083
# 购物车微服务的地址
shoppingUrl: http://localhost:8084
对于这种情况,我们可以先定义一个ServiceUrl类,用来保存微服务的url
package com.example.springdemo1.conf;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix="url")
public class ServiceUrl {
private String orderUrl;
private String userUrl;
private String shoppingUrl;
public ServiceUrl(String orderUrl, String userUrl, String shoppingUrl) {
this.orderUrl = orderUrl;
this.userUrl = userUrl;
this.shoppingUrl = shoppingUrl;
}
@Override
public String toString() {
return "ServiceUrl{" +
"orderUrl='" + orderUrl + '\'' +
", userUrl='" + userUrl + '\'' +
", shoppingUrl='" + shoppingUrl + '\'' +
'}';
}
public String getOrderUrl() {
return orderUrl;
}
public void setOrderUrl(String orderUrl) {
this.orderUrl = orderUrl;
}
public String getUserUrl() {
return userUrl;
}
public void setUserUrl(String userUrl) {
this.userUrl = userUrl;
}
public String getShoppingUrl() {
return shoppingUrl;
}
public void setShoppingUrl(String shoppingUrl) {
this.shoppingUrl = shoppingUrl;
}
}
注意:使用@ConfigurationProperties注解并且使用prefix来指定一个前缀,然后该类中的属性名就是配置文件中的key,同时,该类上面需要加上@Component注解,把该类作为组件放到Spring容器中,让Spring去管理,我们使用时候直接注入即可,使用@ConfigurationProperties注解需要导入它的依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
写个Controller来测试一下,此时,就不需要在代码中一个一个引入这些微服务的url了,直接通过@Resource注解将刚刚写好配置类注入进来即可使用了
package com.example.springdemo1.controller;
import com.example.springdemo1.conf.ServiceUrl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
@RestController
@RequestMapping("/test")
public class TestServiceUrl {
private static final Logger LOGGER = LoggerFactory.getLogger(TestServiceUrl.class);
@Resource
private ServiceUrl serviceUrl;
@RequestMapping("/configUrl")
public String testConfigUrl(){
LOGGER.info("====获取订单服务地址为:{}",serviceUrl.getOrderUrl());
LOGGER.info("====获取的用户服务地址为:{}",serviceUrl.getUserUrl());
LOGGER.info("====获取的购物车服务地址为:{}",serviceUrl.getShoppingUrl());
return "success";
}
}
启动项目,在浏览器中输入http://localhost:8082/test/testUrl
,即可看到控制台打印出的微服务地址
3.指定项目配置文件
我们知道,在实际项目中,一般有三个环境:开发环境、生产环境和测试环境,开发环境中的配置和生产环境还有测试环境中的配置往往不同,比如:环境、端口、数据库、相关地址等,开发环境、生产环境和测试环境都应有一套对应的配置信息,在开发中,指定读取开发环境的配置,将项目部署到服务器上之后,再指定去读取生产环境的配置
server:
port: 8081
spring:
profiles:
active: dev
---
server:
port: 8082
spring:
profiles: dev
logging:
config: logback.xml
level:
com.example.springdemo1.dao: trace
# 配置微服务的地址
url:
# 订单微服务的地址
orderUrl: http://localhost:8082
# 用户微服务的地址
userUrl: http://localhost:8083
# 购物车微服务的地址
shoppingUrl: http://localhost:8084
---
server:
port: 8083
spring:
profiles: test