'IT/ETC'에 해당되는 글 2건

 

Microservice 와 Spring Cloud 소개

 

본문은 인프런 교육 영상 中

 

이도원 엔지니어님의

"Spring Cloud로 개발하는 마이크로서비스 애플리케이션(MSA)"

강의 기반 내용 정리 이며, 사용된 이미지의 출처는 해당 교육 영상의 이미지임을 밝힙니다.


Spring Cloud

 

Spring

- java 의 웹 프레임워크

프레임워크
어떠한 목적을 달성하기 위한 구조 클래스, 라이브러리, 리포지토리의 집합

 

- JSP, mybatis, jpa 등 java를 쉽게 사용하기 위한 오픈소스 웹 프레임워크

 

Spring Cloud

- MSA 시스템 개발/배포/운영을 지원하는 Spring 기반 개발 도구 및 프레임워크

 

 


History of IT System

 

  • 1960~1980s : Fragile, Cowboys
    • Mainframe, Hardware
    • 하드웨어 중심(사양,성격)에 맞춰 서비스 구성, 고가
    • 서비스 기능 수정 및 변경 어려움, 깨지기 쉬운 시스템
Fragile : 부서지기 쉬운

 

  • 1990~2000s : Robust, Distributed
    • Changes
    • '분산', 시스템 안정화
    • 서비스 변화에도 안정성, 성능높은 서비스
Robust : 강인한

 

  • 2010s~ : Resilient/Anti-Fragile, Cloud Native
    • 로컬->클라우드
    • 확정성, 안정성, 변화에도 탄력적 운영
Resilient : 탄력적인
 

 

Antifragile

 

다른 개발/환경보다 시스템 변화가 적고, 변화에 적용할 수 있고, 비용도 저렴

  • 네 가지 핵심
    1. Auto scaling : 자동 확장성( 리소스 사용량에 따라 자동으로 )
      • 예) 부하 사용량이 예측된다면(계절 쇼핑몰 등) 자동 scaling
    2. Microservices : 클라우드 네이티브 아키텍처/어플리케이션의 핵심
      • 기존의 하나의 거대한 서비스를 개별적인 모듈/기능을 독립적으로 개발/배포
      • 넷플릭스/아마존
    3. Chaos engineering
      • 예견된/예견되지 않은 불확실한 상황에서도 안정적인 서비스
      • 즉 실행 방법/규칙 등
    4. Continuous deployments
      • CICD - pipeline
      • 지속적인 통합/배포
      • 하나의 어플리케이션이 적게는 수십개, 많게는 수백개의 MS
pipeline 
한 데이터 처리 단계의 출력이 다음 단계의 입력으로 이어지는 형태로 연결된 구조
 

Cloud Native Architecture

 

  1. 확장 가능한 아키텍쳐
    • 시스템의 확장에 유연
    • 확장된 서버로 시스템의 부하 분산/가용성 보장
    • 시스템/서비스 애플리케이션 단위의 패키지(컨테이너 기반)
    • 모니터링
  2. 탄력적 아키텍쳐
    • 서비스 생성-통합-배포, 비즈니스 환경 변화에 대응시간 단축
    • 분할 된 서비스 구조
    • 무상태 통신 프로토콜
    • 서비스의 추가와 삭제를 자동으로 감지
    • 변경된 서비스 요청에 따라 사용자 요청을 동적 처리
  3. 장애 격리(Fault Isolation)
    • 특정 서비스에 오류가 발생해도 다른 서비스에 영향을 주지 않음
    • 장애 복구에 뛰어남

Cloud Native Application

1. Microservices

  • 개발 모델

2. CI/CD ( Continuous Integration, Continuous Delivery/Deployment )

  • 자동 통합/빌드/테스트/배포
  • 지속적인 통합(CI)
  • 통합 서버, 형상 관리, 빌드/테스트 도구
    • Jenkins, Team CI, Travis CI
  • 지속적인 배포(CD)
  • Delivery : 운영자의 수동 반영
  • Deployment : 자동 반영
  • Pipe line
  • 카나리배포/블루그린 배포
    • 카나리배포 : 95%는 이전 서비스 / 5%는 새로운 버전 서비스
    • 블루그린 배포 : 이전 버전(블루) -> 새로운 버전(그린) 으로 점진적 이전

