스프링 에서 배우 기 - D 강좌 학습 노트

date: 2017 - 12 - 18 13: 28: 54 title: spring 에서 공부 - D 대 튜 토리 얼 학습 노트 description: swoft 처음부터 spring cloud 라 는 야심 이 있 었 습 니 다. 길이 막 히 고 길 었 지만 우 리 는 위아래 로 모색 해 야 합 니 다.
spring -> spring boot -> spring cloud
spring project: https://github.com/spring-projects spring 튜 토리 얼:https://github.com/dyc87112
swoft 개원 프로젝트 의 개발 에 참여 하고 개발 팀 의 기술 선택 에 있어 spring 의 디자인 을 선 호 하 는 경향 이 있 습 니 다. 저 는 아직 약 하기 때문에 이 편 을 열 어 보충 을 했 습 니 다. 아마도 자신 에 게 커 다란 구 덩이 를 팠 을 것 입 니 다. 그러나 저 는 낙 천 파 - 만수 천 산 은 한가 할 뿐 입 니 다. 오늘 을 보 세 요.
시리즈 튜 토리 얼 작성 안내: 테마 설명 - > 코드 예제 + 유닛 테스트
spring boot
Spring - Boot 기초 강좌
가장 핵심 적 인 두 가지 요소: 주입 DI + 절단면 프로 그래 밍 AOP 에 의존
  • 류 - > bean;설정 - > 클래스 정의 / 클래스 속성
  • 템 플 릿 엔진: 정적 자원 위치 속성 (데이터) 분석 기본 매개 변수 설정
  • apidoc - swagger
  • 기본 오류 페이지: 이상 처리 + error page / json
  • 통일
  • security 보안 제어: AOP / 차단기 에 로그 인 할 지 여부
  • 데이터베이스 접근: JdbcTemplate
  • Spring - data - jpa: Hibernate Entity - > Repository 서로 다른 DB 연결
  • spring - data - redis: 저장 대상 + 대상 직렬 화 인터페이스
  • spring - data - mongodb: Entity - > Repository 설정 - > 연결 풀
  • mybatis-spring-boot-starter: Entity->Mapper
  • Flyway: 데이터베이스 버 전 관리 migration
  • spring - data - ldap: 경량급 디 렉 터 리 접근 프로 토 콜 - > 사용자 관리 시스템
  • cache: cache vs buffer; SpEL CacheManager 캐 시 수명 주기 제어
  • log: logger (commonLogging log4j logback) logFormat (시간 / 밀리초 로그 단계 / 다 중 환경 / 동적 수정 프로 세 스 id 구분자 logger 이름 로그 내용) logTarget (console / 다채로운 file - 분류 출력 / 패키지 mongo)
  • AOP: 로그 절단면 동기 화 문제 / 함수 실행 시간 기록 / thread Local 우선 순위 문제 / 같은 접점 여러 절단면
  • mq: sender - > 대기 열 / 교환기 / 경로 - > receiver
  • task: 동기 화 비동기 / 비동기 리 셋 스 레 드 탱크 우아 하 게 닫 기 (부 드 럽 게 재 부팅) Future - > Runnable / Callable - > 작업 취소 / 완료 / 결과 획득 여부 - > 차단
  • 메 일: 첨부 파일 정적 자원 템 플 릿
  • Actuator: 응용 설정 (설정 리 셋) 도량 지표 조작 제어
  • cli StateMachine(state->event)
  • //         
    @Value("${com.didispace.blog.name}")
    private String name;
    
    // web
    @RestController() //     @ResponseBody
    @Controller()
    @ResponseBody()
    @RequestMapping()
    @PathVariable
    @RequestParam
    @ModelAttribute
    
    // Swagger2
    @ApiOperation(value="        ", notes="  url id       ,       user           ")
    @ApiImplicitParams({
        @ApiImplicitParam(name = "id", value = "  ID", required = true, dataType = "Long"),
        @ApiImplicitParam(name = "user", value = "      user", required = true, dataType = "User")
    })
    
    // Spring-data-jpa
    @Query("from User u where u.name=:name")
    User findUser(@Param("name") String name);
    
    // mybatis-spring-boot-starter
    @Select("SELECT * FROM USER WHERE NAME = #{name}")
    User findByName(@Param("name") String name);
    @Insert("INSERT INTO USER(NAME, AGE) VALUES(#{name}, #{age})")
    int insert(@Param("name") String name, @Param("age") Integer age);
    
    //      
    @Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)
    @Rollback
    
    @EnableCaching // application
    @Cacheable // repository
    @CachePut //     
    
    // task
    @EnableScheduling
    @Scheduled(fixedRate = 5000) // 5s
    @Scheduled(fixedDelay = 5000)
    @Scheduled(initialDelay=1000, fixedRate=5000)
    @Scheduled(cron="*/5 * * * * *")
    @EnableAsync
    @Async
    
    //          
    while(true) {
        if(task1.isDone() && task2.isDone() && task3.isDone()) {
            //          ,      
            break;
        }
        Thread.sleep(1000);
    }
    
    // task    
    @Async("taskExecutor")
    @Bean("taskExecutor")
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(10);
        executor.setMaxPoolSize(20);
        executor.setQueueCapacity(200);
        executor.setKeepAliveSeconds(60);
        executor.setThreadNamePrefix("taskExecutor-");
        executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
        //     
        executor.setWaitForTasksToCompleteOnShutdown(true);
        executor.setAwaitTerminationSeconds(60);
        return executor;
    }
    
    @Test
    
    #     
    com.didispace.blog.desc=${com.didispace.blog.name}     《${com.didispace.blog.title}》
    #    
    com.didispace.blog.value=${random.value}
    
    #        
    java -jar xxx.jar --server.port=8888
    
    #    
    spring.profiles.active=test
    application-dev.properties # dev/test/prod
    
    #   
    /autoconfig //     
    /beans
    /configprops
    /env
    /mappings
    /info
    /metrics //     
    /health
    /dump
    /trace
    /shutdown //     
    

    메시지 큐 MQ
    message broker:
  • 정보 루트 n 개 목적지
  • 소식 이 다른 형식 으로 바 뀌 었 다
  • 메시지 모 으 기 / 분해 - > 목적지 - > 재조합 상응 반환
  • 웹 서비스 검색 데이터 호출
  • 응답 이벤트 / 오류
  • pub / sub 또는 topic 의 메시지 경로
  • AMQP:
  • 메시지 방향
  • 메시지 큐
  • 메시지 경로 (p2p pub / sub)
  • 신뢰성
  • 안전성
  • 상태 기
  • 상태 / 사건 매 거 진
  • 상태 기: 모든 상태 + 초기 상태
  • 상태 기: 상태 이동 동작
  • 상태 기: 모니터
  • spring cloud
    Spring - Cloud 기초 튜 토리 얼
    고가 용: 다 중 노드 / 선행 LB / 서비스 로 등록
  • 공유 자원 의 상호 배척 방문 - > 분포 식 잠 금 (전역 잠 금) - > redis 기반 Zookeeper 기반 Consul 기반 KV 저장 소 분포 식 잠 금 / 신 호 량 - > 잠 금 시간 초과 청소 (시간 초과)
  • 동시 다발 스 레 드 / 프로 세 스 수량 (동시 다발 제어) 제한 - > 신 호 량 - > Zuul 기본 상황 사용 신 호 량 제한 각 경로 의 동시 다발 수 Consul 분포 식 신 호 량 실현 - > PV 작업
  • 서비스 등록 발견: Eureka Consul 서비스 등록 센터 (server) + 서비스 제공 자 (client 서비스 목록 - > 캐 시) + 서비스 소비자 (consumer 클 라 이언 트 부하 균형)
  • 서비스 소비자: loadBalancer Client Ribbon 폴 링 서비스 단 열 은 부하 균형
  • 을 나타 낸다.
  • 서비스 소비 도구 SC Feign: 성명 식 서 비 스 는 클 라 이언 트 가 삽입 할 수 있 는 주 해 를 호출 하여 삽입 할 수 있 는 인 코더 와 디코더 가 Hystrix 를 통합 하여 서비스의 용 착 보 호 를 실현 하고 Feign 의 확장 패 키 지 를 도입 하여 파일 업로드
  • 를 실현 합 니 다.
  • 분산 설정 센터 SC Config: 서버 / 클 라 이언 트 독립 마이크로 서비스 응용 설정 정보 / 복호화 정보 (dev - > devops 민감 정보) 기본 값 은 git 로 설정 정보 설정 git. username / git. password - > http 에 접근 할 수 있 습 니 다 설정 새로 고침 - > 클 라 이언 트 액 추 에이 터 모듈 요청
  • 서비스 보호 메커니즘 SC Hystrix: 서비스 강등 fallback 서비스 퓨즈 / 차단기 / 스냅숏 시간 창 / 요청 총수 하한 선 / 오류 백분율 하한 선 격 리 / 모든 의존 서비스 에 하나의 스 레 드 풀 신 호 량 을 할당 / 지연 이 낮 음 / 시간 초과 및 비동기 접근 요청 캐 시 설정 불가 통합 서비스 모니터링 모니터링 패 널 / turbine (메시지 취 합 http / mq)
  • 서비스 게 이 트 웨 이 SC Zuul: 대외 제공 서비스 / 서비스 경로 / LB / 권한 제어 / 요청 흐름 제한 (필터 ZuulFilter) 등록 센터 - > 서비스 목록 - > 맵 사용 Swagger 어 셈 블 리 API 인터페이스 문서 처리 쿠키 / 리 셋 / 이상 처리
  • 메시지 구동 SC Stream: RabbitMQ / Kafka pub / sub - 소비 팀 (메시지 중복 소비 방지) - 메시지 구역 (메시지 방향 배달, 예 를 들 어 모니터링 정보 집합) app - > channel - > binder (바 인 딩 기 미들웨어 디 테 일 숨 기기, 노출 채널 app) - > Middleware (mq 미들웨어)
  • 분포 식 서비스 추적 SC Sleuth: 전체 링크 호출 추적 / 오류 원인 신속 발견 / 모니터링 분석 성능 병목 요청 링크 TraceID 기본 작업 유닛 SpanID - > 샘플링 Sampler logstash (ELK) 로그 수집
  • 분산 서비스 추적 통합 Zipkin: 수집 기 collector 저장 모듈 Storage Api 구성 요소 WebUI http / mq 방식 수집
  • // mq
    @StreamListener(Sink.INPUT)
    @Input(Sink.INPUT)
    SubscribableChannel input();
    
    //       
    @Component
    
    spring.application.name=trace-1
    server.port=9101
    
    #       
    eureka.client.serviceUrl.defaultZone=http://eureka.didispace.com/eureka/
    
    #      
    ribbon.eager-load.enabled=true
    ribbon.eager-load.clients=hello-service, user-service
    
    # mq   
    spring.cloud.stream.bindings.input.group=Service-A #   
    spring.cloud.stream.bindings.input.destination=greetings
    spring.cloud.stream.bindings.input.consumer.partitioned=true #   
    spring.cloud.stream.instanceCount=2
    spring.cloud.stream.instanceIndex=0
    
    # mq   
    spring.cloud.stream.bindings.output.destination=greetings #   
    spring.cloud.stream.bindings.output.producer.partitionKeyExpression=payload #   
    spring.cloud.stream.bindings.output.producer.partitionCount=2
    
    #     
    server.port=0 # spring       
    eureka.instance.instance-id=${spring.application.name}:${random.int}
    server.port=${random.int[10000,19999]} #      random   
    

    마지막 에 쓰다
    이 학 과 는 D 대 블 로그 튜 토리 얼 을 읽 고 필 기 를 모 아 만 들 었 습 니 다. D 대 공유 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기