12 요소 적용: 봄철 구성
19022 단어 cloudnativespringcloud
12 요소 어플리케이션 선언은 구성(암호, 호스트 이름 등)을 environment variables으로 외부화하는 것을 권장합니다.
The twelve-factor app stores config in environment variables (often shortened to env vars or env). Env vars are easy to change between deploys without changing any code
이 기준을 준수했는지 확인하고 싶을 때, 어떠한 증거도 손상시키지 않고 코드 라이브러리를 개방하는 것은 응용 프로그램에 필요한 테스트이다.
@Value 사용
이 예는 예시에서 속성을 어떻게 불러오는지에 대한 매우 간단한 예를 보여 준다.일반 spring의 속성 파일을 사용하려면 다음과 같이 하십시오.
message="Blogging is cool"
예시에서 불러온 값을 출력하기 위해 명령줄 실행 프로그램을 만들었습니다.재산이 파일은 클래스 경로인 target/classes
디렉토리에 있습니다.@SpringBootApplication
@Slf4j
@PropertySource("classpath:sample.properties")
public class ConfigsApplication implements CommandLineRunner {
@Value("${message}")
private String msg;
public static void main(String[] args) {
SpringApplication.run(ConfigsApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
log.info(msg);
}
}
간단한 소개
만약 당신이 기업에서 일한다면, 당신의 프로젝트는 많은 다른 환경에 들어갈 수 있습니다. (개발 | 테스트 | 단계 | UAT/사전 생산 | 생산)이러한 환경의 각 환경에는 각기 다른 설정이 있을 수 있습니다.우리는 어떻게 적당한 환경에서 적당한 설정을 불러옵니까?이 질문에 대한 가장 간단한 답은 Spring 구성 파일을 사용하는 것입니다.모든 환경을 속성이나yml 파일로 정의된 설정에 비추겠습니다.
yml/properties 파일의 환경 변수를 이 요소의 창도자로 사용할 수 있습니다.사실, 민감한 정보 (예:db 증빙 서류) 를 원본 코드 관리 시스템에 서명하고 싶지 않기 때문에, 이렇게 해야 합니다.
이 예에서 우리는 두 가지 환경을 사용할 것이다. dev와prod이다. 이 두 환경은 데이터베이스 설정에 있어서 다르다.개발 환경에 대해 우리는
application-dev.yml
이라는 파일을 정의할 것이다.prod에 대해 우리는 그것을 application-prod.yml
으로 정의한다.application-dev.yml:
spring:
datasource:
url: jdbc:h2:mem:testdb
username: sa
password: sa
jpa:
hibernate:
ddl-auto: create
위의 설정은 환경 변수를 사용하지 않았습니다. 필요하지 않기 때문에 이 설정 파일은 개발 환경에만 사용됩니다. (prod에서 이렇게 하지 마십시오.)application-prod.yml:
spring:
datasource:
url: ${DB_URL}
username: ${DB_USERNAME}
password: ${DB_PASSWORD}
jpa:
hibernate:
ddl-auto: none
여기에서, 나는 환경 변수를 사용하여db증빙서류를 데이터베이스에 불러옵니다.현재, 만약 당신이 원한다면, 데이터베이스 증빙서류가 유출되는 것을 걱정하지 않고, 프로젝트에 대해 대중에게 발표할 수 있습니다.다음 방법 중 하나를 사용하여 구성 파일을 활성화할 수 있습니다.
JVM 시스템 매개변수
JVM 시스템 매개 변수를 전달하는 것은 구성 파일을 활성화하는 방법입니다.예를 들어, spring boot 플러그인을 사용하여 프로젝트를 구성하면 다음과 같은 매개 변수를 전달할 수 있습니다.
mvn spring-boot:run -Dspring.profiles.active=prod
환경 변수
환경 변수를 설정하여 구성 파일을 활성화합니다.예를 들어, Unix 환경에서 env를 설정할 수 있습니다.bashrc 파일은 다음과 같습니다.
export spring_profiles_active=dev
마문 소개
Maven 프로파일을 사용하여 Spring 프로파일을 활성화할 수 있습니다.이것은 내가 가장 좋아하는 개인 자료를 활성화하는 방식이다.예를 들어
profiles
부분에서 우리는 두 개의 마ven 프로필 dev
과 prod
을 정의할 것이다. 각 프로필은 JVM 시스템 파라미터를 설정할 것이다.<profiles>
<profile>
<id>dev</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<spring.profiles.active>dev</spring.profiles.active>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<spring.profiles.active>prod</spring.profiles.active>
</properties>
</profile>
</profiles>
마븐 프로필을 설정한 후pom에서 자원 선별을 설정해야 합니다.xml로 변수 해석을 터치합니다.<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
</resource>
</resources>
...
</build>
</properties>
나머지는 -P
옵션을 사용하여 마벤트 명령을 실행함으로써 어떤 개요 파일이 활성 상태인지 지정합니다.mvn spring-boot:run -Pdev
봄구름
Spring Cloud을 사용하는 경우 구성을 필요한 모든 속성 구성을 저장하는 Spring Cloud Config Server에 집중하고 git 저장소의 구성을 구성할 수 있습니다.서버를 설정하는 것은 저장소와 클라이언트 사이의 에이전트를 설정하는 것과 같다.참고: 클라이언트는 RESTAPI를 통해 Spring 클라우드 구성 서버를 사용합니다.
상기 방법을 사용하면 설정이 바뀌면 프로그램을 다시 시작해야 합니다.Spring Cloud Config Server는 새로운 역할 영역을 도입하여 이 문제를 해결합니다. 역할 영역을 새로 고치면 다시 시작하지 않고 구성 요소를 재구성할 수 있습니다.이 예에서는 구성 서버를 구성하는 방법과 클라이언트가 해당 REST API를 사용하여 구성 서버를 사용하는 방법을 살펴봅니다.
구성 서버 구축
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-server</artifactId>
</dependency>
구성 서버는 GitHub에서 호스팅되는 git repo에서 구성을 로드합니다.이 서비스는 일반적인 Spring 부트 응용 프로그램으로 공개할 수 있습니다.(properties/yml)는 REST API로 구성됩니다.Spring Clould Config Server 지원을 추가하려면 @EnableConfigServer
주석을 사용하여 Spring Boot 응용 프로그램에 주석을 추가하십시오.@SpringBootApplication
@EnableConfigServer
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
이 주석은 Spring Boot에서 응용 프로그램 구성 bean과 API를 공개하는 데 필요한 모든 파이프라인을 제공하도록 안내합니다.다음은
application.yml
에서 구성된 서버의 구성입니다.server:
port: 8181
spring:
cloud:
config:
server:
git:
uri: https://github.com/Hamzablm/configuration-demo
속성 spring.cloud.config.server.git.uri
은spring에 git repository에 있는 프로필을 찾으라고 알려 줍니다.Spring Cloud를 사용하는 각 Spring Boot 애플리케이션에는 bootstrap.yml
에 정의된 고유한 이름이 있어야 합니다.spring:
application:
name: config-server
Spring Can Config Server는 configuration-demo 저장소에서 모든 구성을 가져오고 클라이언트의 spring.application.name
과git repo에 존재하는 프로필 이름을 일치시켜 적절한 구성을 클라이언트에 공개합니다.특정 프로파일의 특정 프로파일을 공개할 수도 있습니다.예를 들어
dev
프로필에서 실행하면 configuration-client-dev.properties
이 이용되고 존재한다면또한git repo에
application.(properties/yml)
파일이 존재하면 설정 서버는 모든 클라이언트에게 속성을 공개하고 다른 설정 파일은 새로운 속성을 정의하거나 application.(properties/yml)
의 속성을 덮어씁니다고객 관계 구축
Spring Cloud Config 클라이언트 의존도를 추가하여 Spring Cloud Config Server에 연결하여 애플리케이션 구성을 가져옵니다.또한 bing Spring Actuator를 통해
refresh
엔드포인트에 액세스해야 합니다(나중에 자세히 설명하겠습니다). 그러면 클라이언트에서 구성을 동적으로 업데이트할 수 있습니다.<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-config</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
클라이언트는 Spring 클라우드 기반 서비스로, 서비스를 부트하기 위해 bootstrap.yml
을 찾습니다.bootstrap.yml
은 모든 application.(properties/yml)
보다 먼저 시작됩니다.여기 bootstrap.yml
은 서비스의 이름을 정의했습니다. 이 이름은git 저장소의 프로필 이름과 일치하여 클라이언트가 무엇을 사용해야 하는지 알 수 있도록 해야 합니다.spring:
application:
name: configuration-client
cloud:
config:
uri: http://localhost:8181
management:
endpoints:
web:
exposure:
include: "*"
cloud.config.uri
은 서버 배포를 구성하는 엔드포인트를 지정합니다.management.endpoints.web.exposure.include=*
은 용수철의 집행기 단점을 알리는 데 사용한다.만약 우리가 설정을 새로 고칠 수 있도록 하려면 그것들이 필요하다.여기서 우리는 전통적인 방법으로 설정 속성에 접근할 수 있다. 예를 들어
Environment
추상, @PropertySource
, @ConfigurationProperties
:@RestController
@RefreshScope
class MessageRestController {
@Autowired
private Environment env;
@GetMapping("/msg")
String getMessage() {
return env.getProperty("project.message");
}
}
이 클래스는 @RefreshScope
주석을 사용하기 때문에gitrepo 설정의 모든 변경 사항은 클라이언트 프로그램을 다시 시작하지 않은 상태에서 적용됩니다.구성을 새로 고치려면 이 끝점에 대한 post 요청을 실행하십시오.curl localhost:8080/actuator/refresh -d {} -H "Content-Type: application/json"
PS: 설정 서버를 사용하는 마이크로 서비스가 많다고 상상해 보세요.설정 저장소를 변경하면, 이 클라이언트의 모든 클라이언트는 Actuator refresh 포트에post 요청을 실행해서 설정을 새로 고쳐야 합니다. 확장 가능한 해결 방안이 아니라는 것을 알려줄 필요가 없습니다.이 문제를 해결하기 위해 Spring Cloud Bus를 사용하면 분산 시스템의 노드와 경량급 메시지 에이전트(예를 들어 RabbitMQ)를 연결하여 방송 상태를 변경할 수 있습니다.Spring Cloud Bus에 대해 논의할 전체 블로그를 작성할 수도 있습니다.실행 코드
우선
mvn spring-boot run
을 실행하여 설정 서버를 실행하고 다음url:http://localhost:8181/configuration-client/master을 방문하여 json 부하 설정 클라이언트에서 정의한 속성을 가져오십시오.너는 반드시 이런 물건을 얻어야 한다.{
"name":"configuration-client",
"profiles":[
"master"
],
"label":null,
"version":"e467e3598c0509da56a15731a1f01e0851c46307",
"state":null,
"propertySources":[
{
"name":"https://github.com/Hamzablm/configuration-demo/configuration-client.properties",
"source":{
"project.message":"Blogging is awesome"
}
}
]
}
현재 제 재산 project.message
을git repo에서 설정 서버로 다운로드했습니다.현재 설정 서버를 실행한 후
mvn spring-boot run
을 계속 실행하여 설정 클라이언트를 실행합니다.그리고 이 단점을 계속 방문합니다. 설정만 공개합니다: http://localhost:8080/msg
:Blogging is awesome
``git repo 구성에 대한 중앙 집중식 구성과 Spring Cloud Config Server 공개 구성을 사용하는 방법에 대해 알아봤습니다. 프레젠테이션을 실행하려면 클론 repository을 확인하십시오.
마무리
본고에서 저는 Spring 생태계의 기능을 어떻게 활용하고 12가지 요소의 응용 프로그램에서 설정 요소를 존중하는지 보여 드리려고 합니다.
Reference
이 문제에 관하여(12 요소 적용: 봄철 구성), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/hamzajvm/twelve-factor-application-configuration-in-spring-6oc텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)