3. DevOps

  • 고객이 원하는 최선의 결과물을 만드는 데 목적
  • 문제 발생 시 반영/재배포를 반복
  • 요구사항에 맞게 서비스 설계/구현/테스트/배포
  • 요구사항/개선사항은 언제든 변할 수 있으며 자주 테스트/피드백/업데이트 등을 거쳐 개발 과정동안 끊임없이 소통하며 진행할 수 있음
  • Cloud Native Application은 이러한 데브옵스의 과정을 더 잘 적용할 수 있는 어플리케이션
  • Development + QA + Operations
  • create/plan/verify/package/release/configure/monitor

 

4. Containers 가상화

  • 기존 전통 개발 : 하드웨어->OS->APP
  • 가상화 개발 : 하드웨어->OS->VM->OS->APP
  • 컨테이너 개발 : 하드웨어->OS->컨테이너->APP
  • 하나의 어플리케이션을 구성하는 MSA를 클라우드 환경에 배포하고 사용하기 위해
  • Cloud Native Application의 핵심
    • 하드웨어 가상화보다 적은 리소스를 사용
    • 서비스들은 가볍고 빠르게 운영할 수 있음

 


12 Factors( https://12factor.net/)

 

paas 를 제공하는 Heroku라는 개발회사에서 제시한 12가지로,

cloud native application 개발/운영 시 고려할 항목 정리

 

  1. Base code
    • 형상 관리(버전관리를 위해 코드를 한 곳에서 배포)
    • 코드의 통일적인 관리
  2. Dependency Isolation (종속성)
    • 각 MS는 자체 종속성을 보유
    • 변경 시 전체 시스템에 영향을 주지 않아야 함
  3. Configurations (구성 정보)
    • 코드 외부에서 관리 도구를 통해 필요한 작업들을 제어
    • 동일한 배포가 올바른 구성이 적용된 환경에서 전파될 수 있음
  4. Linkable backing services (서비스 지원)
    • 보조 서비스(DB,캐시,메시지서비스,브로커)를 통해 추가 기능을 지원해야 함
    • 특정 벤더에 코드 디펜던시가 없어야 함
  5. Stages of Creation (빌드/릴리즈/실행환경의 엄격한 분리)
    • 고유한 ID 태그
    • 롤백기능(원복)
    • CI/CD 로 자동화
  6. Stateless Processes
    • 하나의 MS는 다른 MS들과 독립적으로 실행
Stateless : 무상태
각각의 서비스는 클라이언트와 무관하게 요청에 대한 응답만 처리함

 

7. Port Binding

  • 각각의 MS는 다른 MS와의 통신을 위한 포트

8. Concurrency (동시성)

  • 하나의 서비스가 수많은 여러가지 인스턴스에 나뉘어(복사되어) 운영

9. Disposability

  • 서비스 인스턴스를 등록/삭제/확장/종료 가능해야 함

10. Development & Production Parity

  • 개발과 배포단계를 구분
  • 배포 시 다른 작업/환경에 영향이 없어야 함

11. Logs

  • MS에 의해 생성된 로그를 관리하는 도구 필요

12. Admin Processes for Eventual Processes

  • 리소스, 실시간 관리 도구가 있어야 함
  • 모니터링, 리포팅, 데이터 분석

 

 

Pivotal 이 3개의 요소를 추가함

  1. API first
    • API 형태로 서비스 제공
    • 사용자는 어떤 형태로 개발할지 고민
API
정의 및 프로토콜 집합을 사용하여 두 소프트웨어 구성 요소가 서로 통신할 수 있게 하는 메커니즘

 

2. Telementry

  • 모든 지표는 수치화/시각화되어 관리되어야 함

3. Authentication and authorization

  • 인증

 


애플리케이션 방법론 : Monolithic vs MSA

 

Monolith

어플리케이션 개발에 있어 필요한 모든 요소를 하나의 커다란 소프트웨어 안에 포함시켜 개발

DB/비즈니스/프론트엔드 모든 서비스가 하나의 어플리케이션에서 유기적으로 연결되어 작동/배포, 서로 의존성을 가짐

시스템의 일부 수정 시에도 전체 어플리케이션 빌드/테스트/패키징 필요

"하나의 건축물"

 

MSA

  • Netflix의 MSA 구성도
  • 파란색 : 서비스간 연동/통신
  • 초록색 : Netflix 서비스를 구축하는 MS

 

어플리케이션을 구성하는 요소 및 서비스를 분리하여 개발/운영

유지보수, 변경 적용시 유리

잘게 쪼개진 여러 서비스들의 묶음 비즈니스 중심으로 구축, 완전히 자동화되어 배포

최소화된 중앙 집중 관리, 다른 프로그래밍 언어, 다른 db 스토리지

서비스의 기능과 종류에 맞춰 언어를 선택, 각각의 서비스는

각 api를 통해 제어 -> 통일된 언어가 필요없음

서버 사이드 개발 자바 하드웨어 제어 C/C++ 데이터분석/머신러닝 파이썬 서버의 비동기 서비스 노드js

서비스 요청에 대한 통일된 gateway, 서비스들의 등록/검색/부하분산/대처/동기화 등 매커니즘이 필요

Gateway : 네트워크에서 서로 다른 통신망, 프로토콜을 사용하는
네트워크 간의 통신을 가능하게 하는 소프트웨어 즉 다른 네트워크로 들어가는 입구 역할을 하는 네트워크 포인트

 

크로스플랫폼(갤럭시,워치,탭,PC 등)

  • 장비,해상도,입력방식 등 다름
  • 변화가 많은 클라이언트 단말기는 프론트엔드 개발 회사에 맡기고
  • 서버는 서비스/비즈니스를 처리하는 내용을 통일된 폼으로 클라이언트 단말기에 전달만 하면 됨
  • 또한 서비스의 경계에 맞는 형태로 개발/테스트/배포 됨으로써 하나의 어플리케이션을 구성해야하는
  • 서비스들이라 할지라도 서로 다른 서비스들과 독립적으로 관리할 수 있음

Microservice

 

"Everything should be a microservice"

Q1) Multiple Rates of Change : 어느 정도 변화가 생기는가?(공수)

