스프링 클라우드는 확장성 메커니즘을 제공하는데 초점을 맞추고 있다.
Cloud Natvie는 continuous delivery and value-driven development 분야에서 best practices를 쉽게 채택할 수 있도록 지원하는 애플리케이션 개발 스타일이다.
12-Factors Applications를 구축하는 것이 관련된다.
The Twelve Factors
1. Codebase
one codebase tracked in revision control, and deploys
2. Dependencies
Explicitly declare and isolate dependencies
3. Config
Store config in the environment
4. Backing services
Treat backing services as attached resources
5. Build, release, run
Strictly separate build and run stages
6. Processes
Execute the app as one or more stateless processes
7. Port binding
Export services via port binding
8. Concurrency
Scale out via the process model
9. Disposability
10. Dev/prod parity
Keep development, staging, and production as similar as possible
11. Logs
Treat logs as event streams
12. Admin processes
Run admin/management tasks as one-off processes
Cloud Native의 시작점은 분산 시스템의 모든 구성 요소에 쉽게 엑세스해야 하는 기능 집합들이다.
이러한 기능의 대부분은 Spring cloud가 구축하는 Spring boot에 포함된다.
또한 몇 가지 추가 기능은 Spring Cloud Context
, Spring Cloud Commons
이 두 가지 라이브러리로 제공된다.
spring cloud contextsms ApplicationContxt에 대한 유틸리티 및 특수 서비스를 제공하며, Spring Cloud Commons는 다양한 Spring Cloud 구현 (Netflix 및 Consul)에 사용되는 공통 클래스 집합이다.
스프링 클라우드 애플리케이션은 기본 애플리케이션의 상위 컨텍스트인 bootstrap
컨텍스트를 생성하여 작동한다.
외부 소스에서 configuration properties를 불러오거나 속성을 해독하는 역할을 한다. 부트스트랩 속성이 높은 우선 순위로 추가된다.
bootstrap.yml을 사용하여 부트스트랩 및 기본 컨텍스트에 대한 외부 구성을 분리할 수 있다.
If you build an application context from SpringApplication, the the Bootstrap context is added as a parent to that context. child contexts inherit property and profiles from their parent, so the main application context contains additional property sources.
bootstrap.yml 이 있는 경우 해당 속성은 Bootstrap 컨텍스트를 구성하는 데 사용된다.
부트스트랩 컨텍스트에 의해 애플리케이션에 추가되는 속성 소스는 종종 " 원격 " 입니다 (예: Spring Cloud Config Server). 기본적으로 로컬로 재정의할 수 없습니다. 애플리케이션이 자체 시스템 속성 또는 구성 파일을 사용하여 원격 속성을 재정의하도록 하려면 원격 속성 소스에서 설정을 통해 권한을 부여해야 합니다.
spring.cloud.config.overrideNone=true
: override from local property source
application listens for an EnvironmentChangeEvent
and reacts to the change in a couple of standard ways.
when an EnvironmentChangeEvent
is observed, it had a list of key values that have chaged, and the application uses those to:
** Re-bind any @ConfigurationProperites
beans in the context
** Set the logger levels for any properties in loging.level.~
NOTE That the Config Client DOES NOT, by default, poll for changes in the Environment!!!
So You can broadcast the EnvironmentChangeEvent to all the instances instead of having them polling for changes.
이를 위해 Spring Cloud Bus를 사용할 수 있는 것이다.
위에서 말한 것처럼 구성 변경이 있는 경우에 알아서 안한다고 치고 이벤트 전파한다고 치면 다 알아서 되는건가? 놉!
Problem :: stateful beans that only get their configuration injected when they are initialized.
@RefreshScope
어노테이션을 통해 이러한 문제를 해결할 수 있다.
서비스 검색, 로드 밸런싱, 서킷 브레이커 등의 패턴 구현과 관계없이 모든 클라이언트가 사용할 수 있는 공통 추상화 계층에 적용된다.
META-INF/spring.factories
를 사용하여 DiscoveryClient 인터페이스의 구현을 찾는다. discoveryClient의 구현 예로는 Eureka, Consul Discovery, Zoopeeper Discovery가 있다.
Commons now provides a ServiceRegistry
interface that provides methods such as register(Registration)
and diregister(Registation)
.
Eureka에서도 its own Registry 구현체가 있다.
=> EurekaRegistration
used with EurekaServiceRegistry
기본적으로 ServiceRegistry는 작동중인 서비스를 자동 등록한다.
이 동작을 비활성화하기 위해서는 아래와 같이 수정할 수 있다.
@EnableDiscoveryClient(autoRegister=false)
OR
spring.cloud.service-registry.auto-registration.enabled=false
Spring Cloud Commons provides a /service-registry actuator endpoint. This endpoint relies on a Registration bean in the Spring Application Context.
참고 자료 ::
https://cloud.spring.io/spring-cloud-static/Greenwich.SR2/multi/multi_spring-cloud.html