Q2) Independent Life Cycles : 독립적으로 개발/운영 되도록 서비스 경계가 되어 있는가?

Q3) Independent Scalability : 서비스 유지하면서 확장이 가능한가?

Q4) Isolated Failure : 오류 사항에 대해 독립적인가?

Q5) Simplify Interactions with External Dependencies : 외부 종속성과의 상호 작용이 단순한가?

Q6) Polyglot Technology : 여러가지 언어/스토리지 를 지원하는 패러다임(polyglot)기술이 있는가?

 

Microservice Team Structure

  • Two Pizza team (4~5명)
  • 커뮤니케이션 비용
  • 개발/테스트/운영/배포 를 위한 최소 단위

SOA(Service Oriented Architecture) vs MSA

 

SOA

서비스 인터페이스를 통해 소프트웨어 구성 요소의 재사용/상호 운영성을 가능하게 하는 구조

즉, 서비스는 인퍼테이스/아키텍처를 공통적인 것을 사용하므로

기능추가/재개발/복제 등 과정에서 신속하게 통합 가능

 

서비스 공유 지향점

SOA - 재사용을 통한 비용 절감, 서비스 공유 최대화

MSA - 서비스 간의 결합도를 낮추어 변화에 능동적으로 대응

 

기술 방식

SOA - 공통의 서비스를 ESB(Enterprise Service Bus) 에 모아 사업 측면에서 공통 서비스 형식으로 제공

MSA - 독립된 서비스가 노출된 REST API를 사용

Rest API
두 시스템이 인터넷을 통해 정보를 안전하게 교환하기 위한 인터페이스

 

 

'IT > ETC' 카테고리의 다른 글

[ETC] :: JSON  (0) 2020.02.17
블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,

[ETC] :: JSON

IT/ETC 2020. 2. 17. 15:47

JSON( JavaScript Object Notation )

Concepts

  • '속성-값' 쌍 또는 '키-값' 쌍으로 이루어진 개방형 표준( Opened Standard )1) 데이터 포맷이다.
    • 이 값 하나 하나를 리터럴(literal), 키-값 쌍을 프로퍼티(property)라 한다.
  • 브라우저/서버 통신을 위해, 넓게는 XML을 대체하는 주요 데이터 포맷으로.
    특히 인터넷에서 자료를 주고 받을 때 그 자료를 표현하는 방법으로 알려져 있다.
  • 자료의 종류에 큰 제한은 없으며 특히 컴퓨터 프로그램의 변수값을 표현하는 데 적합하다.
  • 자바스크립트 언어로부터 파생되어 자바스크립트의 구문 형식을 따르지만,
    실제로는 프로그래밍 언어나 플랫폼에 독립적이다.


개방형 표준( Opened Standard )1)

기술에 대한 표준 문서가 공개되어 있으며 사용이 자유롭다.
상황에 따라 다른 정의가 존재하며, 표준 단체, 국가마다 서로 다른 정의를 가질 수 있다.


사용 목적

  • 주로 서버에서 클라이언트로 데이터를 보낼 때 사용하는데,
    서버측에서는 클라이언트가 사용하는 언어에 관계 없이 일정한 패턴을 지닌 데이터를 생성해 전송하면
    클라이언트는 그 데이터를 해석해 자기만의 방식으로 가공해 사용할 수 있다.
  • 웹 초기 시절부터 사용한 XML과 비교하자면,
    이 XML은 헤더, 태그 등의 요소들로가독성이 떨어지며, 비교적 용량을 많이 잡아먹는다는 단점이 있다.
    이에 대응해 XML보다 훨씬 간결하고, 가벼운 용량의 양식으로 JSON이 각광을 받고 있다.



Advantage

  • 텍스트로 이루어져 있어 사람이 읽고 쓰기 쉽다.
  • XML에 비해 구문이 더 짧고 배열을 사용할 수 있다.
  • 프로그래밍 언어와 플랫폼에 독립적이므로, 서로 다른 시스템간에 객체를 교환하기에 좋다.



Data type

  • 수(Number) : 정수, 실수, 지수 ( 8진수나 16진수 등의 표현법은 제공하지 않음 )
    12
    -3.14
    1.234e+5
    
  • 문자열(String) : 큰따옴표(")로 구분되는 유니코드 문자
    "anbo"
    "한글"
    
  • 참/거짓(Boolean) : 기본적으로 true와 false를 소문자로만 표기한다.
    true
    false
    
  • NULL : 아무런 값도 가지고 있지 않으며, 소문자로 표기해야 한다.
    null
    
  • 객체(Object) : 프로퍼티의 집합으로, 중괄호{}로 나타낸다.
    이름은 항상 문자열이며, 값은 JSON 데이터 타입이다.
    객체 안에 객체가 포함되는 계층 구조도 가능하며, 모든 값들은 쉼표(,)로 구분한다.
    { string:value [, string:value] [, string:value] ... }
    
    {
        "월": "January",
        "제목": "Survey",
        "참여여부": false
    }
    
  • 배열(Array) : 여러 개의 데이터가 순서를 가지고 나열된 집합이며 대괄호[]로 나타낸다.
    배열의 각 요소는 JSON의 데이터 타입이다.
    객체와 달리 배열은 데이터의 값만을 나열하며, 쉼표(,)로 구분한다.
    배열의 인덱스는 언제나 0부터 시작하며, 여러 타입의 배열 요소를 가질 수 있다.
    [ value [, value] [, value] ... ]
    
    {
        "kpop":[
            "METEOR",
            "아무노래",
            {
                "age": "25",
                "year": "2020",
                "etc": null
            }
        ]
    }
    

Example

Ubuntu 에서 JavaScript로 진행한 간단한 테스트 예제

  • 한 사람에 관한 정보를 갖는 JSON 객체
    • test.js
      console.log( "START" );
      
      var anbo = { "이름": "안보현",
                   "나이": 29,
                   "특기": [
                       "독서",
                       "피아노"
                   ],
                   "가족관계": {
                       "#": 3, 
                       "아버지": "0",
                       "어머니": "1",
                       "형": "2"
                   },
                   "회사": "선재소프트"
                 }
      
      console.log( anbo );
      console.log( "FINISH" );
      
    • terminal
      [anbo@h JavaScript]$ node test.js
      START
      { '이름': '안보현',
        '나이': 29,
        '특기': [ '독서', '피아노' ],
        '가족관계': { '#': 3, '아버지': '0', '어머니': '1', '형': '2' },
        '회사': '선재소프트' }
      FINISH
      



Validation

  • JSON 스키마는 다음과 같은 세 가지 검증(validation) 과정을 거친다.
    1. 데이터 타입이 정확한가
    2. 필수로 받아야 하는 데이터가 포함되어 있는가
    3. 데이터가 유효한 범위 내에 있는가
  • 이러한 검증 기준을 모두 키워드(keyword)를 이용해 직접 명시할 수 있다.
  • 검증 키워드
    • 데이터에 대한 정보를 나타내는 검증 키워드
      • type : 데이터의 타입
      • properties : 데이터 이름-값 쌍
      • required : 배열의 모든 요소를 프로퍼티로 가지고 있는지
      • minimum : 최솟값 이상의 숫자만
      • maximum : 최댓값 이하의 숫자만
      • multipleOf : 명시한 숫자의 배수만
      • maxLength : 명시한 최대길이 이하의 문자열만
      • minLength : 명시한 최소길이 이상의 문자열만
      • pattern : 명시한 정규 표현식
    • 스키마에 대한 정보를 나타내는 메타 데이터 키워드
      • title : 제목
      • description : 설명
      • default : 기본값
    • 예시
      {
          "title": "선재소프트 스키마",
          "description": "이 스키마는 선재소프트에 대한 데이터를 검증하기 위해 작성된 스키마이다.",
          "type": "object",
          "properties": {
                  "name": {"type": "string"},
                  "age": {"type": "integer"}
                  "team": {
                      "teamName": {"type": "string"},
                      "job": {"type": "string"}
                  }
          }
      }
      
  • 문자열 검증의 경우, pattern 키워드를 사용해 정규 표현식 검증을 할 수 있다.
    1개 이상의 영어 소문자인지 검증하는 예제
    
    {
        "type": "string",
        "pattern": "[a-z]+"
    }



스키마 결합

  • JSON 스키마에서 다음과 같은 키워드를 사용해 여러 스키마들을 결합할 수 있다.
    • allOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 검증을 모두 통과해야한다.
        해당 문자열의 데이터 길이가 3 이상 5 이하를 검사하는 예제
        
        {
            "allOf": [
                {"minLength": 3},
                {"maxLength": 5}
            ]
        }
        
    • anyOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 하나 이상의 검증을 통과해야 한다.
        해당 데이터가 문자열 혹은 숫자인지 검사하는 예제
        
        {
            "anyOf": [
                {"type": "string"},
                {"type": "number"}
            ]
        }
        
    • oneOf
      • 명시된 배열에 나열된 모든 JSON 스키마를 검사하며, 배열에 나열된 오직 하나의 검증을 통과해야 한다.
        해당 데이터가 숫자이면서 3의 배수이거나, 숫자이면서 4의 배수인지 검사하는 예제
        
        {
            "oneOf": [
                { "type": "number", "multipleOf": 3 },
                { "type": "number", "multipleOf": 4 }
            ]
        }
        
    • not
      • 명시된 스키마를 만족하지 않는 데이터만을 검사한다.
        해당 데이터가 문자가 아닌지 검사하는 예제
        
        {
            "not": {
                "type": "string"
            }
        }
        



Examples

  • Basic
    {
      "type": "object",
      "properties": {
        "street_address": { "type": "string" },
        "city":           { "type": "string" },
        "state":          { "type": "string" }
      },
      "required": ["street_address", "city", "state"]
    }
    
  • Product 스키마
    { 
      "name":"Product", 
      "properties": 
      { 
        "id": 
        { 
          "type":"number", 
          "description":"Product identifier", 
          "required":true 
        }, 
        "name": 
        { 
          "description":"Name of the product", 
          "type":"string", 
          "required":true 
        }, 
        "price": 
        { 
          "type":"number", 
          "minimum":0, 
          "required":true 
        }, 
        "tags": 
        { 
          "type":"array", 
          "items": 
          { 
            "type":"string" 
          } 
        } 
      } 
    }
    
  • allOf
    스키마 
    {
      "definitions": {
        "address": {
          "type": "object",
          "properties": {
            "street_address": { "type": "string" },
            "city":           { "type": "string" },
            "state":          { "type": "string" }
          },
          "required": ["street_address", "city", "state"]
        }
      },
    
      "allOf": [
        { "properties": {
            "type": { "enum": [ "residential", "business" ] }
          }
        }
      ]
    }
    
  • Data의 추가 및 삭제( Ubuntu 에서 JavaScript로 진행 )
    • test.js
      var movie = {
          "title": "Avengers - End game",
          "actor": [
              "Robert Downey Jr.",
              "Chris Evans",
              "Scarlett Johansson"],        
          "director": "Russo brother"
      }
      
      console.log( "###############################" );
      console.log( "START" );
      console.log( "###############################" );
      console.log( " " );
      
      console.log( "< object movie >" );
      console.log( movie );
      
      console.log( " " );
      console.log( "###############################" );
      console.log( "AVENGERS's 4th series!" );
      console.log( "###############################" );
      console.log( " " );
      console.log( "TITLE : " + movie.title );
      console.log( "ACTOR : " + movie.actor[0] );
      console.log( "        " + movie.actor[1] );
      console.log( "        " + movie.actor[2] );
      
      movie.actor[3] = "Jeremy Renner";
      
      console.log( "        " + movie.actor[3] );
      console.log( "DIRECTOR : " + movie.director );
      
      movie.year = 2019;
      
      console.log( "YEAR : " + movie.year );
      console.log( " " );
      console.log( "###############################" );
      console.log( " " );
      
      console.log( "< object movie >" );
      console.log( movie );
      
      console.log( " " );
      console.log( "###############################" );
      console.log( "FINISH" );
      console.log( "###############################" );
      
    • terminal
      [anbo@h JavaScript]$ node test.js
      ###############################
      START
      ###############################
      
      < object movie >
      { title: 'Avengers - End game',
        actor: [ 'Robert Downey Jr.', 'Chris Evans', 'Scarlett Johansson' ],
        director: 'Russo brother' }
      
      ###############################
      AVENGERS's 4th series!
      ###############################
      
      TITLE : Avengers - End game
      ACTOR : Robert Downey Jr.
              Chris Evans
              Scarlett Johansson
              Jeremy Renner
      DIRECTOR : Russo brother
      YEAR : 2019
      
      ###############################
      
      < object movie >
      { title: 'Avengers - End game',
        actor:
         [ 'Robert Downey Jr.',
           'Chris Evans',
           'Scarlett Johansson',
           'Jeremy Renner' ],
        director: 'Russo brother',
        year: 2019 }
      
      ###############################
      FINISH
      ###############################
      




'IT > ETC' 카테고리의 다른 글

[ETC] :: Spring Cloud 마이크로서비스 애플리케이션  (0) 2023.06.22
블로그 이미지

차트

소소한 일상 C코드 DB 항상 행복하게^-^★

,